• 数据库索引优化


    1.索引覆盖

    现象:在利用二级索引查询时,只能查询到主键值,然后需要再查询主键索引树,才能得到对应行数据.

    原因:可以减少回表的次数,提高查询性能.

    应用:建立联合索引

    eg:

    select name from table where id_card between 10 and 15;//id_card为普通索引.

    优化:建立联合索引(id_card,name)

    2.在建立联合索引的时候,如何安排索引内的字段顺序?

    频繁查询的字段在联合索引中应该尽量靠左设计,能少维护一个索引是一个.

    3.在建立联合索引的时候,如果需要对单个索引字段进行查询,该如何设计?

    eg:有联合索引(a,b),但还需要查询单独基于a或b进行查询.因基于b进行查询时,是不能利用索引(a,b)的.故此时需要按照a和b谁的字段小谁就再单独建一个索引.若b的字段比a小,就建立(a,b),(b)两个索引.

    3.索引下推(Index Condition Pushdown,ICP) 

    3.1mysqlv5.6之后引入ICP

    3.2在使用联合索引的时候,按照最左匹配原则没有匹配到的字段该怎麼办?如以下情况:

    前提:建立了联合索引(name,age)

    select name from table where name like '李%' and age = 10 ans ismale = true;

    因mysql 会一直向右匹配直到遇到范围查询(>、<、between、like)就停止匹配。范围列可以用到索引,但是范围列后面的列无法用到索引。即,索引最多用于一个范围列,因此如果查询条件中有两个范围列则无法全用到索引.

    故此时根据 name like '李%' 可以利用索引,找到第一个name以李开头的记录(记作ID4),避免全表查询.然后判断其他条件是否满足。

    mysqlv5.6之前:

    age字段不能利用索引,只能从 ID4 开始一个个回表。到主键索引上找出数据行,再对比字段(age和iamale)值.

    mysqlv5.6之后:

    age字段能利用索引, 可以在索引遍历过程中,对索引中包含的字段(age)先做判断,直接过滤掉不满足条件的记录,减少回表次数

  • 相关阅读:
    「软件设计」权威领域驱动设计(DDD)简介
    CRDB-事务层知识点
    计算机网络-子网划分
    jquery访问浏览器本地存储cookie,localStorage和sessionStorage
    Maven基础
    A* AcWing 178. 第K短路
    MVP模式根模块
    OpenGL之纹理过滤(Texture Filtering)、MipMap方法、纹理坐标
    【经验分享】一个实用的C语言宏定义技巧写法
    手写一套简单的dubbo(含注册中心)之核心代码
  • 原文地址:https://blog.csdn.net/DYYssb/article/details/126807429