索引类型
普通索引,唯一索引(唯一索引要求字段中不会出现重复数据),复合索引(将多个字段组合起来作为索引,必须使用到该索引中的第一个字段作为条件时才能保证系统使用该索引,否则该索引将不会被使用。)。
索引使用
建立索引:
create index 索引名 on 表名(索引字段名)
建立唯一索引:
create unique index 索引名 on 表名(索引字段名)
建立复合索引:
create index 索引名 on 表名(索引字段名1,索引字段名2...)
查看表中索引:
show index from 表名
删除索引:
drop index 索引名 on 表名
查看索引是否命中
Mysql:当结果的type为 index时索引命中
explain +sql语句
Oracle:
explain plan for+sql语句
explain plan for+sql语句
索引命中
1. 避免判断null值
应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描(可以设置默认值,比如0,确保没有null值,然后设置条件等于0)
2. 避免不等值判断
应尽量避免在 where 子句中使用!=或<>操作符,否则引擎将放弃使用索引而进行全表扫描。
3. 避免使用or逻辑
应尽量避免在 where 子句中使用 or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描,可以使用union all来进行查询来命中索引。
4 . 慎用in和not in逻辑
in 和 not in 也要慎用,否则会导致全表扫描。此时外层查询会全表扫描,不使用索引,可以修改为,两个查询连接。(where and t1.id = t2.id)
5. 注意模糊查询
like ‘%abc%‘也将导致全表扫描,不要在like条件左边加’%’,这样不会走索引模糊查询如果是必要条件时,可以使用 like ‘abc%’ 来实现模糊查询,此时索引将被使用。如果头匹配是必要的,可以使用elasticsearch等全文搜索引擎。
6. 避免查询条件中字段计算
应尽量避免在 where 子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描。如where num/2=100,应改为:where num=100*2
7. 避免查询条件中对字段进行函数操作
应尽量避免在where子句中对字段进行函数操作,这将导致引擎放弃使用索引而进行全表扫描。如,where substring(name,1,3)=‘abc’ , 应改为,where name like ‘abc%’
8. “=”左边避免表达式运算
不要在 where 子句中的“=”左边进行函数、算术运算或其他表达式运算,否则系统将可能无法正确使用索引。
9. 组合索引使用
在使用索引字段作为条件时,如果该索引是复合索引,那么必须使用到该索引中的第一个字段作为条件时才能保证系统使用该索引,否则该索引将不会被使用,并且应尽可能的让字段顺序与索引顺序相一致。
10. exists
很多时候用 exists 代替 in 是一个好的选择:
where num in(select num from b) 应该为,where exists(select 1 from b where num=a.num)