最近看到一個問題,形如:select * from index_test whereuser_name like '%aaa%';
上面這條語句會不會用到索引呢?
根據之前的瞭解,這個是不用到的,不過還是測試下,然後建立這樣的表以及聯合索引:
CREATE TABLE `index_test` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` varchar(11) CHARACTER SETlatin1 DEFAULT NULL,
`user_name` varchar(255) DEFAULT NULL,
`address` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `user_id` (`user_id`) USING BTREE,
KEY `user_id_user_name_address`(`user_id`,`user_name`,`address`) USING BTREE,
KEY `username` (`user_name`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=1532 DEFAULTCHARSET=utf8;
explain一下:
EXPLAIN SELECT * from index_test where user_namelike '%aaa%';
分析結果如下:
其中,key語句執行過程所用到的索引,rows爲掃描的行數,很奇怪,爲啥會用到索引,不過根據掃描行數,其實,索引並沒有起到相關作用的。
那麼,稍微修改下語句,符合索引like的向左匹配原則呢?執行下看看:
這下才是正常的。
操作表結構過程中,在address後面新增了某一字段或者在user_id,user_name,address中新增一個字段,發現對於上面的sql,explain正常了:
EXPLAIN SELECT * from index_test where user_name like '%aaa%';
對於出現上述現象的原因,暫時還不太清楚。