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

 

MySQL查询优化器4


关键词

MySQL查询优化器4

摘要

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

  另外一种情况是取回操作成功(Table1中严格只有一行满足条件unique_not_null_column = 5),那么常量表中包含一条数据,并且MySQL会将查询语句转化为:

  SELECT 5, Table2.any_column

  FROM Table1, Table2

  WHERE 5 = Table2.any_column

  AND 5 = 5;

  实际上,这个例子是个复杂的例子,这里面也用到了上文所说的常量转化。  

  7 存取类型

  当我们评估一个条件表达式,MySQL判断该表达式的存取类型。下面是一些存取类型,按照从最优到最差的顺序进行排列:

  system … 系统表,并且是常量表

  const … 常量表

  eq_ref … unique/primary索引,并且使用的是'='进行存取

  ref … 索引使用'='进行存取

MySQL查询优化器

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

  另外一种情况是取回操作成功(Table1中严格只有一行满足条件unique_not_null_column = 5),那么常量表中包含一条数据,并且MySQL会将查询语句转化为:

  SELECT 5, Table2.any_column

  FROM Table1, Table2

  WHERE 5 = Table2.any_column

  AND 5 = 5;

  实际上,这个例子是个复杂的例子,这里面也用到了上文所说的常量转化。  

  7 存取类型

  当我们评估一个条件表达式,MySQL判断该表达式的存取类型。下面是一些存取类型,按照从最优到最差的顺序进行排列:

  system … 系统表,并且是常量表

  const … 常量表

  eq_ref … unique/primary索引,并且使用的是'='进行存取

  ref … 索引使用'='进行存取

  ref_or_null … 索引使用'='进行存取,并且有可能为NULL

  range … 索引使用BETWEEN、IN、>=、LIKE等进行存取

  index … 索引全扫描

  ALL … 表全扫描

  优化器根据存取类型选择合适的驱动表达式。考虑如下的查询语句:

以下是引用片段:
SELECT *
FROM Table1
WHERE indexed_column = 5 AND unindexed_column = 6

  因为indexed_column拥有更好的存取类型,所以更有可能使用该表达式做为驱动表达式。这里只考虑简单的情况,不考虑特殊的情况。

  那么驱动表达式的意思是什么呢?考虑到这个查询语句有两种可能的执行方法:

  1) 不好的执行路径:读取表的每一行(称为“全表扫描”),对于读取到的每一行,检查相应的值是否满足indexed_column以及unindexed_column对应的条件。

  2) 好的执行路径:通过键值indexed_column=5查找B树,对于符合该条件的每一行,判断是否满足unindexed_column对应的条件。

  一般情况下,索引查找比全表扫描需要更少的存取路径,尤其当表数据量很大,并且索引的类型是UNIQUE的时候。因此称它为好的执行路径,使用indexed_column列作为驱动表达式。

 

要饭二维码

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

文章的版权

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

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

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