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

- 优化器放弃了使用索引a,说明a不够合适,除了指定使用索引,第二种方法就是修改sql语句,引导mysql使用我们期望的索引。
- 把原sql’order by b limit a’修改为’order by b,a limit 1’,语句的逻辑是相同的


