??專欄【MySQL】
??喜歡的詩句:更喜岷山千里雪 三軍過后盡開顏。
??音樂分享【The Right Path】
??歡迎并且感謝大家指出小吉的問題

??索引的使用
?驗證索引效率
??沒有創(chuàng)建索引時,執(zhí)行SQL語句,查看SQL的耗時
??創(chuàng)建索引后
,執(zhí)行SQL語句,查看SQL的耗時
比較發(fā)現(xiàn),時間減少了
??細節(jié)
創(chuàng)建索引
相當于在構(gòu)建B+Tree
所以創(chuàng)建索引也需要花時間
?最左前綴法則
最左前綴法則就是查詢從索引的最左列開始,并且不跳過索引中的列
如果索引了多列(聯(lián)合索引),要遵循最左前綴法則
??????查詢索引的時候,必須包含最左邊的一列,否則不滿足最左前綴法則,索引失效
查詢的時候,如果
跳過了最左邊的列,索引全部
失效
跳過了其中的某一列(不是最左邊的),索引部分
失效
?范圍查詢
聯(lián)合查詢在出現(xiàn)范圍查詢(>,<)時,范圍查詢右側(cè)的列索引失效
在業(yè)務(wù)允許的情況下,盡量使用>=
這樣子的查詢
?索引失效的情況
??????在索引列上使用運算操作(例如substr函數(shù)),索引將失效
??????字符串類型的字段使用時,不加引號,索引將失效
??????模糊查詢
如果僅僅是尾部模糊匹配,索引不會
失效
如果是頭部模糊匹配,索引會
失效
如果在查詢大數(shù)據(jù)的情況下,一定要規(guī)避這種情況
??????or連接的條件
使用or分割開的條件,如果or前的條件中列有索引
,而后面的列
沒有索引,那么涉及的索引不會被用到
如下面的例子,由于age沒有索引,所以即使id,phone有索引,索引也會失效
為了解決這個問題,我們要針對age建立索引
??????數(shù)據(jù)分布影響
如果MySQL 的優(yōu)化器 認為使用索引比全表更慢,那么不使用索引
(是MySQL自己進行評估認為的結(jié)果)
比如進行查詢一個數(shù)據(jù)
用戶:查詢什么什么東西
MySQL:找一個更快的方式,比如使用全表掃描比索引快,那么采用全表掃描了
使不使用索引,是由表中的數(shù)據(jù)決定的,而不是固定的
??SQL提示
SQL提示是指在使用SQL語言編寫數(shù)據(jù)庫查詢或操作時,數(shù)據(jù)庫管理系統(tǒng)(如MySQL、Oracle、SQL Server等)提供的輔助功能。這些提示可以幫助用戶更快地完成SQL語句,減少錯誤,并提供有關(guān)數(shù)據(jù)庫結(jié)構(gòu)和數(shù)據(jù)的相關(guān)信息。簡單來說,就是在SQL語句里面添加一些人為的提示來達到優(yōu)化操作的目的
??告訴數(shù)據(jù)庫使用什么索引(use)
這個是建議MySQL使用這個索引,但是是否要使用,MySQL還是要自己去權(quán)衡一下
explain select * from 表名 use index(索引名) where 條件;
??告訴數(shù)據(jù)庫不使用什么索引(ignore)
explain select * from 表名 use index(索引名) where 條件;
??告訴數(shù)據(jù)庫必須使用什么索引(force)
explain select * from 表名 force index(索引名) where 條件;
??????前綴索引
當字段類型為字符串(varchar,text)時,有時候需要索引很長的字符串,會使索引變得很大,查詢時,浪費大量的磁盤IO,影響查詢效率
這個時候我們就可以使用前綴索引,僅對字符串的一部分前綴,建立索引
,這樣子可以大大節(jié)約索引空間,從而提高索引效率
create index 索引名 on 表名(字段名(前綴長度n));
??前綴長度n
可以根據(jù)索引的選擇性來使用
,而選擇性是指不重復的索引值(基數(shù))和數(shù)據(jù)表的記錄總數(shù)的比值,索引選擇性越高,查詢效率越高
唯一索引的選擇性是1,是最好的索引選擇性,性能也是最好的
??獲取索引選擇性的方法
可以使用下面的公式來實現(xiàn)
select count(distant 字段名)/count(*) from 表名;
可以分步計算,康康過程
?如果是針對前綴索引
進行計算,那么公式里面要加上substring
select count(distant substring(字段名,起始字母,截取的字母個數(shù)))/count(*) from 表名;
可以通過多次計算,找到最合適的前綴長度
??查詢過程
??覆蓋索引
MySQL的覆蓋索引是一種特殊的索引類型,它包含了查詢所需的所有列,從而使得查詢可以直接通過索引本身來完成,而無需再去訪問實際的數(shù)據(jù)行。通常,數(shù)據(jù)庫查詢需要根據(jù)索引定位到相應(yīng)的數(shù)據(jù)行,然后再從數(shù)據(jù)行中獲取所需的列值。但是,使用覆蓋索引,MySQL可以在索引中找到所有需要的列,避免了額外的數(shù)據(jù)行查找
,盡量減少select *的使用
,從而提高了查詢性能。
??單列索引和聯(lián)合索引的選擇問題
??單列索引:一個索引僅僅包含一個列
??聯(lián)合索引:一個索引包含多個列
?單列索引
使用單列索引的時候,發(fā)現(xiàn)MySQL優(yōu)化器會選擇其中一個查詢效率比較高的一個索引
?聯(lián)合索引
使用聯(lián)合索引的時候,MySQL優(yōu)化器會選擇聯(lián)合索引
多條件聯(lián)合查詢的時候,MySQL優(yōu)化器會評估哪個字段的索引效率更高,會選擇該字段完成本次查詢
??索引設(shè)計原則
文章來源:http://www.zghlxwxcb.cn/news/detail-602903.html
??如果大家有不明白的地方,或者文章有問題,歡迎大家在評論區(qū)討論,指正??文章來源地址http://www.zghlxwxcb.cn/news/detail-602903.html
到了這里,關(guān)于【從刪庫到跑路】MySQL數(shù)據(jù)庫的索引(二)——索引的使用和選擇的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!