1、聚集索引和非聚集索引
索引一般分为聚集索引和非聚集索引,聚集索引速度很快,但只能建一个,非聚集索引虽然没有聚集索引快,但可以建多个,比全表扫描快。
2、如何建立高效的索引
- 关联条件上建立索引,比如 select * from T1 jion T2 on T1.a=T2.b 那么在关联条件on后面的两个列T1.a和T2.b就可以建立索引,这样会加快符合关联条件的数据查询。
- 在条件查询上建立索引,比如 select * from T1 where a>1 那么在where条件a列就可以建立索引。注意以下几种情况不会走索引:
- 在索引列上使用了运算符的,比如 T1.a*0.5>20,这种不会使用索引
- 在索引列上使用了函数的,比如 upper(T1.a)="AA",这种也不会使用索引
- 在使用索引时存在空值NULL的,比如 T1.a is NULL ,这种查询也不会走索引
- 字符型数据不加引号也不会使用索引,比如 a是字符型,T1.a='111' 会使用索引,但如果去掉引号T1.a=111,查询语句不会报错,但是不会使用索引了
- 有 OR 和 不等<>、!= 以及 NOT IN 等这些也不会使用索引,建议使用in代替or,使用not exists 代替 not in。
- 经常使用的LIKE 除了前置匹配,其他匹配均不会使用索引,比如 T1.a like 'hhhhh%' 走索引,但是 T1.a like '%hhhhhhh%' 不走索引
- 如果查询优化器判断全表扫描比走索引还快的也不会使用到索引。
- 子查询的结果集不会使用索引。因为子查询的结果集会被存储到大量的临时表中,不论是内存临时表还是磁盘临时表都不会存在索引,子查询会消耗过多的cpu和io资源产生大量的慢查询
- 建立索引原则:
- 不频繁写入和更新的列适合建立索引
- 经常查询的列适合建立索引
- 重复数据较少的可以建立索引
- 联合索引,联合索引就是几个列合在一起组成一个索引,在where条件中想必单列索引会起到意想不到的效果, 比如 select * from T1 where a=1 and b=2;这个时候将列a和b建立成一个联合索引,效果会更好。 注意 :联合索引需要按顺序走,如果中间某个索引不能用,那它之后的列不会使用索引,比如存在联合索引abc,以下语句
- select * from T where a= 1 and b like "%jjj%" and c=8;
- 由于b的条件为like查询,索引失效,因此c的索引也会跟着失效
3、什么情况不适合建立索引
由于①创建索引和维护索引耗时,耗时时间随着数据的增加而增加,成正比;②索引需要占物理空间;③当对表中的数据进行维护时,对索引也要进行维护,这样降低了数据的维护速度。基于以上3点缺点,以下情况不适合建立索引
- 对于在查询过程中很少使用或参考的列,不应该建立索引
- 对于那些只有很少数据值的列,不应该建立索引,比如性别
- 对于那些定义为image、text和bit数据类型的列,不应该创建索引
- 当修改性能远大于检索性能,不应该建立索引
- 重复值较多的也不适合建立索引
4、查询时的小技巧
- 强制使用某个索引:select * from table force index(idx_user)
- 禁止使用某个索引:select * from table ignore index(idx_user)
以上。