WEB开发网
开发学院数据库MySQL MySQL查询优化器浅析 阅读

MySQL查询优化器浅析

 2008-01-18 11:06:59 来源:WEB开发网   
核心提示: range … 索引使用BETWEEN、IN、>=、LIKE等进行存取index … 索引全扫描ALL … 表全扫描优化器根据存取类型选择合适的驱动表达式,考虑如下的查询语句:以下是引用片段:SELECT*FROMTable1WHEREind

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

index … 索引全扫描

ALL … 表全扫描

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

以下是引用片段:
  SELECT*
  FROMTable1
  WHEREindexed_column=5ANDunindexed_column=6

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

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

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

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

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

8 范围存取类型

一些表达式可以使用索引,但是属于索引的范围查找。这些表达式通常对应的操作符是:>、>=、<、<=、IN、LIKE、BETWEEN。

对优化器而言,如下表达式:

column1 IN (1,2,3)

该表达式与下面的表达式是等价的:

column1 = 1 OR column1 = 2 OR column1 = 3

并且MySQL也是认为它们是等价的,所以没必要手动将IN改成OR,或者把OR改成IN。

优化器将会对下面的表达式使用索引范围查找:

column1 LIKE 'x%'

上一页  1 2 3 4 5 6 7 8  下一页

Tags:MySQL 查询 优化

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接