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