MySQL怎样优化WHERE子句

mysql|优化

    where优化主要是在SELECT中,因为他们最主要是在那里使用,但是同样的优化也可被用于DELETE和UPDATE语句。
  但请注意,下面的优化并不是完全的。MYSQL实施了许多优化,但我没时间全部测试.

  MySQL的一些优化列在下面:

  删除不必要的括号:

((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)

  常数调入:

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

  删除常数条件:

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

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

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

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

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

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

  所有常数的表在查询中的在其他任何表之前被读出。

  一个常数的表是:

  一个空表或一个有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;

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

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

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

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

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

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

  在每个记录被输出前,那些不匹配HAVING子句的行将被跳过。

  下面是一些快速的查询例子:

mysql> SELECT COUNT(*) FROM tbl_name;
mysql> SELECT MIN(key_part1),MAX(key_part1) FROM tbl_name;
mysql> SELECT MAX(key_part2) FROM tbl_name
WHERE key_part_1=constant;
mysql> SELECT ... FROM tbl_name
ORDER BY key_part1,key_part2,... LIMIT 10;
mysql> SELECT ... FROM tbl_name
ORDER BY key_part1 DESC,key_part2 DESC,... LIMIT 10;

  下列查询仅使用索引树就可解决(假设索引列是数字的):

mysql> SELECT key_part1,key_part2 FROM tbl_name WHERE key_part1=val;
mysql> SELECT COUNT(*) FROM tbl_name
WHERE key_part1=val1 AND key_part2=val2;
mysql> SELECT key_part2 FROM tbl_name GROUP BY key_part1;

  下列查询使用索引以排序顺序检索,不用一次另外的排序:

mysql> SELECT ... FROM tbl_name ORDER BY key_part1,key_part2,...
mysql> SELECT ... FROM tbl_name ORDER BY key_part1 DESC,key_part2 DESC,...

时间: 2024-11-02 04:09:32

MySQL怎样优化WHERE子句的相关文章

一些Mysql的优化经验

mysql|优化  一些 Mysql 的优化经验    1. 从数据库结构做起1. 字段类型的定义时遵循以下规则:1. 选用字段长度最小2. 优先使用定长型3. 尽可能的定义 "NOT NULL" 4. 数值型字段中避免使用 "ZEROFILL" 5. 如果要储存的数据为字符串, 且可能值已知且有限, 优先使用 enum 或 set 2. 索引的优化至关重要(以下如果没有特殊说明, 均指查询密集的情况)     1. 被索引的字段的长度越小, 该索引的效率越高2.

mysql数据库优化

mysql|数据|数据库|优化 下决心开始学oracle了,用mysql已经有不短的时间了,今天写下这些算是对自己的一个mysql之旅的一个交代吧.以下仅仅是本人在使用mysql过程中的一点个人的体会,也许存在许多纰漏和错误,还请指正!! 首先,为了使一个系统更快,最重要的部分就是基础设计,不过有些东西是现有情况下无法逾越的,比如说系统常见的瓶颈. 我所能想到的: 1:磁盘寻道能力,以高速硬盘(7200转/秒),理论上每秒寻道7200次.这是没有办法改变的,优化的方法是----用多个硬盘,或者把

mysql数据库优化(未完....待续....)

mysql|数据|数据库|优化 ########################################文件名:mysqloptimize,php                           ##主题: mysql数据库的优化                  ##作者: _Shakespeare(网络骑士)                    ##最后修改时间: 2002--09--20                      ##e-mail: shakespareshm

mysql数据库优化总结

1. 优化你的MySQL查询缓存在MySQL服务器上进行查询,可以启用高速查询缓存.让数据库引擎在后台悄悄的处理是提高性能的最有效方法之一.当同一个查询被执行多次时,如果结果是从缓存中提取,那是相当快的. 但主要的问题是,它是那么容易被隐藏起来以至于我们大多数程序员会忽略它.在有些处理任务中,我们实际上是可以阻止查询缓存工作的. 1. // query cache does NOT work 2. $r = mysql_query("SELECT username FROM user WHERE

MySQL中优化sql语句查询常用的30种方法

本篇文章是对MySQL中优化sql语句查询常用的30种方法进行了详细的分析介绍,需要的朋友参考下   1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描. 3.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如: select id from t where num is null 可以

MySQL如何优化LIMIT

MySQL如何优化LIMIT 在一些情况中,当你使用LIMIT row_count而不使用HAVING时,MySQL将以不同方式处理查询. ·         如果你用LIMIT只选择一些行,当MySQL选择做完整的表扫描时,它将在一些情况下使用索引. ·         如果你使用LIMIT row_count与ORDER BY,MySQL一旦找到了排序结果的第一个row_count行,将结束排序而不是排序整个表.如果使用索引,将很快.如果必须进行文件排序(filesort),必须选择所有匹配

MySQL如何优化

7.2.9. MySQL如何优化LEFT JOIN和RIGHT JOIN 在MySQL中,A LEFT JOIN B join_condition执行过程如下: ·         根据表A和A依赖的所有表设置表B. ·         根据LEFT JOIN条件中使用的所有表(除了B)设置表A. ·         LEFT JOIN条件用于确定如何从表B搜索行.(换句话说,不使用WHERE子句中的任何条件). ·         可以对所有标准联接进行优化,只是只有从它所依赖的所有表读取的表

解开发者之痛:中国移动MySQL数据库优化最佳实践

 章颖数据研发工程师 现任中国移动杭州研发中心数据研发工程师,擅长MySQL故障诊断,性能调优,MySQL高可用技术,曾任中国电信综合平台开发运营中心DBA   开源数据库MySQL比较容易碰到性能瓶颈,为此经常需要对MySQL数据库进行优化,而MySQL数据库优化需要运维DBA与相关开发共同参与,其中MySQL参数及服务器配置优化主要由运维DBA完成,开发则需要从数据类型优化,索引优化,SQL优化三个角度考虑MySQL数据库优化问题,本次分享将从开发角度,看如何实现MySQL数据库优化. 本次

MySQL · 性能优化 · SQL错误用法详解

前言 MySQL在2016年仍然保持强劲的数据库流行度增长趋势.越来越多的客户将自己的应用建立在MySQL数据库之上,甚至是从Oracle迁移到MySQL上来.但也存在部分客户在使用MySQL数据库的过程中遇到一些比如响应时间慢,CPU打满等情况.阿里云RDS专家服务团队帮助云上客户解决过很多紧急问题.现将<ApsaraDB专家诊断报告>中出现的部分常见SQL问题总结如下,供大家参考. 常见SQL错误用法 1. LIMIT 语句 分页查询是最常用的场景之一,但也通常也是最容易出问题的地方.比如