Home  >  Article  >  Database  >  MySQL学习笔记之十九 优化之where子句_MySQL

MySQL学习笔记之十九 优化之where子句_MySQL

WBOY
WBOYOriginal
2016-06-01 13:12:07985browse

    一些小技巧:

    1、删除不必要的括号:

    ((a AND b) AND c OR (((a AND b) AND (c AND d))))
    -> (a AND b AND c) OR (a AND b AND c AND d)

    2、常数调入:

    (a    -> b>5 AND b=c AND a=5

    3、删除常数条件:

    (B>=5 AND B=5) OR (B=6 AND 5=5) OR (B=7 AND 5=6)
    -> B=5 OR B=6

    4、索引使用的常数表达式仅计算一次

    5、在一个单个表上的没有一个WHERE的COUNT(*)直接从表中检索信息。当仅使用一个表时,对任何NOT NULL表达式也这样做。

    6、无效常数表达式的早期检测。MySQL快速检测某些SELECT语句是不可能的并且不返回行。

    7、如果你不使用GROUP BY或分组函数(COUNT()、MIN()……),HAVING与WHERE合并。

    8、为每个子联结(sub join),构造一个更简单的WHERE以得到一个更快的WHERE计算并且也尽快跳过记录。

    9、所有常数的表在查询中的任何其他表前被首先读出。一个常数的表是:

       一个空表或一个有1行的表。

       与在一个UNIQUE索引、或一个PRIMARY KEY的WHERE子句一起使用的表,这里所有的索引部分使用一个常数表达式并且索引部分被定义为NOT NULL。

       所有下列的表用作常数表:

       mysql> SELECT * FROM t WHERE primary_key=1;

       mysql> SELECT * FROM t1,t2

       WHERE t1.primary_key=1 AND t2.primary_key=t1.id;

    10、对联结表的最好联结组合是通过尝试所有可能性来找到:(。如果所有在ORDER BY和GROUP BY的列来自同一个表,那么当廉洁时,该表首先被选中。

    11、如果有一个ORDER BY子句和一个不同的GROUP BY子句,或如果ORDER BY或GROUP BY包含不是来自联结队列中的第一个表的其他表的列,创建一个临时表。

    12、如果你使用SQL_SMALL_RESULT,MySQL将使用一个在内存中的表。

    13、因为DISTINCT被变换到在所有的列上的一个GROUP BY,DISTINCT与ORDER BY结合也将在许多情况下需要一张临时表。

    14、每个表的索引被查询并且使用跨越少于30% 的行的索引。如果这样的索引没能找到,使用一个快速的表扫描。

    15、在一些情况下,MySQL能从索引中读出行,甚至不咨询数据文件。如果索引使用的所有列是数字的,那么只有索引树被用来解答查询。 

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn