场景一:模糊查询中使用通配符
假设有一张用户表user,其中有一个字段为username,我们想要根据用户名进行模糊查询,SQL语句如下:
SELECT * FROM user WHERE username LIKE '%smith%';
这样的查询会导致索引失效,因为LIKE操作符中包含了通配符%,MySQL无法使用索引进行匹配。解决方法是将查询条件改为以通配符开头的方式,例如:
SELECT * FROM user WHERE username LIKE 'smith%';
这样的查询可以利用索引进行加速。
场景二:对索引列进行函数操作
如果在查询中对索引列进行函数操作,也会导致索引失效。例如:
SELECT * FROM user WHERE YEAR(create_time) = 2021;
这样的查询无法利用create_time字段上的索引,可以考虑增加一个新的字段year来存储年份信息,并在查询时使用该字段:
ALTER TABLE user ADD COLUMN year INT NOT NULL DEFAULT 0;
UPDATE user SET year = YEAR(create_time);
SELECT * FROM user WHERE year = 2021;
这样可以利用year字段上的索引进行查询。
场景三:使用OR连接多个条件
在查询中使用OR连接多个条件也会导致索引失效,例如:
SELECT * FROM user WHERE username = 'smith' OR age = 30;
这样的查询无法利用username和age上的索引,可以考虑拆分成两个查询并用UNION连接:
SELECT * FROM user WHERE username = 'smith'
UNION
SELECT * FROM user WHERE age = 30;
这样可以分别利用username和age上的索引进行查询。