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

MySQL查询优化器浅析

 2008-01-18 11:06:59 来源:WEB开发网   
核心提示: 然而,MySQL不会进行这样的转换,MySQL查询优化器浅析(8),如果你觉得使用范围查找会更好一些,应该手动地进行转换,语句可以转化为:SELECT column1 FROM Table1 GROUP BY column1;该转换的前提条件是:column1上存在索引,FROM上只有一个

然而,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排序操作。

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()的优化情况。考虑下面的查询语句:

以下是引用片段:
  SELECTMAX(column1)
  FROMTable1
  WHEREcolumn1<'a';

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

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

SELECT DISTINCT column1 FROM Table1;

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

SELECT column1 FROM Table1 GROUP BY column1;

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

上一页  3 4 5 6 7 8 

Tags:MySQL 查询 优化

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