1. 索引失效
1.1 普通索引
场景一:SELECT * FROM user_info WHERE id + 1 = 2;
索引的列如果是表达式的一部分或者是函数的参数,则失效。
场景二:SELECT * FROM user_info WHERE name LIKE '%ook';
like查询前面部分未输入,以%开头无法命中索引。
可以使用覆盖索引(type=index
)。
场景三:SELECT * FROM user_info WHERE id <> 1;
查询条件使用不等式(
<>
或者!=
)。
场景四:SELECT * FROM user_info WHERE name = 1;
查询条件类型不一致。
字符串跟数字的比较,它们类型不匹配,MySQL会做隐式的类型转换,把它们转换为浮点数再做比较。
场景五:
mysql查询单表时,查询得到的结果集占数据总量很大比例30%,mysql会认为全表扫描会优于索引,则不走索引。
不要给’性别’等增加索引。如果某个数据列里包含了均是"0/1"或“Y/N”等值,即包含着许多重复的值,就算为它建立了索引,索引效果不会太好,还可能导致全表扫描。
场景六:
使用or连接的两个字段,如果两个字段都是索引字段索引才会生效(
index_merge
),否则索引无效。
场景七:
使用NOT IN的时候索引可能会失效,进而使用全表查询。
1.2 复合索引
场景一:
不使用索引首列当查询条件(最左前缀)。
2. EXPLAIN语句
CREATE TABLE `user_info` (
`id` BIGINT(20) NOT NULL AUTO_INCREMENT,
`name` VARCHAR(50) NOT NULL DEFAULT '',
`age` INT(