Mysql中SQL語句不使用索引的情況
MySQL查詢不使用索引匯總
眾所周知,增加索引是提高查詢速度的有效途徑,但是很多時候,即使增加了索引,查詢?nèi)匀徊皇褂盟饕?,這種情況嚴重影響性能,這里就簡單總結(jié)幾條MySQL不使用索引的情況
如果MySQL估計使用索引比全表掃描更慢,則不使用索引。例如,如果列key均勻分布在1和100之間,下面的查詢使用索引就不是很好:select * from table_name where key>1 and key<90;
如果使用MEMORY/HEAP表,并且where條件中不使用“=”進行索引列,那么不會用到索引,head表只有在“=”的條件下才會使用索引
用or分隔開的條件,如果or前的條件中的列有索引,而后面的列沒有索引,那么涉及到的索引都不會被用到,例如:select * from table_name where key1='a' or key2='b';如果在key1上有索引而在key2上沒有索引,則該查詢也不會走索引
復(fù)合索引,如果索引列不是復(fù)合索引的第一部分,則不使用索引(即不符合最左前綴),例如,復(fù)合索引為(key1,key2),則查詢select * from table_name where key2='b';將不會使用索引
如果like是以‘%'開始的,則該列上的索引不會被使用。例如select * from table_name where key1 like '%a';該查詢即使key1上存在索引,也不會被使用
如果列為字符串,則where條件中必須將字符常量值加引號,否則即使該列上存在索引,也不會被使用。例如,select * from table_name where key1=1;如果key1列保存的是字符串,即使key1上有索引,也不會被使用。
從上面可以看出,即使我們建立了索引,也不一定會被使用,那么我們?nèi)绾沃牢覀兯饕氖褂们闆r呢??在MySQL中,有Handler_read_key和Handler_read_rnd_key兩個變量,如果Handler_read_key值很高而Handler_read_rnd_key的值很低,則表明索引經(jīng)常不被使用,應(yīng)該重新考慮建立索引??梢酝ㄟ^:show status like 'Handler_read%'來查看著連個參數(shù)的值。
關(guān)于如何正確創(chuàng)建Mysql的索引,請參考怎樣正確創(chuàng)建MySQL索引的方法詳解;眾所周知,數(shù)據(jù)表索引可以提高數(shù)據(jù)的檢索效率,也可以降低數(shù)據(jù)庫的IO成本,并且索引還可以降低數(shù)據(jù)庫的排序成本;但索引并不是時時都會生效的,比如以下幾種情況,將導(dǎo)致索引失效:
1.如果條件中有or,即使其中有條件帶索引也不會使用索引(這也是為什么SQL語句中盡量少用or的原因)

注意:要想使用or,又想讓索引生效,只能將or條件中的每個列都加上索引。
2.對于多列索引,不是使用的第一部分,則不會使用索引。
3.like查詢是以%開頭時不會使用索引。

4.如果列類型是字符串,那一定要在條件中將數(shù)據(jù)使用引號引用起來,否則不使用索引。

5.如果 mysql 估計使用全表掃描要比使用索引快,則不使用索引。
此外,查看索引的使用情況
show status like 'Handler_read%';
大家可以注意:
handler_read_key:這個值越高越好,越高表示使用索引查詢到的次數(shù)。
handler_read_rnd_next:這個值越高,說明查詢越低效。
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,謝謝大家對腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請查看下面相關(guān)鏈接
相關(guān)文章
MySQL升級PostgreSQL遇到的一些常見問題及解決方案
MySQL是一款性能優(yōu)越、數(shù)據(jù)可靠性高的數(shù)據(jù)庫軟件,然而為了保證其長期有效運行,數(shù)據(jù)庫升級是非常重要的,下面這篇文章主要給大家介紹了關(guān)于MySQL升級PostgreSQL遇到的一些常見問題及解決方案的相關(guān)資料,需要的朋友可以參考下2024-05-05
MYSQL中有關(guān)SUM字段按條件統(tǒng)計使用IF函數(shù)(case)問題
MYSQL中SUM字段按條件統(tǒng)計使用IF函數(shù),具體實現(xiàn)代碼如下,感興趣的朋友不要錯過2014-01-01
mysql字符串的‘123’轉(zhuǎn)換為數(shù)字的123的實例
下面小編就為大家?guī)硪黄猰ysql字符串的‘123’轉(zhuǎn)換為數(shù)字的123的實例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-01-01
MySQL 5.7之關(guān)于SQL_MODE的設(shè)置
這篇文章主要介紹了MySQL 5.7之關(guān)于SQL_MODE的設(shè)置方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-08-08

