1. 為什麼使用索引
在無索引的情況下,mysql會掃瞄整張表來查詢符合sql條件的記錄,其時間開銷與表中資料量呈正相關。對關係型資料表中的某些欄位建索引可以極大提高查詢速度(當然,不同字段是否selective會導致這些字段建立的索引對查詢速度的提公升幅度不同,而且索引也並非越多越好,因為寫入或刪除時需要更新索引資訊)。
對於mysql的innodb儲存引擎來說,大部分型別的index均以b-tree資料結構的變種b+tree來儲存(memory型別的表還支援hash型別的索引)。b-tree是資料庫或檔案系統中常用的一種資料結構,它是一種n叉平衡樹,這種樹結構保證了同層節點儲存的key有序,對於某個節點來說,其左子樹儲存的所有key均小於該節點儲存的key,其右子樹儲存的所有key均大於該節點儲存的key。此外,在工程實現上,還結合作業系統的區域性性原理做了很多優化,總之,b-tree的各種特性或優化技巧能保證:1) 查詢磁碟記錄時,讀盤次數最少;2) 任何insert和delete操作對樹結構的影響均很小;3) 樹本身的rebalance操作很高效。
2. mysql使用索引的場景
mysql在以下操作場景下會使用索引:
1) 快速查詢符合where條件的記錄
2) 快速確定候選集。若where條件使用了多個索引字段,則mysql會優先使用能使候選記錄集規模最小的那個索引,以便盡快淘汰不符合條件的記錄。
3) 如果表中存在幾個字段構成的聯合索引,則查詢記錄時,這個聯合索引的最左字首匹配欄位也會被自動作為索引來加速查詢。
例如,若為某錶建立了3個字段(c1, c2, c3)構成的聯合索引,則(c1), (c1, c2), (c1, c2, c3)均會作為索引,(c2, c3)就不會被作為索引,而(c1, c3)其實只利用到c1索引。
4) 多表做join操作時會使用索引(如果參與join的字段在這些表中均建立了索引的話)
5) 若某字段已建立索引,求該字段的min()或max()時,mysql會使用索引
6) 對建立了索引的字段做sort或group操作時,mysql會使用索引
3. 哪些sql語句會真正利用索引
從mysql官網文件"comparison of b-tree and hash indexes"可知,下面這些型別的sql可能會真正用到索引:
1) b-tree可被用於sql中對列做比較的表示式,如=, >, >=, <, <=及between操作
2) 若like語句的條件是不以萬用字元開頭的常量串,mysql也會使用索引
比如,select * from tbl_name where key_col like 'patrick%'或select * from tbl_name where key_col like 'pat%_ck%'可以利用索引,而select * from tbl_name where key_col like '%patrick%'(以萬用字元開頭)和select * from tbl_name where key_col like other_col(like條件不是常量串)無法利用索引。
對於形如like '%string%'的sql語句,若萬用字元後面的string長度大於3,則mysql會利用turbo boyer-moore algorithm演算法進行查詢。
3) 若已對名為col_name的列建了索引,則形如"col_name is null"的sql會用到索引
4) 對於聯合索引,sql條件中的最左字首匹配欄位會用到索引,示例請參考本文第2節第3條對聯合索引的說明
5) 若sql語句中的where條件不只1個條件,則mysql會進行index merge優化來縮小候選集範圍
mysql索引簡介,及失效場景介紹
mysql索引的概念 索引是一種特殊的檔案 innodb資料表上的索引是表空間的乙個組成部分 它們包含著對資料表裡所有記錄的引用指標。更通俗的說,資料庫索引好比是一本書前面的目錄,能加快資料庫的查詢速度。索引的分類 注意 索引是在儲存引擎中實現的,也就是說不同的儲存引擎,會使用不同的索引 myisa...
mysql 索引失效場景 Mysql 索引失效場景
例如 一張user表 有欄位屬性 name,age 其中name為索引 下面列舉幾個索引失效的情況 1.select from user where name xzz or age 16 例如這種情況 當語句中帶有or的時候 即使有索引也會失效。2.select from user where na...
Mysql 索引失效場景
例如 一張user表 有欄位屬性 name,age 其中name為索引 下面列舉幾個索引失效的情況 1.select from user where name xzz or age 16 例如這種情況 當語句中帶有or的時候 即使有索引也會失效。2.select from user where na...