1. 程式人生 > >MySql B+樹索引

MySql B+樹索引

資料庫索引的資料結構:

採用的是B+Tree

檔案系統採用的是B-Tree

為什麼採用B+Tree

一般來說,索引本身也很大,不可能全部儲存在記憶體中,因此索引往往以索引檔案的形式儲存在磁碟上。這樣的話,索引查詢過程中就要產生磁碟I/O的消耗,所以評價一個索引的優劣的重要指標就是I/O的操作次數。

I/O的操作次數與數的高度有關。數的高度O(h)=O(logdN)。由此可見d越大索引的效能就越好。相對於B-Tree而言,B+Tree內節點去掉了data域,因此可以擁有更大出度,故使用B+Tree。

MySQL索引實現

MySQL中,索引屬於儲存引擎級別的概念,不同的儲存索引對索引的實現方式是不同的。

MyISAM索引實現

MyISAM引擎使用B+Tree作為索引結構,葉節點的data域存放的是資料記錄的地址。


l  MyISAM的索引檔案僅僅儲存資料記錄的地址。在MyISAM中,主索引和輔助索引在結構上沒有區別。

l  MyISAM的索引方式也叫做“非聚集”的,之所以這麼稱呼是為了與InnoDB的聚集索引區分。

InnoDB索引實現

InnoDB也使用B+Tree作為索引結構,但具體實現方式卻與MyISAM截然不同


1)        MyISAM索引檔案和資料檔案是分離的,索引檔案僅儲存資料記錄的地址。

InnoDB的資料檔案本身就是索引檔案,即資料檔案本身就是按B+Tree組織的一個索引結構,葉子節點data儲存了完整的資料記錄。

2)        InnoDB的輔助索引data域儲存相應記錄主鍵的值而不是地址。


聚集索引這種實現方式使得按主鍵的搜尋十分高效,但是輔助索引搜尋需要檢索兩遍索引:首先檢索輔助索引獲得主鍵,然後用主鍵到主索引中檢索獲得記錄。

MySQL效能優化最佳實踐

1)        為查詢快取優化查詢:即才有SQL模板,通過引數傳遞條件。


2)        當只要一行資料時使用LIMIT 1:MySQL資料庫引擎會在找到一條資料後停止搜尋,而不是繼續往後查少下一條符合記錄的資料


3)        使用EXPLINE關鍵字檢視SQL語句

4)        為索引欄位建索引:如果在表中,有某個欄位你總要會經常用來做搜尋,那麼,為其建立索引。

5)        不使用ORDER BY RAND():

打亂返回的資料行?隨機挑一個數據


6)        避免使用SELECT *:

從資料庫裡讀出越多的資料,那麼查詢就會變得越慢。並且,如果你的資料庫伺服器和WEB伺服器是兩臺獨立的伺服器的話,這還會增加網路傳輸的負載。

即:需要什麼取什麼。

7)        拆分大的DELETE或INSERT語句:

8)        選擇正確的儲存索引:

在 MySQL 中有兩個儲存引擎 MyISAM 和 InnoDB,每個引擎都有利有弊。

MyISAM:適合於一些需要大量查詢的應用,但其對於有大量寫操作並不是很好。

InnoDB:寫操作比較優秀,他支援“行鎖”,並支援事務。

9)        對索引的優化

a)        越小的資料型別通常更好:越小的資料型別通常在磁碟、記憶體和CPU快取中都需要更少的空間,處理起來更快。

b)        簡單的資料型別更好:整型資料比起字元,處理開銷更小,因為字串的比較更復雜。

c)        儘量避免NULL:應該指定列為NOT NULL,除非你想儲存NULL。在MySQL中,含有空值的列很難進行查詢優化,因為它們使得索引、索引的統計資訊以及比較運算更加複雜。應該用0、一個特殊的值或者一個空串代替空值。

引自:http://blog.csdn.net/dfsaggsd/article/details/50563878