一条查询有很多种执行方式,最后都返回相同的结果.优化器的作用就是找到这其中最好的执行计划.
MySQL使用基于成本的优化器,它尝试预测一个查询使用某种执行计划时的成本,并选择其中最小的一个.
通过查询当前会话的Last_query_cost 的值来得知MySQL计算的当前查询成本
show status like 'Last_query_cost';
一.导致优化器选择错误的执行计划的原因
1.统计信息不准确
MySQL 依赖存储引擎提供的统计信息来评估成本,但是有的存储引擎提供的信息是准确的,有的偏差可能非常大
2.执行计划中的成功估算不等同于实际执行的成本
即使统计信息精准,优化器给出的执行计划也可能不是最优的;有时候某个执行计划虽然需要读取更多的页面,但它的成本却更小(比如这些页面都是顺序读或者这些页面再内存中)
3.MySQL是基于成本模型选择最优的计划
我们可能希望执行的时间尽可能的短,MySQL 是选择基于成本模型选择最优的计划,但是MySQL选择的这些并不是最快的执行方式
4.MySQL不考虑其他的并发执行的查询
并发执行的计划会影响到当前查询的速度
5.MySQL 不是任何时候都是基于成本的优化
有时候基于规则优化,如果存在全本搜索的MATCH()子句,则存在全文索引的时候就使用全文索引,即使使用where和别的索引快,mysql 也会继续使用对应的全文索引
6.MySQL 不会考虑其不受控制的操作的成本
例