為資料表增加索引(index)可以提公升mysql資料查詢效率。mysql中所有型別的資料字段都可以有索引。索引指向了資料表中的記錄(行),可以快速判斷某行記錄是否符合 where 語句中的限定條件。
但是索引並不是越多越好:
索引需要耗費儲存空間;
索引越多,mysql在決定採用哪個索引時也會消耗更多時間;
資料的 增、刪、改 都會引起索引的維護操作;
如果總共就
一、二千條資料,或目標列的查詢使用率很低,或重複索引值佔比過高,就沒必要建立索引。
mysql中的索引結構
b+tree
myisam 和 innodb 都使用了 b+tree 作為索引的資料結構。
(空間索引 spatial index 使用了 rtree)
b+tree 是一種特殊的樹形資料結構。
與 b-tree 相比,b+tree 的內部節點沒有指向data的指標,關鍵字儲存更緊湊。所以關鍵字在磁碟與記憶體之間傳輸時所需讀寫次數更少。
myisam:
myisam 儲存引擎中,葉節點 data 域存放的是資料記錄的位址。索引檔案和資料檔案是分開的。按索引檢索時,先找到索引,獲得data域中的資料記錄位址,再訪問相應的資料記錄。
myisam 中的輔助索引(secondary index)與主索引結構相同。區別是輔助索引的key可以重複。
innodb:
innodb 儲存引擎中,資料檔案本身就是索引檔案,葉節點的data域儲存了完整的資料記錄。
=> 如果主鍵不是單調字段,insert 操作可能會導致為了維護b+tree而頻繁調整資料檔案。
但是,選取具有實際業務意義的字段作為主鍵是正確的做法。不要為了單方面的效能而選擇乙個毫無意義的自增主鍵。從業務整體考慮效能優化更有意義。
innodb 的table中都有主鍵。如果沒有顯式指定主鍵,mysql會為其生成乙個隱含的字段作為主鍵。
innodb 中輔助索引與主索引結構相同,但其data域存的是主鍵。按輔助索引檢索是,先找到輔助索引,獲得data域中的主鍵,再按主索引找到資料記錄。
=> 主鍵字段內容過長會顯著增加輔助索引的儲存空間消耗。
b+tree 與 b-tree 示例:
hash index
hash index 是一種常見的索引實現方式。mysql只將其作為輔助性的索引,因為它不能很好地滿足 mysql 的需求:
hash index 不支援通過比較操作(大於、小於)查詢符合某個取值範圍的資料。
hash index 只用於「等於(=)」操作。它很適合「key-value」形式的資料儲存結構。
如果有這方面的需求,也許redis是乙個不錯的選擇。
hash index 無法加速 order by 操作。
因為不支援查詢「下一條」有序的資料。
hash index 不支援針對取值範圍的資料量評估。mysql需要評估滿足取值範圍的資料條數,以此決定使用哪個索引。
hash index 只支援整個 key 比對。btree index 支援最左部分匹配:只指定索引最左側部分列也能使用多列索引。
網上有很多關於mysql索引資料結構和演算法的詳細介紹。那些詳細深入資料結構的原理知識可以幫助我們更好地理解mysql的行為特性,明白那些「最佳實踐」背後的原因,進而減少「死記硬背」式的學習過程。其實一名合格的dba不需要知道這些艱澀的資料結構與演算法。能熟讀官網上的使用手冊,水平就非常不錯了(能靈活運用是另一碼事)。就好比修車人員不需要知道發動機的設計和製造工序。這遠超上層業務應用開發人員的必要水平。當然,如果是為了應付面試,那情況又不同了。「面試造火箭,實際工作工作搬磚」的情況是普遍現象。在很大程度上,這些艱澀知識起到的主要作用是試探應聘者綜合基礎能力/潛力。
mysql not 索引 Mysql索引
什麼是索引?索引其實是一種資料結構,能夠幫助我們快速的檢索資料庫中的資料。mysql中有哪幾種索引?有hash索引和b tree索引,innodb引擎預設的是b 樹。hash索引和b tree索引有什麼優缺點?hash索引底層是雜湊表,雜湊表是一種以key value儲存資料的結構,適合等值查詢,無...
mysql 索引 手冊 MySQL 索引
mysql 索引 mysql索引的建立對於mysql的高效執行是很重要的,索引可以大大提高mysql的檢索速度。打個比方,如果合理的設計且使用索引的mysql是一輛蘭博基尼的話,那麼沒有設計和使用索引的mysql就是乙個人力三輪車。索引分單列索引和組合索引。單列索引,即乙個索引只包含單個列,乙個表可...
mysql非同步索引 MySQL索引
一 為什麼要使用索引 優化查詢,減少掃瞄的錶行數。打個比方,索引的作用就和查新華字典,字典的索引的作用的一樣的。二 索引的型別 1 索引是在儲存引擎中實現的,而不是在伺服器層中實現的。所以,每種儲存引擎的索引都不一定完全相同,並不是所有的儲存引擎都支援所有的索引型別。2 如果使用的是組合索引 即有多...