create index index_name on user(name,status,address);//创建组合索引
select * from user where name = ? and status = ? and address = ? (全部索引有效)
select * from user where status = ? (索引失效)
select * from user where name = ? and status = ? (两个索引有效)
select * from user where name = ? and address = ? (第一个索引有效, 第二个失效)
select * from user where status = ? and address = ? (索引失效)
select * from user where age > ? and address = ? 则 address 失效.
select * from user where substring(name,startIndex,count); name索引失效;
select * from user where id = 1162166234825900032; id索引失效.
select name,status,address from user; 最优: 因为name,status,address是联合索引, using where;using index;
select name from user; using index;
select name,fix_name from user; using codition;
using index: 使用覆盖索引的时候就会出现
using where: 在查找使用索引的情况下,需要回表去查询所需的数据.
using index condition: 查找使用了索引,但是需要回表查询数据.
using index;using where : 查找使用了索引,但是需要的数据都在索引列中能找到,所以不需要回表查询数据.
select * from user where name = ? or nickName = ? 整个索引失效
select * from user where name like "%xx%"; 索引失效, 使用覆盖索引(查询的所有的字段都是索引列)可解决这个问题
select * from user where id = ? ===> 假设全表共200条数据,扫描到了199条匹配的数据, 则放弃索引,执行全表扫描
select * from user where name is null; MYSQL会自动评估,如果数据多为null,则索引失效, 如果数据大多数都不null, 则索引有效.
select * from user where name is not null; MYSQL会自动评估,如果数据多不为null,则索引失效, 如果数据大多数都为null, 则索引有效.
in , not in in有效, not in 失效
联合索引: 数据库会使用联合索引, 建议使用联合索引
单列索引: 数据库会使用最优的索引,而不是全部索引.(辨识度最高的优先)
查看索引的使用情况
show global status like