where 条件优化  适合select delete update
 
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 AND b=c) AND a=5
-> 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.索引使用的常量表达式只计算一次
key=35+3
->key=38
5.对于MyISAM和MEMORY表,单表进行count(*)没有where条件时,会直接从表的信息里返回结果,而不是实际执行count(*)语句,这也适合任何不为null的表达式。
select count(*) tab
select count(col1) from tab  --col1 not null
6.早期决策无效的常量表达式,MySQL很快的去决策一些select不能有行数据返回的语句。
explain select * from a where 1=2;
+----+-------------+-------+------+---------------+------+---------+------+------+------------------+
| id | select_type | table | type | possible_keys | key  | key_len | ref  | rows | Extra            |
+----+-------------+-------+------+---------------+------+---------+------+------+------------------+
|  1 | SIMPLE      | NULL  | NULL | NULL          | NULL | NULL    | NULL | NULL | Impossible WHERE |
+----+-------------+-------+------+---------------+------+---------+------+------+------------------+
7.在使用having时,如果没有使用group by或聚合函数,having条件会合并到where条件里
explain select id from a where id=2 having id>1;
+----+-------------+-------+------+---------------+----------+---------+-------+------+-------------+
| id | select_type | table | type | possible_keys | key      | key_len | ref   | rows | Extra       |
+----+-------------+-------+------+---------------+----------+---------+-------+------+-------------+
|  1 | SIMPLE      | a     | ref  | idx_a_id      | idx_a_id | 5       | const |    1 | Using index |
+----+-------------+-------+------+---------------+----------+---------+-------+------+-------------+
8.对于每个进行join的表,构造更小的where条件结果集,使得where添加跳过一些行,使查询更快速。
9.所有的常量表读取速度要快于其他表,一个常量表是下面这样的:
1>.一个空表或一个一行数据的表。
2>.与主键上的WHERE子句或惟一索引一起使用的表,其中所有索引部分都与常量表达式进行比较,并定义为NOT NULL。
下面的表使用常量表:
SELECT * FROM t WHERE primary_key=1;
SELECT * FROM t1,t2
  WHERE t1.primary_key=1 AND t2.primary_key=t1.id;
10.试着所有的join关联表的组合找到最好的组合。如果order by和group by条件是同一个表上,那么这个表会被第一个进行join。
11.如果有order by和group by不同的子句,或者这个order by或group by子句不在第一个表上,就会创建一个临时表。
12.如果使用SQL_SMALL_RESULT进行修饰,MySQL会使用内存临时表。
13.查询每个表索引,并使用最佳索引,除非优化器认为使用表扫描更有效。曾经,根据最好的索引是否超过表的30%来使用扫描,但是固定的百分比不再决定使用索引还是使用扫描。优化器现在更加复杂,它的估计基于其他因素,如表大小、行数和I/O块大小。
14.在一些情况,如果所有字段都在索引里,MySQL读所有行数据都从索引读取,不需要去数据文件读取,只使用索引树去解决所需查询。
15.在输出每一行之前,将跳过不匹配所有having子句的行
 
下面一些例子查询是很快的:
SELECT COUNT(*) FROM tbl_name;
 
SELECT MIN(key_part1),MAX(key_part1) FROM tbl_name;
 
SELECT MAX(key_part2) FROM tbl_name
  WHERE key_part1=constant;
 
SELECT ... FROM tbl_name
  ORDER BY key_part1,key_part2,... LIMIT 10;
 
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;
 
SELECT COUNT(*) FROM tbl_name
  WHERE key_part1=val1 AND key_part2=val2;
 
SELECT key_part2 FROM tbl_name GROUP BY key_part1;
 
以下排序使用索引字段,不需要进行排序操作:
 
SELECT ... FROM tbl_name
  ORDER BY key_part1,key_part2,... ;
 
SELECT ... FROM tbl_name
  ORDER BY key_part1 DESC, key_part2 DESC, ... ;  

