• 索引优化


    1、聚集索引和非聚集索引
      索引一般分为聚集索引和非聚集索引,聚集索引速度很快,但只能建一个,非聚集索引虽然没有聚集索引快,但可以建多个,比全表扫描快。

    2、如何建立高效的索引

    1. 关联条件上建立索引,比如 select * from T1 jion T2 on T1.a=T2.b 那么在关联条件on后面的两个列T1.a和T2.b就可以建立索引,这样会加快符合关联条件的数据查询。

    2. 在条件查询上建立索引,比如 select * from T1 where a>1 那么在where条件a列就可以建立索引。注意以下几种情况不会走索引:
      1. 在索引列上使用了运算符的,比如 T1.a*0.5>20,这种不会使用索引
      2. 在索引列上使用了函数的,比如 upper(T1.a)="AA",这种也不会使用索引
      3. 在使用索引时存在空值NULL的,比如 T1.a is NULL ,这种查询也不会走索引
      4. 字符型数据不加引号也不会使用索引,比如 a是字符型,T1.a='111' 会使用索引,但如果去掉引号T1.a=111,查询语句不会报错,但是不会使用索引了
      5. OR 和 不等<>!=  以及 NOT IN 等这些也不会使用索引,建议使用in代替or,使用not exists 代替 not in。
      6. 经常使用的LIKE 除了前置匹配,其他匹配均不会使用索引,比如 T1.a like 'hhhhh%' 走索引,但是 T1.a like '%hhhhhhh%' 不走索引
      7. 如果查询优化器判断全表扫描比走索引还快的也不会使用到索引
      8. 子查询的结果集不会使用索引。因为子查询的结果集会被存储到大量的临时表中,不论是内存临时表还是磁盘临时表都不会存在索引,子查询会消耗过多的cpu和io资源产生大量的慢查询
    3. 建立索引原则:
      1. 不频繁写入和更新的列适合建立索引
      2. 经常查询的列适合建立索引
      3. 重复数据较少的可以建立索引  
    4. 联合索引,联合索引就是几个列合在一起组成一个索引,在where条件中想必单列索引会起到意想不到的效果, 比如 select * from T1 where a=1 and b=2;这个时候将列a和b建立成一个联合索引,效果会更好。
    5.   注意 :联合索引需要按顺序走,如果中间某个索引不能用,那它之后的列不会使用索引,比如存在联合索引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)

    以上。

  • 相关阅读:
    node下运行ts
    npm的一些基本配置设置
    windws 安装jdk
    java jdbc连接mysql
    struts2+jquery 实现ajax登陆
    struts2 零配置
    java 生成UUID
    ubuntu 换源
    ubuntu下安装redis
    安装 vsftpd
  • 原文地址:https://www.cnblogs.com/smallzhen/p/12547384.html
Copyright © 2020-2023  润新知