1、建表語(yǔ)句如下所示:
DROP TABLE IF EXISTS `p_user`;
CREATE TABLE `p_user` (
`id` int(11) NOT NULL auto_increment,
`name` varchar(10) default NULL,
`sex` char(2) default NULL,
PRIMARY KEY (`id`)
);
INSERT INTO `p_user` VALUES (‘1’, ‘A’, ‘男’);
INSERT INTO `p_user` VALUES (‘2’, ‘B’, ‘女’);
INSERT INTO `p_user` VALUES (‘3’, ‘C’, ‘男’);

然后給name字段創(chuàng)建Unique索引,請(qǐng)自行百度。
explain函數(shù)驗(yàn)證索引是否有效
第一步:使用列表name查詢驗(yàn)證索引。
1、使用索引列時(shí)索引才會(huì)生效,語(yǔ)句如下:
explain select * from p_user WHERE name=’B’

2、不使用索引查詢:
explain select * from p_user

第二步:失效的索引。
1、使用語(yǔ)句:
explain select * from p_user WHERE name != ‘A’
第三步:復(fù)合場(chǎng)景。
1、使用語(yǔ)句:
explain select * from p_user WHERE name=’B’ AND name != ‘A’


explain函數(shù)介紹
explain顯示了MySQL如何使用索引來(lái)處理select語(yǔ)句以及連接表。他可以幫助選擇更好的索引和寫(xiě)出更優(yōu)化的查詢語(yǔ)句
explain顯示了很多列,各個(gè)關(guān)鍵字的含義如下:
- table:顧名思義,顯示這一行的數(shù)據(jù)是關(guān)于哪張表的;
- type:這是重要的列,顯示連接使用了何種類(lèi)型。從最好到最差的連接類(lèi)型為:const、eq_reg、ref、range、indexhe和ALL;
- possible_keys:顯示可能應(yīng)用在這張表中的索引。如果為空,沒(méi)有可能的索引。可以為相關(guān)的域從where語(yǔ)句中選擇一個(gè)合適的語(yǔ)句;
- key: 實(shí)際使用的索引。如果為NULL,則沒(méi)有使用索引。很少的情況下,MySQL會(huì)選擇優(yōu)化不足的索引。這種情況下,可以在Select語(yǔ)句中使用USE INDEX(indexname)來(lái)強(qiáng)制使用一個(gè)索引或者用IGNORE INDEX(indexname)來(lái)強(qiáng)制MySQL忽略索引;
- key_len:使用的索引的長(zhǎng)度。在不損失精確性的情況下,長(zhǎng)度越短越好;
- ref:顯示索引的哪一列被使用了,如果可能的話,是一個(gè)常數(shù);
- rows:MySQL認(rèn)為必須檢查的用來(lái)返回請(qǐng)求數(shù)據(jù)的行數(shù);
- Extra:關(guān)于MySQL如何解析查詢的額外信息。
- 具體的各個(gè)列所能表示的值以及含義可以參考MySQL官方文檔介紹,地址:https://dev.mysql.com/doc/refman/5.7/en/explain-output.html
造成索引失效的場(chǎng)景
- where 子句中使用 != 或 <> 操作符,引擎將放棄使用索引而進(jìn)行全表掃描。
- where 子句中使用 or 來(lái)連接條件,將導(dǎo)致引擎放棄使用索引而進(jìn)行全表掃描,即使其中有條件帶索引也不會(huì)使用,這也是為什么盡量少用 or 的原因。
- 對(duì)于多列索引,不是使用的一部分,則不會(huì)使用索引。
- 如果列類(lèi)型是字符串,那一定要在條件中將數(shù)據(jù)使用引號(hào)引用起來(lái),否則不會(huì)使用索引。
- like的模糊查詢以 % 開(kāi)頭,索引失效。
- 在 where 子句中對(duì)字段進(jìn)行表達(dá)式操作,導(dǎo)致引擎放棄使用索引而進(jìn)行全表掃描。
- 在 where 子句中對(duì)字段進(jìn)行函數(shù)操作,導(dǎo)致引擎放棄使用索引而進(jìn)行全表掃描。
- 在 where 子句中的 “=” 左邊進(jìn)行函數(shù)、算術(shù)運(yùn)算或其他表達(dá)式運(yùn)算,導(dǎo)致系統(tǒng)將可能無(wú)法正確使用索引。
- 不適合鍵值較少的列(重復(fù)數(shù)據(jù)較多的列)。假如索引列TYPE有5個(gè)鍵值,如果有1萬(wàn)條數(shù)據(jù),那么 WHERE TYPE = 1將訪問(wèn)表中的2000個(gè)數(shù)據(jù)塊。再加***問(wèn)索引塊,一共要訪問(wèn)大于200個(gè)的數(shù)據(jù)塊。如果全表掃描,假設(shè)10條數(shù)據(jù)一個(gè)數(shù)據(jù)塊,那么只需訪問(wèn)1000個(gè)數(shù)據(jù)塊,既然全表掃描訪問(wèn)的數(shù)據(jù)塊少一些,肯定就不會(huì)利用索引了。