23 最左前缀法则
如果索引了多列,称为联合索引。
需要从最左边的列开始,并且不跳过中间的列。
如果跳跃,索引将部分失效。
show index from tb_user;
explain select * from tb_user where profession='软件工程' and age=31 and status='0';
范围查询
出现范围查询(<>),右边的会失效。
解决方案
业务允许条件下,尽量使用<= >=
24 索引失效情况
1 不要在索引列上运算
select * from tb_user where substring(phone,10,2)='15';
此时索引失效,因为对索引进行了函数运算/
2 字符串类型不加引号
可以查询出来,但是执行计划中没有用到索引。
3 模糊查询
仅仅尾部模糊,索引不失效,
//软件开头的
select * from tb_user where profession like '软件%';
大数据量要去规避模糊查询,
4 or连接的条件
or分隔开的条件,只有两侧都有索引,索引才生效。
解决方案:针对age字段也建立索引。
create index idx_user_age on tb_user(age);
5 数据分布影响
如果mysql评估,使用索引比全表扫描更慢,不使用索引。
select * from tb_user where phone>='177773000';
update tb_user set profession=null;
取决于某个字段在数据库中的分布情况。
26 sql提示
场景
多个索引,系统会选择一个索引进行执行。
我们可以强制让系统使用某个索引,或者不使用哪个。
使用
use index
explain select * from tb_user use index(idx_user_pro) where profession='软件工程';
ignore index
explain select * from tb_user ignore index(idx_user_pro) where profession='软件工程';
force index
explain select * from tb_user force index(idx_user_pro) where profession='软件工程';