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. 创建weblogic受管理服务器和安全文件

    启动 admin server Oracle/Middleware/user_projects/domains/base_domain/bin> startWebLogic.sh 1创建受管服务 ...

  2. net图片转格式

    http://blog.csdn.net/nrlovestudy/article/details/48137339 图片转格式 Bitmap bmp=new Bitmap("filename ...

  3. 在C#.net中如何操作XML

    在C#.net中如何操作XML 需要添加的命名空间: using System.Xml; 定义几个公共对象: XmlDocument xmldoc ; XmlNode xmlnode ; XmlEle ...

  4. Swift-表格

    //1.创建表格 let tv = UITableView(frame: view.bounds, style: .Plain) //2.添加到视图 view.addSubview(tv) //3.注 ...

  5. 显卡(GPU)的基础知识

    显卡的性能指标有: 流处理器(SP)数量 核心频率 流处理器的架构 显存容量 显存频率 显存带宽 1. 流处理器的数量 把一个GPU当成是一个画画的工厂,其中流处理器的数量就是画师的数量,其数量自然是 ...

  6. Hibernate课程 初探多对多映射3-1 课程总结

    如何通过添加中间表实现多对多? 1 在双方实体中添加一个保存对方的集合. 2 在双方映射文件中 使用<set>和<many-to-many>元素进行关联关系配置(注意此处)

  7. 用 React 编写的基于Taro + Dva构建的适配不同端(微信小程序、H5、React-Native 等)的时装衣橱

    前言 Taro 是一套遵循 React 语法规范的 多端开发 解决方案.现如今市面上端的形态多种多样,Web.React-Native.微信小程序等各种端大行其道,当业务要求同时在不同的端都要求有所表 ...

  8. sharepoint2010的几个类型字段赋值和取值的方法

    1.日期类型查询,需要转换,方法如下: //转换时间 string startdate = SPUtility.CreateISO8601DateTimeFromSystemDateTime(Date ...

  9. Moodle-3.1.2 (Ubuntu 16.04 )

    平台: Ubuntu 类型: 虚拟机镜像 软件包: moodle-3.1.2 commercial education moodle open-source 服务优惠价: 按服务商许可协议 云服务器费 ...

  10. PyYAML使用

    install yum -y install PyYAML document http://www.showyounger.com/show/101586.html http://pyyaml.org ...