当前位置: 洪哥笔记 > MySQL > MySQL查询优化器6

 

MySQL查询优化器6


关键词

MySQL查询优化器6

摘要

Mysql查询优化器的工作是为查询语句选择合适的执行路径。查询优化器的代码一般是经常变动的,这和存储引擎不太一样。因此,需要理解最新 版本的查询优化器是如何组织的,请参考相应的源代码。整体而言,优化器有很多相同性,对mysql一个版本的优化器做到整体掌握,理解起mysql新版本 以及其他数据库的优化器都是类似的。

  10 转换

  MySQL对简单的表达式支持转换。比如下面的语法:

  WHERE -5 = column1

  转换为:

  WHERE column1 = -5

  尽管如此,对于有数学运算存在的情况不会进行转换。比如下面的语法:

  WHERE 5 = -column1

  不会转换为:

  WHERE column1 = -5

  11 AND

  带AND的查询的格式为: AND ,考虑如下的查询语句:

MySQL查询优化器

  Mysql查询优化器的工作是为查询语句选择合适的执行路径。查询优化器的代码一般是经常变动的,这和存储引擎不太一样。因此,需要理解最新 版本的查询优化器是如何组织的,请参考相应的源代码。整体而言,优化器有很多相同性,对mysql一个版本的优化器做到整体掌握,理解起mysql新版本 以及其他数据库的优化器都是类似的。

  10 转换

  MySQL对简单的表达式支持转换。比如下面的语法:

  WHERE -5 = column1

  转换为:

  WHERE column1 = -5

  尽管如此,对于有数学运算存在的情况不会进行转换。比如下面的语法:

  WHERE 5 = -column1

  不会转换为:

  WHERE column1 = -5

  11 AND

  带AND的查询的格式为: AND ,考虑如下的查询语句:

  WHERE column1='x' AND column2='y'

  优化的步骤:

  1) 如果两个列都没有索引,那么使用全表扫描。

  2) 否则,如果其中一个列拥有更好的存取类型(比如,一个具有索引,另外一个没有索引;再或者,一个是唯一索引,另外一个是非唯一索引),那么使用该列作为驱动表达式。

  3) 否则,如果两个列都分别拥有索引,并且两个条件对应的存取类型是一致的,那么选择定义索引时的先定义的索引。

  举例如下:

  CREATE TABLE Table1 (s1 INT,s2 INT);

  CREATE INDEX Index1 ON Table1(s2);

  CREATE INDEX Index2 ON Table1(s1);

  …

  SELECT * FROM Table1 WHERE s1=5 AND s2=5;

  优化器选择s2=5作为驱动表达式,因为s2上的索引是新建的。

  12 OR

  带OR的查询格式为: OR ,考虑如下的查询语句:

  WHERE column1='x' OR column2='y'

  优化器做出的选择是采用全表扫描。

  当然,在一些特定的情况,可以使用索引合并,这里不做阐述。

  如果两个条件里面设计的列是同一列,那么又是另外一种情况,考虑如下的查询语句:

  WHERE column1='x' OR column1='y'

  在这种情况下,该查询语句采用索引范围查找。

 

要饭二维码

洪哥写文章很苦逼,如果本文对您略有帮助,可以扫描下方二维码支持洪哥!金额随意,先行谢过!大家的支持是我前进的动力!

文章的版权

本文属于“洪哥笔记”原创文章,转载请注明来源地址:MySQL查询优化器6:http://www.splaybow.com/post/mysql16161810012008.html

如果您在服务器运维、网络管理、网站或系统开发过程有需要提供收费服务,请加QQ:8771947!十年运维经验,帮您省钱、让您放心!
亲,如果有需要,先存起来,方便以后再看啊!加入收藏夹的话,按Ctrl+D

« MySQL查询优化器5 MySQL查询优化器7 »