有可能导致mysql优化器选择错误的执行计划的原因如下: A:统计信息不准确,mysql依赖存储引擎为其提供的统计信息来评估成本,然而有的存储引擎提供的信息是准确的,有的引擎提供的可能就偏差很大,如:innodb因为其MVCC的架构,并不能维护一个数据表的行数的精确统计. B:在执行计划中的成本估算不等同于实际执行的成本,即使统计信息精准,优化器给出的执行计划也可能不是最优的,如:有时候某个执行计划虽然需要读取更多的页,但它的实际执行成本却更小,因为如果这些页面都是顺序或者这些页面都在内存中,那…
Atitit Mysql查询优化器 存取类型 范围存取类型 索引存取类型 AND or的分析     Atitit Mysql查询优化器 存取类型 范围存取类型 索引存取类型 AND or的分析1 存取类型1 5         范围存取类型2 6         索引存取类型2 7         转换3 AND3 9         OR3 10    UNION3 11    NOT,<>4 12    ORDER BY4 13    GROUP BY4 存取类型 当我们评估一个条件表达…
Mysql查询优化器 本文的目的主要是通过告诉大家,查询优化器为我们做了那些工作,我们怎么做,才能使查询优化器对我们的sql进行优化,以及启示我们sql语句怎么写,才能更有效率.那么到底mysql到底能进行哪些优化那,下面通过以下几个方面来探讨一下: 1          常量转化 它能够对sql语句中的常量进行转化,比如下面的表达式: WHERE col1 = col2 AND col2 = 'x'; 依据传递性:如果A=B and B=C,那么就能得出A=C.所以上面的表达式mysql查询优…
--Mysql查询优化器浅析 -----------------------------2014/06/11 1 定义    Mysql查询优化器的工作是为查询语句选择合适的执行路径.查询优化器的代码一般是经常变动的,这和存储引擎不太一样.因此,需要理解最新版本的查询优化器是如何组织的,请参考相应的源代码.整体而言,优化器有很多相同性,对mysql一个版本的优化器做到整体掌握,理解起mysql新版本以及其他数据库的优化器都是类似的.   优化器会对查询语句进行转化,转化等价的查询语句.举个例子,…
MySQL的万能"嵌套循环"并不是对每种查询都是最优的.不过还好,mysql查询优化器只对少部分查询不适用,而且我们往往可以通过改写查询让mysql高效的完成工作.在这我们先来看看mysql优化器有哪些局限性: 1.关联子查询 mysql的子查询实现得非常糟糕.最糟糕得一类查询是where条件中包含in()的子查询语句.例如,我们希望找到sakila数据库中,演员Penlope Guiness参演的所有影片信息.很自然的,我们会按照下面的方式用子查询实现: select * from…
转自http://blog.csdn.net/zhanyan_x/article/details/25294539 -- WHERE执行顺序-- 过滤比较多的放在前面,然后更加容易匹配,从左到右进行执行:一般都是优化器很智能的优化了,无需用户处理-- 如何查看优化后的语句EXPLAIN EXTENDEDSELECT SQL_NO_CACHE * FROM db.tableWHERE is_day=1 AND DATE(ex_date)='2015-07-01' ; SHOW WARNINGS;…
转自博客http://www.cnblogs.com/hellohell/p/5718238.html 感谢楼主的贡献 查询优化器的任务是发现执行SQL查询的最佳方案.大多数查询优化器,包括MySQL的查询优化器,总或多或少地在所有可能的查询评估方案中搜索最佳方案.对于联接查询,MySQL优化器所调查的可能的方案数随查询中所引用的表的数目呈指数增长.对于小数量的表(典型小于7-10),这不是一个问题.然而,当提交的查询更大时,查询优化所花的时间会很容易地成为服务器性能的主要瓶颈. 查询优化的一个…
如果对优化器选择的执行计划不满意,可以使用优化器提供的几个提示来控制最终的执行计划,关于每个提示的具体用法,建议直接阅读官方手册,一些提示和版本有直接关系,可以使用的一些提示如下: high_priority和low_priority: 这个提示告诉mysql,当多个语句同时访问某一个表的时候,哪些语句的优先级相对高一些,哪些语句的优先级相对低一些. high_priority用于select语句的时候,mysql会将其放到表的队列的最前面,而不是按照常规顺序等待,high_priority还可…
手册上查询优化器概述 查询优化器的任务是发现执行SQL查询的最佳方案.大多数查询优化器,包括MySQL的查询优化器,总或多或少地在所有可能的查询评估方案中搜索最佳方案.对于联接查询,MySQL优化器所调查的可能的方案数随查询中所引用的表的数目呈指数增长.对于小数量的表(典型小于7-10),这不是一个问题.然而,当提交的查询更大时,查询优化所花的时间会很容易地成为服务器性能的主要瓶颈. 查询优化的一个更加灵活的方法是允许用户控制优化器详尽地搜索最佳查询评估方案.一般思想是优化器调查的方案越少,它编…
某系统反馈慢SQL影响生产,查看SLOW LOG发现下面慢SQL: SELECT COUNT(DISTINCT m.batch_no) FROM ob_relation r INNER JOIN ob_batch_d d ON r.sub_order_no = d.outbound_no INNER JOIN ob_batch_m m ON d.batch_no = m.batch_no WHERE r.production_mode =1 AND r.yn=0 AND r.outbound_n…
我们在写sql的时候,经常用到in,in后面跟一堆常量列表,如id.有人说in的效率很高,而有人说很低:有人说in能使用索引,还有人说in不能使用索引... 到底是一个怎样的情况呢?我们分析以下几种情况 在这之前,我们先了解一下explain的几种type类型(本次分析即参照type类型),按照性能从高到低: const:表中的一个记录的最大值能够匹配这个查询(索引可以是主键或惟一索引).因为只有一行,这个值实际就是常数,因为MYSQL先读这个值然后把它当做常数来对待 eq_ref:在连接中,M…
explain是mysql中sql优化的一个重要手段.顾名思义,explain就是解释sql,用于表示sql是怎样执行的信息,即sql执行计划! 语法 explain statement statement包括select/insert/delete/update语句. explain会对select语句使用到每张表都会返回一行信息.在输出列出的表是按照mysql处理sql时读他们的顺序排序的.mysql使用嵌套循环联结方式处理sql中的表联结.即mysql会从第一张表读取一行,然后与第二张表,…
一:概念 - 在 索引建立之后,一条语句可能会命中多个索引,这时,索引的选择,就会交由 优化器 来选择合适的索引. - 优化器选择索引的目的,是找到一个最优的执行方案,并用最小的代价去执行语句. 二:优化器选择索引的原则? - 在数据库里面,扫描行数是影响执行代价的因素之一. - 扫描的行数越少,意味着访问磁盘数据的次数越少,消耗的 CPU 资源越少. - 当然,扫描行数并不是唯一的判断标准,优化器还会结合是否使用临时表.是否排序等因素进行综合判断. 三:优化器是如何判断扫描行数的? - MyS…
在使用Exists时,如果能正确使用,有时会提高查询速度: 1,使用Exists代替inner join 2,使用Exists代替 in 1,使用Exists代替inner join例子: 在一般写sql语句时通常会遇到如下语句: 两个表连接时,取一个表的数据,一般的写法通过关联查询(inner join): select a.id, a.workflowid,a.operator,a.stepid from  dbo.[[zping.com]]] a inner join workflowba…
查询的生命周期的下一步是将一个sql转化成一个执行计划,MySQL再依照这个执行计划和存储引擎进行交互.这包括多个子阶段:解析sql,预处理,优化sql执行计划.这个过程中任何错误(例如语法错误)都可能终止查询.这里不打算详细介绍MySQL内部实现,而只是选择性的介绍其中几个独立的部分,在实际中,这几部分可能以前执行也可能单独执行.我们的目的是帮助大家理解MySQL是如何执行查询的,以便写出更优秀的查询. · 语法解析器和预处理 首先,MySQL通过关键字语句进行解析,并生成一科对应的“解析树”…
一.为什么查询速度会慢? 一个查询的生命周期大致可以按照顺序来看:从客户端,到服务器,然后在服务器上进行解析,生成执行计划,执行,并返回结果给客户端.其中在“执行”阶段包含了大量为了检索数据到存储引擎的调用以及调用后的数据处理,包括排序.分组. 查询速度慢的原因在于:某些不必要的额外操作,某些操作被额外地重复很多次,某些操作执行得太慢. 优化查询的目的就是减少和消除这些操作所花费的时间. 二.慢查询基础:优化数据访问 查询性能低下最基本的原因是访问的数据太多.所以对于低效的查询可以从下面两个方面…
SQL Server的查询优化器是一个基于成本的优化器.它为一个给定的查询分析出很多的候选的查询计划,并且估算每个候选计划的成本,从而选择一个成本最低的计划进行执行.实际上,因为查询优化器不可能对每一个产生的候选计划进行优化,所以查询优化器会在优化时间和查询计划的质量之间进行一个平衡,尽可能的选择一个“最优”的计划. 所以,查询优化器成为SQL Server中最重要的一个组件,并且影响着SQL Server的性能.选择正确或错误的执行计划意味着查询执行时间可能存在着毫秒的,几分钟,甚至几个小时之…
MySQL explain命令显示了mysql如何使用索引来处理select语句以及连接表.可以帮助选择更好的索引和写出更优化的查询语句. 使用方法,在select语句前加上explain就可以了: mysql> explain select * from hb_cc where name='kk'\G *************************** 1. row *************************** id: 1 select_type: SIMPLE table: h…
因为生成查询计划的代价比较大,所以查询计划将会被缓存. 树形结构 SQL 查询首先被转化为树形结构,每个节点都是一个查询操作.例如: SELECT * FROM Customers C INNER JOIN Orders O ON C.cid = O.cid WHERE O.date = '2008-11-06' 可能转化成如下的树形结构 什么是优化 首先,查询优化器没有办法找到最佳的执行计划.很多复杂的情况下这个目标都是无法实现的. 所以查询优化器只会尽快的找到比较好的查询计划. 优化如何工作…
在<mysql查询优化之一:mysql查询优化常用方式>一文中列出了一些优化器常用的优化手段.查询优化器在提供这些特性的同时,也存在一定的局限性,这些局限性往往会随着MySQL版本的升级而得到改善,所以本文会列出一些常见的局限性,且不包含所有的. MySQL的万能"嵌套循环"并不是对每种查询都是最优的.不过还好,mysql查询优化器只对少部分查询不适用,而且我们往往可以通过改写查询让mysql高效的完成工作.在这我们先来看看mysql优化器有哪些局限性: 1.关联子查询 m…
1        介绍 1.1     处理流程 当MYSQL 收到一条查询请求时,会首先通过关键字对SQL语句进行解析,生成一颗“解析树”,然后预处理器会校验“解析树”是否合法(主要校验数据列和表明是否存在,别名是否有歧义等),当“解析树”被认为合法后,查询优化器会对这颗“解析树”进行优化,并确定它认为最完美的执行计划. 1.2     衡量标准 MYSQL查询优化器衡量某个执行计划是否完美的标准是“使用该执行计划时的成本”,该成本的最小单位是读取一个4K数据页的成本. 下面图中的数据说明,当…
MySQL查询优化器有几个目标,但是其中最主要的目标是尽可能地使用索引,并且使用最严格的索引来消除尽可能多的数据行. 你的最终目标是提交SELECT语句查找数据行,而不是排除数据行.优化器试图排除数据行的原因在于它排除数据行的速度越快,那么找到与条件匹配的数据行也就越快. 如何 更好的 利用索引: 1:尽量比较数据类型相同的数据列.当你在比较操作中使用索引数据列的时候,请使用数据类型相同的列.相同的数据类型比不同类型的性能要高一些. 例如,INT与BIGINT是不同的.CHAR(10)被认为是C…
在分析性能欠佳的查询时,应考虑: 1) 应用程序是否正获取超过需要的数据,即访问了过多的行或列. 2) Mysql服务器是否分析了超过需要的行. 如果发现访问的数据行数很大,而生成的结果中数据行很少,那么可以尝试修改,比如使用覆盖索引.更改架构或重写查询让优化器可以以优化的方式执行它. 优化最终集中在减少IO,降低CPU,提高查询速度. 一般应用中数据库通常是IO密集型的,大部分数据库操作中超过90%的时间是由IO操作所占用,所以减少IO访问次数是SQL优化中首要考虑的因素.除了IO外,需要再考…
在分析查询性能时,考虑EXPLAIN关键字同样很管用.EXPLAIN关键字一般放在SELECT查询语句的前面,用于描述MySQL如何执行查询操作.以及MySQL成功返回结果集需要执行的行数.explain 可以帮助我们分析 select 语句,让我们知道查询效率低下的原因,从而改进我们查询,让查询优化器能够更好的工作. 一.MySQL 查询优化器是如何工作的MySQL 查询优化器有几个目标,但是其中最主要的目标是尽可能地使用索引,并且使用最严格的索引来消除尽可能多的数据行.最终目标是提交 SEL…
在分析查询性能时,考虑EXPLAIN关键字同样很管用.EXPLAIN关键字一般放在SELECT查询语句的前面,用于描述MySQL如何执行查询操作.以及MySQL成功返回结果集需要执行的行数.explain 可以帮助我们分析 select 语句,让我们知道查询效率低下的原因,从而改进我们查询,让查询优化器能够更好的工作. MySQL 查询优化器有几个目标,但是其中最主要的目标是尽可能地使用索引.最终目标是提交 SELECT 语句查找数据行,而不是排除数据行. 使用方法,在select语句前加上ex…
索引是提高查询速度的最重要的工具.当然还有其它的一些技术可供使用,但是一 般来说引起最大性能差异的都是索引的正确使用.在MySQL邮件列表中,人们经常询问那些让查询运行得更快的方法.在大多数情况下,我们应该怀疑数据表上 有没有索引,并且通常在添加索引之后立即解决了问题.当然,并不总是这样简单 就可以解决问题的,因为优化技术本来就并非总是简单的.然而,如果没有使用索引,在很多情况下,你试图使用其它的方法来提高性能都是在浪费时间.首先使用 索引来获取最大的性能提高,接着再看其它的技术是否有用. 这一…
数据库查询优化器的艺术 作者:李海翔 Oracle公司MySQL全球开发团队.资深专家 简单的浏览了一遍,由于以前没有接触过SQL优化这些知识,读起来还是非常吃力的,不过收获还是很大的. 作者通过对Mysql.PostgreSQL这两个开源数据库查询优化器的对比,深入介绍了数据库查询优化这方面的知识. 本书开篇首先介绍了数据库查询优化的技术原理,数据库查询优化分为逻辑查询优化.物理查询优化,然后分别介绍了Mysql查询优化器的架构.原理以及具体实现,最后又对比的介绍了PostgreSQL查询优化…
逻辑分层 下面是MySQL的逻辑分层图: 连接层:连接与线程处理,这一层并不是MySQL独有,一般的基于C/S架构的都有类似组件,比如连接处理.授权认证.安全等. 服务层:包括缓存查询.解析器.优化器,这一部分是MySQL核心功能,包括解析.优化SQL语句,查询缓存目录,内置函数(日期.时间.加密等函数)的实现. 引擎层:负责数据存储,存储引擎的不同,存储方式.数据格式.提取方式等都不相同,这一部分也是很大影响数据存储与提取的性能的:对存储层的抽象. 存储层:存储数据,文件系统. 存储引擎 查看…
前言 在实际数据库项目开发中,由于我们不知道实际查询时数据库里发生了什么,也不知道数据库是如何扫描表.如何使用索引的,因此,我们能感知到的就只有SQL语句的执行时间.尤其在数据规模比较大的场景下,如何写查询.优化查询.如何使用索引就显得很重要了. 那么,问题来了,在查询前有没有可能估计下查询要扫描多少行.使用哪些索引呢? 答案是肯定的.以MySQL为例,MySQL通过explain命令输出执行计划,对要执行的查询进行分析. 什么是执行计划呢? 简单来说,就是SQL在数据库中执行时的表现情况,通常…
课程目标 完成本课程的学习后,您应该能够: •优化器的作用 •优化器的类型 •优化器的优化步骤 •扫描的基本类型 •表连接的执行计划 •其他运算方式的执行计划 •如何看执行计划顺序 •如何获取执行计划   1.优化器概述 oracle中优化器(optimizer)是SQL分析和执行的优化工具,它负责制订SQL的执行计划,也就是负责保证SQL执行的效率最高.优化器的类型:基于规则的优化器(RBO,Rule-Based Optimizer)基于成本的优化器(CBO,Cost-Based Optimi…