降序索引
MySQL8.0之前,索引都是按照升序(ASC)创建的,虽然语法上支持DESC,但是创建的仍然是升序索引;如果某个查询需要对多个列进行排序(有降序、也有升序),并且排序条件与索引列不一致,或没有 对排序列创建索引,数据库都会进行额外的排序filesort,此时就可以考虑使用降序索引进行优化。
like使用索引问题
like语句可以使用索引,但是当以通配符“%”开头时,不会使用索引。
使用索引
select * from sql09_contacts where name like '张%';
不使用索引
select * from sql09_contacts where name like '%小%';
特殊情况:会走索引
select name from sql09_contacts where name like '%小%';
列参与运算不会使用索引
1、索引列作为表达式的一部分
select * from sql10_people where id+1=5;
2、索引列作为函数的参数
select * from sql10_people where year(birthday)>1991;
如下会走索引:
select * from sql10_people where birthday>date_format('1991-12-31','%Y-%m-%d');
使用or会使索引失效
主键索引:
select * from sql12_people where id=5;
增加条件or,没有使用索引:
select * from sql12_people where id=5 or phone='18800001111';
解决办法
1、给新增or条件的字段建索引:
create index idx_12 on sql12_people(phone);
show index from sql12_people;
2、使用union或者union all
select * from sql12_people where id=5
union
(select * from sql12_people where phone='18800001111');