1. 程式人生 > 實用技巧 >jsoncpp使用小結【轉】

jsoncpp使用小結【轉】

一為什麼要用索引

在資料庫中,索引是對錶中一列或多列的值進行排序的一種儲蓄結構,他是表中一列或多列的值的集合,而且其中包含了對應表中記錄的指標相當於圖書的目錄,可以根據目錄的頁碼快速找到所需的內容。

索引需要注意

我們需要注意的是索引也是表的一部分,如果建立太多的話會影響查詢和更新的速度,因為他需要同樣更新每個索引的檔案,對於一些資料量小的,就沒有必要建立索引

二 建立索引

1單列索引

1-1) 普通 索引(最基本的索引)

建表時: INDEX indexName(欄位名(lenght))

建表後 CREATE INDEX IndexName ON TableName(欄位名(length))

或ALTER TABLE TableName ADD INDEX IndexName(欄位名(length)

注意:如果欄位資料是CHAR,VARCHAR型別,可以指定length,其值小於欄位的實際長度,如果是BLOB和TEXT型別就必須指定length。

這個length的用處是什麼?

有時候需要在長文字欄位上建立索引,但這種索引會增加索引的儲存空間以及降低索引的效率,這時就可以用到length,建立索引時用到length的索引,我們叫做字首索引,字首索引是選擇欄位資料的前n個字元作為索引,這樣可以大大節約索引空間,從而提高索引效率。

1-2) 唯一索引,要求欄位所有的值是唯一的,這一點和主鍵索引一樣,但是允許有空值。

建表時:UNIQUE INDEX IndexName(欄位名(length))

建表後:CREATE UNIQUE INDEX IndexName ON TableName(欄位名(length))

或ALTER TABLE TableName ADD UNIQUE INDEX IndexName(欄位名(length))

1-3) 主鍵索引,不允許有空值

一般在建表的時候自動建立,主鍵一般會設為 int 而且是 AUTO_INCREMENT自增型別的

2.組合索引

假設欄位a,b都有索引,我們的查詢條件是a=1,b=2查詢過程是mysql會先挑選出符合a=1的結果集,再在這些結果集中挑選b=2的結果集,但是mysql並不會在查詢a,b時都用到索引,只會用其中一個,這和我們的預期不一樣,所以,我們要使用組合索引

建表時:INDEX IndexName(欄位名(length),欄位名(length),........)

建表後:CREATE INDEX IndexName ON TableName(欄位名(length),欄位名(length),........)

或ALTER TABLE TableName ADD INDEX IndexName(欄位名(length),欄位名(length),........)

(二)索引的刪除

DORP INDEX IndexName ON TableName

(三)索引失效的情況

如果條件中有or,即使其中有條件帶索引也不會使用(這也是為什麼儘量少用or的原因)

1.要想使用or,又想讓索引生效,只能將or條件中的每個列都加上索引

2.使用查詢的時候遵循mysql組合索引的"最左字首"規則,假設現在有組合索引(a,b,c),查詢語句就只能是a=1或a=1

and b=1或a=1 and b=1 and c=1。這裡有兩點需要注意①a=1 and b=1和b=1 and a=1一樣,沒有區別,都會使用索引②組合索引(a,b,c)的最左字首是a;組合索引(c,b,a)的最左字首是c,最左字首和表字段順序無關

在組合索引中,如果where查詢條件中某個列使用了範圍查詢(不管%在哪),則其右邊的所有列都無法使用索引優化查詢

3.like查詢以%開頭

4.如果列型別是字串,那一定要在條件中將資料使用引號引用起來,否則不使用索引

5.如果mysql估計使用全表掃描要比使用索引快,則不使用索引

6.索引列不能是表示式的一部分,也不能作為函式的引數,否則無法使用索引查詢**

三索引的資料結構

B+樹

B+樹的定義

B+樹是B樹的一種變形,它更適合實際應用中作業系統的檔案索引和資料庫索引。定義如下:(為和大多資料保持一致,這裡使用階數m mm來定義B+樹,而不像之前的B樹中,使用的是最小度t tt來定義)

  1. 除根節點外的內部節點,每個節點最多有m mm個關鍵字,最少有⌈ m 2 ⌉ \lceil \frac{m}{2} \rceil⌈2m⌉個關鍵字。其中每個關鍵字對應一個子樹(也就是最多有m mm棵子樹,最少有⌈ m 2 ⌉ \lceil \frac{m}{2} \rceil⌈2m⌉棵子樹);
  2. 根節點要麼沒有子樹,要麼至少有2棵子樹;
  3. 所有的葉子節點包含了全部的關鍵字以及這些關鍵字指向檔案的指標,並且:
  • 所有葉子節點中的關鍵字按大小順序排列
  • 相鄰的葉子節點順序連結(相當於是構成了一個順序連結串列)
  • 所有葉子節點在同一層

所有分支節點的關鍵字都是對應子樹中關鍵字的最大值