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

 

MySQL查询优化器7


关键词

MySQL查询优化器7

摘要

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

  13 UNION

  所有带UNION的查询语句都是单独优化的,考虑如下的查询语句:


以下是引用片段:
SELECT * FROM Table1 WHERE column1='x'
UNION ALL
SELECT * FROM Table1 WHERE column2='y'

  如果column1与column2都是拥有索引的,每个查询都是使用索引查询,然后合并结果集。

MySQL查询优化器

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

  13 UNION

  所有带UNION的查询语句都是单独优化的,考虑如下的查询语句:

以下是引用片段:
SELECT * FROM Table1 WHERE column1='x'
UNION ALL
SELECT * FROM Table1 WHERE column2='y'

  如果column1与column2都是拥有索引的,每个查询都是使用索引查询,然后合并结果集。

  14 NOT,<>

  考虑如下的表达式:

  Column1<> 5

  从逻辑上讲,该表达式等价于下面的表达式:

  Column1<5 OR column1>5

  然而,MySQL不会进行这样的转换。如果你觉得使用范围查找会更好一些,应该手动地进行转换。

  考虑如下的表达式:

  WHERE NOT (column1!=5)

  从逻辑上讲,该表达式等价于下面的表达式:

  WHERE column1=5

  同样地,MySQL也不会进行这样的转换。

  15 ORDER BY

  一般而言,ORDER BY的作用是使结果集按照一定的顺序排序,如果可以不经过此操作就能产生顺序的结果,可以跳过该ORDER BY操作。

  考虑如下的查询语句:

  SELECT column1 FROM Table1 ORDER BY 'x';

  优化器将去除该ORDER BY子句,因为此处的ORDER BY子句没有意义。

  再考虑另外的一个查询语句:

  SELECT column1 FROM Table1 ORDER BY column1;

  在这种情况下,如果column1类上存在索引,优化器将使用该索引进行全扫描,这样产生的结果集是有序的,从而不需要进行ORDER BY操作。

  再考虑另外的一个查询语句:

  SELECT column1 FROM Table1 ORDER BY column1+1;

  假设column1上存在索引,我们也许会觉得优化器会对column1索引进行全扫描,并且不进行ORDER BY操作。实际上,情况并不是这样,优化器是使用column1列上的索引进行全扫表,仅仅是因为索引全扫描的效率高于表全扫描。对于索引全扫描的结果集 仍然进行ORDER BY排序操作。

 

要饭二维码

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

文章的版权

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

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

« MySQL查询优化器6 MySQL查询优化器8 »