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

 

MySQL查询优化器8


关键词

MySQL查询优化器8

摘要

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

  16 GROUP BY

  这里列出对GROUP BY子句以及相关集函数进行优化的方法:

  1) 如果存在索引,GROUP BY将使用索引。

  2) 如果没有索引,优化器将需要进行排序,一般情况下会使用HASH表的方法。

  3) 如果情况类似于“GROUP BY x ORDER BY x”,优化器将会发现ORDER BY子句是没有必要的,因为GROUP BY产生的结果集是按照x进行排序的。

  4) 尽量将HAVING子句中的条件提升中WHERE子句中。

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

  16 GROUP BY

  这里列出对GROUP BY子句以及相关集函数进行优化的方法:

  1) 如果存在索引,GROUP BY将使用索引。

  2) 如果没有索引,优化器将需要进行排序,一般情况下会使用HASH表的方法。

  3) 如果情况类似于“GROUP BY x ORDER BY x”,优化器将会发现ORDER BY子句是没有必要的,因为GROUP BY产生的结果集是按照x进行排序的。

  4) 尽量将HAVING子句中的条件提升中WHERE子句中。

  5) 对于MyISAM表,“SELECT COUNT(*) FROM Table1;”直接返回结果,而不需要进行表全扫描。但是对于InnoDB表,则不适合该规则。补充一点,如果column1的定义是NOT NULL的,那么语句“SELECT COUNT(column1) FROM Table1;”等价于“SELECT COUNT(*) FROM Table1;”。

  6) 考虑MAX()以及MIN()的优化情况。考虑下面的查询语句:

以下是引用片段:
SELECT MAX(column1)
FROM Table1
WHERE column1 < 'a';

  如果column1列上存在索引,优化器使用'a'进行索引定位,然后返回前一条记录。

  7) 考虑如下的查询语句:

  SELECT DISTINCT column1 FROM Table1;

  在特定的情况下,语句可以转化为:

  SELECT column1 FROM Table1 GROUP BY column1;

  该转换的前提条件是:column1上存在索引,FROM上只有一个单表,没有WHERE条件并且没有LIMIT条件。

 

要饭二维码

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

文章的版权

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

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

« MySQL查询优化器7 MySQL命令行基本操作 »