mysql5.6 函数索引_聊聊MySQL中的索引
關(guān)于MySQL中的索引使用
索引是數(shù)據(jù)庫優(yōu)化中最常用也是最重要的手段之一,通過索引通??梢詭椭脩艚鉀Q大多數(shù)的SQL性能問題。
索引的存儲分類:
1、B-Tree索引:最常見的索引類型,大部分引擎都支持B樹引擎
2、HASH索引:只有Memory引擎支持,使用場景簡單
3、R-Tree索引(空間索引):MyISAM的一個(gè)特殊索引類型,主要用于地理看見數(shù)據(jù)類型,通常使用較少。
4、Full-text(全文索引):MyISAM的一個(gè)特殊索引類型,主要用于全文索引,InnoDB從MySQL5.6版本開始提供對全文索引的支持。
MySQL目前不支持函數(shù)索引,但是能對列的前面某一部分進(jìn)行索引。這個(gè)特性可以大大縮小索引文件的大小,但前綴索引也有缺點(diǎn),在排序Order By和分組Group By操作的時(shí)候無法使用。
create index idx_title on film(title(10));
MyISAM、InnoDB、Memory三個(gè)常見引擎支持的索引類型比較:
索引
MyISAM引擎
InnoDB引擎
Memory引擎
B-Tree索引
支持
支持
支持
HASH索引
不支持
不支持
支持
Full-text索引
支持
5.6版本開始支持
不支持
R-Tree索引
支持
不支持
不支持
比較常用到的索引就是B-Tree索引和Hash索引。Hash索引相對簡單,只有Memory/Heap引擎支持Hash索引。Hash索引適用于Key-Value查詢,通過Hash索引要比通過B-Tree索引查詢更迅速;Hash索引不適用范圍查詢,例如、<=、>=這類操作。如果使用Memory/Heap引擎并且where條件中不使用“=”進(jìn)行索引列,那么不會(huì)用到索引。Memory/Heap引擎只有在“=”的條件下才會(huì)使用索引。
B-Tree索引是最常見的索引,構(gòu)造類似二叉樹,能根據(jù)鍵值提供一行或者一個(gè)行集的快速訪問,通常只需要很少的讀操作就可以找到正確的行。不過,需要注意B-Tree索引中的B 不代表二叉樹(binary),而是代表平衡樹(balanced)。B-Tree索引并不是一棵二叉樹。
MySQL中可以使用索引的常見場景:
1、匹配全值(match the all value),即where field = '**'
2、匹配值的范圍(match the range),即where field (>=)
3、匹配最左前綴(Match a leftmost prefix) ,僅僅使用索引中的最左邊列進(jìn)行查找,比如在 col1 + col2 + col3 字段上的聯(lián)合索引能夠被包含 col1、(col1 + col2)、(col1 + col2 + col3)的等值查詢利用到,可是不能夠被 col2、(col2 + col3)的等值查詢利用到。最左匹配原則可以算是MySQL中B-Tree索引使用的首要原則。
4、僅僅對索引進(jìn)行查詢(Index only query),當(dāng)查詢的列都在索引的字段中時(shí),查詢的效率更高
5、匹配列前綴(Match a column prefix),僅僅使用索引中的第一列,并且只包含索引第一列的開頭一部分進(jìn)行查找。
6、能夠?qū)崿F(xiàn)索引匹配部分精確而其他部分進(jìn)行范圍匹配(Match one part exactly and match a range on another part) 。
7、如果列名是索引,那么使用 column_name is null就會(huì)使用索引。
存在索引但是不能使用索引的常見場景:
1、以%開頭的LIKE查詢不能夠利用B-Tree索引,執(zhí)行計(jì)劃中key的值為NULL表示沒有使用索引。一般都推薦使用全文索引(Fulltext)來解決類似的全文檢索問題?;蛘呖紤]利用 InnoDB 的表都是聚簇表的特點(diǎn),采取一種輕量級別的解決方式:一般情況下,索引都會(huì)比表小,掃描索引要比掃描表更快(某些特殊情況下,索引比表更大,不在本例討論范圍內(nèi)),而InnoDB表上二級索引idx_last_name實(shí)際上存儲字段last_name還有主鍵actor_id,那么理想的訪問方式應(yīng)該是首先掃描二級索引 idx_last_name獲得滿足條件 last_name like '%NI%'的主鍵 actor_id列表,之后根據(jù)主鍵回表去檢索記錄,這樣訪問避開了全表掃描演員表actor產(chǎn)生的大量IO請求。
2、數(shù)據(jù)類型出現(xiàn)隱式轉(zhuǎn)換的時(shí)候也不會(huì)使用索引,特別是當(dāng)列類型是字符串,那么一定記得在 where 條件中把字符常量值用引號引起來,否則即便這個(gè)列上有索引,MySQL 也不會(huì)用到,因?yàn)镸ySQL默認(rèn)把輸入的常量值進(jìn)行轉(zhuǎn)換以后才進(jìn)行檢索。例如,演員表actor中的姓氏字段last_name是字符型的,但是SQL語句中的條件值1是一個(gè)數(shù)值型值,因此即便存在索引idx_last_name,MySQL也不能正確地用上索引,而是繼續(xù)進(jìn)行全表掃描。
3、復(fù)合索引的情況下,假如查詢條件不包含索引列最左邊部分,即不滿足最左原則Leftmost,是不會(huì)使用復(fù)合索引的。
4、如果 MySQL 估計(jì)使用索引比全表掃描更慢,則不使用索引。
5、用or分割開的條件,如果or前的條件中的列有索引,而后面的列中沒有索引,那么涉及的索引都不會(huì)被用到
總結(jié)
以上是生活随笔為你收集整理的mysql5.6 函数索引_聊聊MySQL中的索引的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql讀取sql_SQL 2008连
- 下一篇: mysql数据库帐户_MySQL数据库用