`
txf2004
  • 浏览: 7066189 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

MySQL怎样优化WHERE子句

阅读更多

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

 

分享到:
评论

相关推荐

    精确分析MySQL数据库中优化WHERE子句

    精确分析MySQL数据库中优化WHERE子句 在 MySQL 数据库中,WHERE 子句的优化是非常重要的,因为它可以极大地提高查询的效率。本文将详细分析 MySQL 数据库中优化 WHERE 子句的方法和技巧。 删除不必要的括号 在 ...

    MySQL数据库:where子句.pptx

    WHERE子句;WHERE子句;比较运算符用于比较(除TEXT和BLOB类型外) 两个表达式值,MySQL支持的比较运算符有:=(等于)、<(小于)、(小于等于)、>(大于)、>=(大于等于)、(相等或都等于空)、(不等于)、!=(不...

    熟练编写存储过程,抓住where子句

    数据库的学习是一项艰巨的任务,其中的存储过程尤其重要且难以学通……希望这些资源对你有所帮助!

    详解MySQL中WHERE子句的用法

    在MySQL中,WHERE子句是SQL查询语句中不可或缺的一部分,它允许你在从数据库中提取数据时设置特定的条件。WHERE子句常用于SELECT、DELETE和UPDATE操作,以过滤出满足特定条件的记录。以下是对WHERE子句更深入的解释...

    MySQL 联合索引与Where子句的优化 提高数据库运行效率

    总结起来,优化MySQL数据库性能的关键在于合理使用联合索引,并理解Where子句的执行顺序。创建合适的索引可以大大提高查询效率,但同时也需要避免索引失效的情况,如不当使用`OR`。同时,编写查询时,需考虑Where...

    MySql 5.1 参考手册.chm

    7.2.4. MySQL怎样优化WHERE子句 7.2.5. 范围优化 7.2.6. 索引合并优化 7.2.7. MySQL如何优化IS NULL 7.2.8. MySQL如何优化DISTINCT 7.2.9. MySQL如何优化LEFT JOIN和RIGHT JOIN 7.2.10. MySQL如何优化嵌套Join ...

    mysql优化笔记+资料

    2. 避免全表扫描:尽量使用WHERE子句限制查询范围,避免对整个表进行扫描。 3. 避免在WHERE子句中使用!=或操作符,它们无法使用索引。 4. 使用EXPLAIN分析查询执行计划,了解数据库如何执行查询,找出优化点。 二、...

    MYSQL

    10.5.2 SELECT 查询的速度 10.5.3 MySQL 怎样优化WHERE子句 10.5.4 MySQL 怎样优化LEFT JOIN 10.5.5 MySQL 怎样优化LIMIT 10.5.6 INSERT查询的速度 10.5.7 UPDATE查询的速度 10.5.8 ...

    mysql 千万级数据优化

    _mysql 千万级数据优化_ MySQL 是一种流行的开源关系数据库管理系统,在大规模数据处理中,MySQL 的性能优化变得非常重要。下面我们将从查询优化和 SQL 编写注意事项两个方面来讨论 MySQL 千万级数据优化。 查询...

    MySQL中文参考手册.chm

    10.5.2 SELECT 查询的速度 10.5.3 MySQL 怎样优化WHERE子句 10.5.4 MySQL 怎样优化LEFT JOIN 10.5.5 MySQL 怎样优化LIMIT 10.5.6 INSERT查询的速度 10.5.7 UPDATE查询的速度 ...

    MySQL使用WHERE子句设置查询条件

    WHERE子句设置查询条件,过滤掉不需要的数据行。  例如下面语句查询年龄大于10的数据: SELECT * FROM student WHERE age>10  WHERE子句可包括各种条件运算符: 运算符 表示形式 比较运算符(大小比较) >、...

    MySQL数据库查询优化

    MySQL中怎么写WHERE子句有利于提高查询效率? 预计时间1小时 第6课 查询优化技术理论与MySQL实践(四)------条件化简 什么是条件化简?MySQL中对什么样的条件自动进行优化?如何写出可利用索引的条件语句? 预计...

    MySQL中文参考手册

    o 6.14 怎样使MySQL安全以对抗解密高手(cracker) * 7 MySQL 语言参考 o 7.1 文字:怎样写字符串和数字 + 7.1.1 字符串 + 7.1.2 数字 + 7.1.3 十六进制值 + 7.1.4 NULL值 + 7.1.5 数据库,表,索引,列和别名...

    mysql官方中文参考手册

    7.2.4. MySQL怎样优化WHERE子句 7.2.5. 范围优化 7.2.6. 索引合并优化 7.2.7. MySQL如何优化IS NULL 7.2.8. MySQL如何优化DISTINCT 7.2.9. MySQL如何优化LEFT JOIN和RIGHT JOIN 7.2.10. MySQL如何优化嵌套Join ...

    MySQL 5.1官方简体中文参考手册

    7.2.4. MySQL怎样优化WHERE子句 7.2.5. 范围优化 7.2.6. 索引合并优化 7.2.7. MySQL如何优化IS NULL 7.2.8. MySQL如何优化DISTINCT 7.2.9. MySQL如何优化LEFT JOIN和RIGHT JOIN 7.2.10. MySQL如何优化嵌套Join ...

    MYSQL WHERE语句优化

    5. **COUNT(*)优化**:在单表查询且没有WHERE子句时,`COUNT(*)`会直接从表中检索信息,无需遍历每一行。对于非NULL表达式,MySQL也会直接返回结果。 6. **无效常数表达式的早期检测**:MySQL能快速识别并忽略不...

    Mysql性能优化教程

    **优化实战范例**中,我们可以学习如何为经常用于查询的列创建索引,如何避免在WHERE子句中使用不等操作符和函数,以及如何合理设计数据库表结构,如避免数据冗余,确保数据的一致性。 **认识影响结果集**,我们...

    Linux运维-运维课程d2-MySQL基本SQL语句(下)-11-WHERE子句之逻辑运算符.mp4

    Linux运维-运维课程d2-MySQL基本SQL语句(下)-11-WHERE子句之逻辑运算符.mp4

    MySQL性能优化中文手册

    同时,避免在WHERE子句中使用否定条件和不等运算符,这可能会导致无法使用索引。 其次,学会使用EXPLAIN分析查询执行计划,这可以帮助你理解MySQL如何处理SQL语句,包括哪些索引被使用、数据扫描的行数等。通过分析...

    百度mysql性能优化ppt

    1. **SQL优化**:讲解如何编写高效的SQL语句,避免全表扫描,使用合适的JOIN操作,以及避免在WHERE子句中使用不推荐的操作符,如!=或NOT IN。 2. **索引优化**:介绍如何设计合理的索引策略,包括单列索引、组合...

Global site tag (gtag.js) - Google Analytics