日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

mysql5.6 函数索引_聊聊MySQL中的索引

發(fā)布時間:2025/4/17 数据库 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql5.6 函数索引_聊聊MySQL中的索引 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

關(guān)于MySQL中的索引使用

索引是數(shù)據(jù)庫優(yōu)化中最常用也是最重要的手段之一,通過索引通常可以幫助用戶解決大多數(shù)的SQL性能問題。

索引的存儲分類:

1、B-Tree索引:最常見的索引類型,大部分引擎都支持B樹引擎

2、HASH索引:只有Memory引擎支持,使用場景簡單

3、R-Tree索引(空間索引):MyISAM的一個特殊索引類型,主要用于地理看見數(shù)據(jù)類型,通常使用較少。

4、Full-text(全文索引):MyISAM的一個特殊索引類型,主要用于全文索引,InnoDB從MySQL5.6版本開始提供對全文索引的支持。

MySQL目前不支持函數(shù)索引,但是能對列的前面某一部分進(jìn)行索引。這個特性可以大大縮小索引文件的大小,但前綴索引也有缺點,在排序Order By和分組Group By操作的時候無法使用。

create index idx_title on film(title(10));

MyISAM、InnoDB、Memory三個常見引擎支持的索引類型比較:

索引

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)行索引列,那么不會用到索引。Memory/Heap引擎只有在“=”的條件下才會使用索引。

B-Tree索引是最常見的索引,構(gòu)造類似二叉樹,能根據(jù)鍵值提供一行或者一個行集的快速訪問,通常只需要很少的讀操作就可以找到正確的行。不過,需要注意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)查詢的列都在索引的字段中時,查詢的效率更高

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就會使用索引。

存在索引但是不能使用索引的常見場景:

1、以%開頭的LIKE查詢不能夠利用B-Tree索引,執(zhí)行計劃中key的值為NULL表示沒有使用索引。一般都推薦使用全文索引(Fulltext)來解決類似的全文檢索問題。或者考慮利用 InnoDB 的表都是聚簇表的特點,采取一種輕量級別的解決方式:一般情況下,索引都會比表小,掃描索引要比掃描表更快(某些特殊情況下,索引比表更大,不在本例討論范圍內(nèi)),而InnoDB表上二級索引idx_last_name實際上存儲字段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)換的時候也不會使用索引,特別是當(dāng)列類型是字符串,那么一定記得在 where 條件中把字符常量值用引號引起來,否則即便這個列上有索引,MySQL 也不會用到,因為MySQL默認(rèn)把輸入的常量值進(jìn)行轉(zhuǎn)換以后才進(jìn)行檢索。例如,演員表actor中的姓氏字段last_name是字符型的,但是SQL語句中的條件值1是一個數(shù)值型值,因此即便存在索引idx_last_name,MySQL也不能正確地用上索引,而是繼續(xù)進(jìn)行全表掃描。

3、復(fù)合索引的情況下,假如查詢條件不包含索引列最左邊部分,即不滿足最左原則Leftmost,是不會使用復(fù)合索引的。

4、如果 MySQL 估計使用索引比全表掃描更慢,則不使用索引。

5、用or分割開的條件,如果or前的條件中的列有索引,而后面的列中沒有索引,那么涉及的索引都不會被用到

總結(jié)

以上是生活随笔為你收集整理的mysql5.6 函数索引_聊聊MySQL中的索引的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。