1.where条件中有or关键字
-- 创建组合索引
CREATE INDEX idx_name ON student(NAME,age);
-- 查询
SELECT COUNT(*) FROM student WHERE NAME='jack666'; -- 命中索引
SELECT COUNT(*) FROM student WHERE NAME='jack666' and age=666; -- 命中索引
SELECT COUNT(*) FROM student WHERE NAME='jack666' or age=666; -- 没有命中索引,索引失效
2.组合索引未用左列字段
组合索引 idx_name(name,address,phone)
等同于 idx_name(name) ;idx_name(name,address); idx_name(name,address,phone)
name phone不算
-- 创建组合索引,如果存在就不用创建
CREATE INDEX idx_name ON student(name,address,phone);
-- 查询
SELECT COUNT(*) FROM student WHERE address=666; -- 没有命中索引,索引失效
SELECT COUNT(*) FROM student WHERE phone=123; -- 没有命中索引,索引失效
SELECT COUNT(*) FROM student WHERE name='张三' AND phone ='12312'; -- 没有命中索引,索引失效
3.where条件like以占位符(_或%)开头
-- 查询,前提是name列有索引
SELECT COUNT(*) FROM student WHERE NAME LIKE 'jack66%'; -- 命中索引
SELECT COUNT(*) FROM student WHERE NAME LIKE '%666'; -- 没有命中索引,索引失效
4.where中索引列有运算
SELECT * FROM student WHERE id=6788; -- 命中索引
SELECT * FROM student WHERE id+1=6789; -- 没有命中索引,索引失效
5.where中索引列使用了函数【不单独指聚合函数】
SELECT COUNT(*) FROM student WHERE CONCAT(NAME,'66')='jack666'; -- 没有命中索引,索引失效
补充:什么情况下不推荐使用索引?
- 数据唯一性差(一个字段的取值只有几种时)的字段不要使用索引
比如性别,只有两种可能数据。意味着索引的二叉树级别少,多是平级。这样的二叉树查找无异于全表扫描。
- 频繁更新的字段不要使用索引
比如logincount登录次数,频繁变化导致索引也频繁变化,增大数据库工作量,降低效率。
- 字段不在where语句出现时不要添加索引,如果where后含IS NULL /IS NOT NULL/ like ‘%输入符%’等条件,不建议使用索引
只有在where语句出现,mysql才会去使用索引
4) where 子句里对索引列使用不等于(<>),使用索引效果一般