1. 优化器的逻辑
      1. 扫描行数
      2. 是否使用临时表
      3. 是否需要排序
    2. mysql在真正执行语句之前,并不能精确知道满足这个条件的记录有多少条,而只能根据统计信息来估算记录数。
      1. 这个统计信息就是索引的’区分度’。
        1. 一个索引上不同的值越多,这个索引的区分度就越好。
        2. 一个索引上不同的值的个数,称之为’基数’。基数越大,索引的区分度越好。
    3. mysql采样统计
      1. innodb默认会选择N个数据页,统计这些页面上的不同值,得到一个平均值,然后乘以这个索引的页面数,就得到了这个索引的基数。
      2. 数据表是会持续更新的,索引统计信息也不会固定不变。所以当变更的数据行数超过1/M的时候,会自动出发要重新做一次索引统计。
        1. mysql有两种存储索引统计的方式,可以通过设置参数innodb_stats_persistent的值来选择。
          1. 设置为on的时候,表示统计信息会持久化存储。这时,默认的N是20,M是10。
          2. 设置为off的时候,表示统计信息只存储在内存中。这时,默认的N是8,M是10。
    4. analyze table t <重新统计索引信息,解决由于索引统计信息不准确导致的问题>。
    5. force index(a) — 指定使用索引
      1. 使用指定索引与mysql优化器选择索引差别
      2. image.png
      3. 优化器放弃了使用索引a,说明a不够合适,除了指定使用索引,第二种方法就是修改sql语句,引导mysql使用我们期望的索引。
        1. 把原sql’order by b limit a’修改为’order by b,a limit 1’,语句的逻辑是相同的
        2. image.png
        3. image.png