12、索引在什么情况下不会被使用?
索引可以提高查詢的速度,但并不是使用帶有索引的字段查詢時(shí),索引都會(huì)起作用。使用索引有幾種特殊情況,在這些情況下,
有可能使用帶有索引的字段查詢時(shí),索引并沒(méi)有起作用,下面重點(diǎn)介紹這幾種特殊情況。
1. 查詢語(yǔ)句中使用LIKE關(guān)鍵字
在查詢語(yǔ)句中使用 LIKE 關(guān)鍵字進(jìn)行查詢時(shí),如果匹配字符串的第一個(gè)字符為“%”,索引不會(huì)被使用。如果“%”不是在第一個(gè)位置,索引就會(huì)被使用。
例 1
為了便于理解,我們先查詢 tb_student 表中的數(shù)據(jù),SQL 語(yǔ)句和運(yùn)行結(jié)果如下:
下面在查詢語(yǔ)句中使用 LIKE 關(guān)鍵字,且匹配的字符串中含有“%”符號(hào),使用 EXPLAIN 分析查詢情況,SQL 語(yǔ)句和運(yùn)行結(jié)果如下:
mysql> EXPLAIN SELECT * FROM tb_student WHERE name LIKE '%四'\G *************************** 1. row ***************************id: 1select_type: SIMPLEtable: tb_studentpartitions: NULLtype: ALL possible_keys: NULLkey: NULLkey_len: NULLref: NULLrows: 6filtered: 16.67Extra: Using where mysql> CREATE INDEX index_name ON tb_student(name); mysql> EXPLAIN SELECT * FROM tb_student WHERE name LIKE '李%'\G *************************** 1. row ***************************id: 1select_type: SIMPLEtable: tb_studentpartitions: NULLtype: range possible_keys: index_namekey: index_namekey_len: 77ref: NULLrows: 1filtered: 100.00Extra: Using index condition第一個(gè)查詢語(yǔ)句執(zhí)行后,rows 參數(shù)的值為 6,表示這次查詢過(guò)程中查詢了 6 條記錄;第二個(gè)查詢語(yǔ)句執(zhí)行后,rows 參數(shù)的值為 1,表示這次查詢過(guò)程只查詢 1 條記錄。同樣是使用 name 字段進(jìn)行查詢,因?yàn)榈谝粋€(gè)查詢語(yǔ)句的 LIKE 關(guān)鍵字后的字符串是以“%”開頭的,所以第一個(gè)查詢語(yǔ)句沒(méi)有使用索引,而第二個(gè)查詢語(yǔ)句使用了索引 index_name。
2. 查詢語(yǔ)句中使用多列索引
多列索引是在表的多個(gè)字段上創(chuàng)建一個(gè)索引,只有查詢條件中使用了這些字段中的第一個(gè)字段,索引才會(huì)被使用。
例 2
在 name 和 age 兩個(gè)字段上創(chuàng)建多列索引,并驗(yàn)證多列索引的使用情況,SQL 語(yǔ)句和運(yùn)行結(jié)果如下:
第一條查詢語(yǔ)句的查詢條件使用了 name 字段,分析結(jié)果顯示 rows 參數(shù)的值為 1,且查詢過(guò)程中使用了 index_name_age 索引。第二條查詢語(yǔ)句的查詢條件使用了 age 字段,結(jié)果顯示 rows 參數(shù)的值為 6,且 key 參數(shù)的值為 NULL,這說(shuō)明第二個(gè)查詢語(yǔ)句沒(méi)有使用索引。
因?yàn)?name 字段是多列索引的第一個(gè)字段,所以只有查詢條件中使用了 name 字段才會(huì)使 index_name_age 索引起作用。
3. 查詢語(yǔ)句中使用OR關(guān)鍵字
查詢語(yǔ)句只有 OR 關(guān)鍵字時(shí),如果 OR 前后的兩個(gè)條件的列都是索引,那么查詢中將使用索引。如果 OR 前后有一個(gè)條件的列不是索引,那么查詢中將不使用索引。
例 3
下面演示 OR 關(guān)鍵字的使用。
由于 sex 字段沒(méi)有索引,所以第一條查詢語(yǔ)句沒(méi)有使用索引;name 字段和 id 字段都有索引,所以第二條查詢語(yǔ)句使用了 index_name 和 PRIMARY 索引 。
總結(jié)
使用索引查詢記錄時(shí),一定要注意索引的使用情況。例如,LIKE 關(guān)鍵字配置的字符串不能以“%”開頭;使用多列索引時(shí),查詢條件必須要使用這個(gè)索引的第一個(gè)字段;使用 OR 關(guān)鍵字時(shí),OR 關(guān)鍵字連接的所有條件都必須使用索引。
總結(jié)
以上是生活随笔為你收集整理的12、索引在什么情况下不会被使用?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 11、修改和删除索引(DROP INDE
- 下一篇: 9、使用GROUP BY分组查询