MySQL的where条件优化的更多相关文章

  1. [MySQL Reference Manual] 8 优化

    8.优化 8.优化 8.1 优化概述 8.2 优化SQL语句 8.2.1 优化SELECT语句 8.2.1.1 SELECT语句的速度 8.2.1.2 WHERE子句优化 8.2.1.3 Range优 ...

  2. MySql学习(六) —— 数据库优化理论(二) —— 查询优化技术

    逻辑查询优化包括的技术 1)子查询优化  2)视图重写  3)等价谓词重写  4)条件简化  5)外连接消除  6)嵌套连接消除  7)连接消除  8)语义优化 9)非SPJ优化 一.子查询优化 1. ...

  3. MySQL 百万级分页优化

    MySQL 百万级分页优化 http://www.jb51.net/article/31868.htm 一般刚开始学SQL的时候,会这样写 : , ; 但在数据达到百万级的时候,这样写会慢死 : , ...

  4. mysql大内存高性能优化方案

    mysql优化是一个相对来说比较重要的事情了,特别像对mysql读写比较多的网站就显得非常重要了,下面我们来介绍mysql大内存高性能优化方案 8G内存下MySQL的优化 按照下面的设置试试看:key ...

  5. 第 8 章 MySQL 数据库 Query 的优化

      前言: 在之前“影响 MySQL 应用系统性能的相关因素”一章中我们就已经分析过了Query语句对数据库性能的影响非常大,所以本章将专门针对 MySQL 的 Query 语句的优化进行相应的分析. ...

  6. MySQL 数据库 Query 的优化

    理解MySQL的Query Optimizer MySQL Optimizer是一个专门负责优化SELECT 语句的优化器模块,它主要的功能就是通过计算分析系统中收集的各种统计信息,为客户端请求的Qu ...

  7. MySQL常用SQL语句优化

    推荐阅读这篇博文,索引说的非常详细到位:http://blog.linezing.com/?p=798#nav-3-2 在数据库日常维护中,最常做的事情就是SQL语句优化,因为这个才是影响性能的最主要 ...

  8. 通用技术 mysql 亿级数据优化

    通用技术 mysql 亿级数据优化 一定要正确设计索引 一定要避免SQL语句全表扫描,所以SQL一定要走索引(如:一切的 > < != 等等之类的写法都会导致全表扫描) 一定要避免 lim ...

  9. MYSQL常见的可优化点

    MYSQL常见的可优化点 SQL常见的可优化点 2014年6月8日 DBA 发表回复 # #################################################### 索引 ...

随机推荐

  1. Kudu的性能测试

    不多说,直接上干货! Kudu的性能测试 1.  kudu和parquet的比较   上图是官方给出的用Impala跑TPC-H的测试,对比Parquet和Kudu的计算速度.从图中我们可以发现,Ku ...

  2. Json的访问

    JSON:JavaScript 对象表示法(JavaScript Object Notation) 写法:名称/值对 访问方法:可以通过 data.名称 访问,也可以通过 data['名称'] 访问 ...

  3. CF 540D——Bad Luck Island——————【概率dp】

    Bad Luck Island time limit per test 2 seconds memory limit per test 256 megabytes input standard inp ...

  4. iOS-swift-枚举和结构体

    1.枚举 使用关键字 enum 创 建枚举. 枚举默认起始值为 0,可以自定义起始值. 在枚举中可以定义方法,和类中定义的一样. 使用关键字 rawValue 访问当前枚举的值. enum Rank: ...

  5. 远程登陆服务器(window系统)

    1,打开命令输入框: 快捷键:win+R 2.输入命令:mstsc 3.输入你的IP地址和用户名(一般为administrator) 4.输入密码

  6. [Java][Liferay] 解决在Linux系统中liferay-ext项目无法卸载的问题

    今天遇到liferay-ext无法卸载,log中显示卸载了,但是在App Manager中依然可以看到安装过的ext,其中一个原因是webapps下面的**-ext文件夹的权限只有root才能修改,将 ...

  7. 粗看ES6之JSON

    标签: es6 ES6新增JSON特性不是特别多,只是针对JSON某些情况下的写法上有一些优化: 当key值和value值对应变量名相同时 json对像中的方法书写 示例代码如下: <!DOCT ...

  8. HTML超链接实用

    1.文本链接: <a href="http://www.meng.com/" target="_blank">访问meng!</a> 2 ...

  9. jQuery异步提交时显示正在加载的提示

    $(element).ajaxStart(function() { loader.show(); }).ajaxStop(function() { loader.hide(); }).ajaxErro ...

  10. Form 头行附件查询

    查询Form的头行附件: SELECT  st.short_text order_short_text, description order_attach_desc, pk1_value order_ ...