mysql查询优化器为什么可能会选择错误的执行计划
有可能导致mysql优化器选择错误的执行计划的原因如下:
A:统计信息不准确,mysql依赖存储引擎为其提供的统计信息来评估成本,然而有的存储引擎提供的信息是准确的,有的引擎提供的可能就偏差很大,如:innodb因为其MVCC的架构,并不能维护一个数据表的行数的精确统计。
B:在执行计划中的成本估算不等同于实际执行的成本,即使统计信息精准,优化器给出的执行计划也可能不是最优的,如:有时候某个执行计划虽然需要读取更多的页,但它的实际执行成本却更小,因为如果这些页面都是顺序或者这些页面都在内存中,那么它的访问成本将小很多。mysql层面并不知道哪些页面在内存中,哪些在磁盘上,所以查询实际执行过程中到底需要多少次物理IO是无法预估的。
C:mysql的最优可能和你觉得最优的不一样,你可能希望执行时间尽可能地短,但是mysql只是基于成本模型选择最优执行计划,而有些时候这并不是最快的执行计划(因为mysql的成本估算主要基于扫描行数,而如果这些行是顺序的或者是在内存中,那么扫描速度就会很快,相反,如果这些行是在磁盘上且是无序的,就会产生随机读取,那么就算扫描更少的行,可能执行时间更长,而优化器在评估成本的时候并不考虑任何层面的缓存,它假设读取任何数据都需要一次磁盘IO)。
D:mysql从不考虑其他并发执行的查询,这可能影响到当前查询的速度
E:mysql也并不是任何时候都是基于成本优化,有时候也会基于一些固定的规则,如:如果存在全文搜索的match()子句,则在存在全文索引的时候就使用全文索引,即使有时候使用别的索引和where条件可以远比这种方式快,mysql也仍然使用对应的全文索引。
F:mysql不会考虑不受控制的操作成本,如:执行存储过程或者用户自定义函数的成本
G:优化器有时候无法去估算所有可能的执行计划,所以它可能错过实际上最优的执行计划。
mysql架构由多个层次组成,在服务器层有查询优化器,却没有保存数据和索引的统计信息,统计信息由存储引擎层实现,不同存储引擎可能会存储不同的统计信息,某些引擎,如archive引擎,则根本没有任何统计信息。因为服务器层没有任何统计信息,所以mysql查询优化器在生成查询的执行计划的时候,需要向存储引擎获取相应的统计信息,存储引擎则提供给优化器对应的统计信息,包括:每个表或索引有多少个页面,每个表的每个索引的基数是多少,数据行和索引长度,索引的分布信息等,优化器根据这些信息来选择一个最优的执行计划。
mysql查询优化器为什么可能会选择错误的执行计划的更多相关文章
- Atitit Mysql查询优化器 存取类型 范围存取类型 索引存取类型 AND or的分析
Atitit Mysql查询优化器 存取类型 范围存取类型 索引存取类型 AND or的分析 Atitit Mysql查询优化器 存取类型 范围存取类型 索引存取类型 AND or的分析1 存 ...
- Mysql查询优化器
Mysql查询优化器 本文的目的主要是通过告诉大家,查询优化器为我们做了那些工作,我们怎么做,才能使查询优化器对我们的sql进行优化,以及启示我们sql语句怎么写,才能更有效率.那么到底mysql到底 ...
- Mysql查询优化器浅析
--Mysql查询优化器浅析 -----------------------------2014/06/11 1 定义 Mysql查询优化器的工作是为查询语句选择合适的执行路径.查询优化器的代码 ...
- 010 --MySQL查询优化器的局限性
MySQL的万能"嵌套循环"并不是对每种查询都是最优的.不过还好,mysql查询优化器只对少部分查询不适用,而且我们往往可以通过改写查询让mysql高效的完成工作.在这我们先来看看 ...
- 1025WHERE执行顺序以及MySQL查询优化器
转自http://blog.csdn.net/zhanyan_x/article/details/25294539 -- WHERE执行顺序-- 过滤比较多的放在前面,然后更加容易匹配,从左到右进行执 ...
- 20170103简单解析MySQL查询优化器工作原理
转自博客http://www.cnblogs.com/hellohell/p/5718238.html 感谢楼主的贡献 查询优化器的任务是发现执行SQL查询的最佳方案.大多数查询优化器,包括MySQL ...
- mysql查询优化器的提示(hit)
如果对优化器选择的执行计划不满意,可以使用优化器提供的几个提示来控制最终的执行计划,关于每个提示的具体用法,建议直接阅读官方手册,一些提示和版本有直接关系,可以使用的一些提示如下: high_prio ...
- MySQL查询优化器工作原理解析
手册上查询优化器概述 查询优化器的任务是发现执行SQL查询的最佳方案.大多数查询优化器,包括MySQL的查询优化器,总或多或少地在所有可能的查询评估方案中搜索最佳方案.对于联接查询,MySQL优化器所 ...
- MySQL Index--关联条件列索引缺失导致执行计划性能不佳
某系统反馈慢SQL影响生产,查看SLOW LOG发现下面慢SQL: SELECT COUNT(DISTINCT m.batch_no) FROM ob_relation r INNER JOIN ob ...
随机推荐
- 关于mysql(或MariaDB)中的用户账号格式
之前在修改数据库本地root用户密码时,发现我远程连接的root用户的密码并没有改变,之后查了一下,发现原来这两个root不是同一个用户(汗..) 于是联想到之前配置数据库每次给用户赋予远程连接权限时 ...
- NYOJ背包问题
#include <stdio.h> struct group{ int value; int weight; }; void Sort(group bag[],int num) { in ...
- BizTalk开发系列(十二) Schema设计之Group与Order
开发BizTalk项目的时候会先约定各系统之间往来的消息格式. 由于BizTalk内部唯一使用XML文档.因此消息的格式为XML Schema(XML Schema 用于描述 XML 文档的结构).虽 ...
- php课程---练习(发布新闻)
做一个发布新闻的页面,实现发布新闻,查看新闻,修改新闻与删除等功能 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional/ ...
- Unity学习疑问记录之正交与透视
Unity中相机的投影是2种方式,正交和透视 这是透视方式 正交方式: //计算屏幕宽度 float height = 2.0f * Camera.main.orthographicSize;//正交 ...
- DevExpress GridView对表格的部分说明
1. int[] selects = this.m_grdView1.GetSelectedRows(); // 获取选中的行,可能是几行 2. this.m_grdView1.GetRowCellV ...
- poj分类
初期: 一.基本算法: (1)枚举. (poj1753,poj2965) (2)贪心(poj1328,poj2109,poj2586) (3)递归和分治法. ( ...
- freebsd|odoo - 为odoo报表 安装文泉译中文字体
来源: Odoo8.0中使用文泉译中文字体 http://blog.csdn.net/vnsoft/article/details/40056935 FreeBSD wkhtmltop ...
- Visual C++ 中的重大更改
https://technet.microsoft.com/zh-cn/learning/bb531344.aspx 当你升级到 Visual C++ 编译器的新版本后,可能会在之前编译并正常运行 ...
- 优化SQL Sever查询语句的几个要点
1.不要在Where子句中的“=”左边进行函数.算术运算或其他表达式运算,否则系统将可能无法正确使用索引. 2.尽量不要在Where条件中使用函数,否则将不能利用索引. 3.在Where条件中使用明确 ...