1.where子句的优化
不需要在牺牲可读性的情况下重写sql,因为mysql会自动进行类似的优化。
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=
-> b> AND b=c AND a=
3.恒定条件去除
(B>= AND B=) OR (B= AND =) OR (B= AND =)
-> B= OR B=
4.走索引的常量表达式只会计算一次
5.对于没有where 条件的 单表 Count(*)直接检索Information_schema库中的统计信息(对 myisam 和 memory表)。
6.更早的察觉无效的常量表达式。mysql快速发现select语句中不可能成立的where条件并且返回no rows;
7.如果没有使用group by 或者聚合函数(count(),min().max()),having子句会被合并到where 子句中。
8.为表连接中的每个表构造一个简洁的 WHERE 语句,以得到更快的 WHERE 计算值并且尽快跳过记录
9.查询中所有的常量表都会比其他表更早读取。一个常量表符合以下几个条件:
1空表或者只有一条记录。
2与在一个 UNIQUE 索引、或一个 PRIMARY KEY 的 WHERE 子句一起使用的表,这里所有的索引部分和常数表达式做比较并且索引部分被定义为 NOT NULL。 3以下的几个表都会被当成常量表:
SELECT * FROM t WHERE primary_key=;
SELECT * FROM t1,t2
WHERE t1.primary_key= AND t2.primary_key=t1.id;
10.MySQL会进各种可能找到表连接最好的连接方法。 如果在 ORDER BY 和 GROUP BY 子句中的所有字段都来自同一个表的话,那么在连接时这个表就会优先处理
11.如果有 ORDER BY 子句和一个不同的 GROUP BY 子句,或者如果 ORDER BY 或 GROUP BY 中的字段都来自其他的表而非连接顺序中的第一个表的话,就会创建一个临时表了。
12.如果使用 SQL_SMALL_RESULT,MySQL就会使用内存临时表了。
https://blog.csdn.net/yunhua_lee/article/details/12064477
13.所有的表索引都会查询,最好的情况就是所有的索引都会被用到,除非优化程序认为全表扫描的效率更高。同时,数据表扫描是基于判断最好的索引范围超过数据表的30%。 现在,优化程序复杂多了,它基于对一些附加因素的估计,例如表大小,记录总数,I/O块大小,因此就不能根据一个固定的百分比来决定是选择使用索引还是直接扫描数据表
14.在某些情况下,MySQL可以直接从索引中取得记录而无需查询数据文件。如果所有在索引中使用的字段都是数字类型的话,只需要用索引树就能完成查询
15.每条记录输出之前,那些没有匹配 HAVING 子句的就会被跳过
16.以下查询的查询速度很快:
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 ; SELECT ... FROM tbl_name
ORDER BY key_part1 DESC, key_part2 DESC, ... LIMIT ;
17.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;
18.以下几个查询使用索引来取得经过顺序排序后的记录而无需经过独立的排序步骤
SELECT ... FROM tbl_name
ORDER BY key_part1,key_part2,... ; SELECT ... FROM tbl_name
ORDER BY key_part1 DESC, key_part2 DESC, ... ;
问题:(没有解决,只记录当前自己的理解,后继继续补充)
现在有表auditing,
有以下索引
mysql> show index from auditing;
+----------+------------+----------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+----------+------------+----------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| auditing | | PRIMARY | | id | A | | NULL | NULL | | BTREE | | |
| auditing | | idx_auditing_id | | auditing_id | A | | NULL | NULL | | BTREE | | |
| auditing | | idx_org_id | | org_id | A | | NULL | NULL | | BTREE | | |
| auditing | | idx_customerId_orgId | | customer_id | A | | NULL | NULL | | BTREE | | |
| auditing | | idx_customerId_orgId | | org_id | A | | NULL | NULL | | BTREE | | |
| auditing | | idx_take_emp_id | | take_emp_id | A | | NULL | NULL | | BTREE | | |
| auditing | | idx_flow_id | | flow_id | A | | NULL | NULL | | BTREE | | |
| auditing | | idx_name | | name | A | | NULL | NULL | | BTREE | | |
| auditing | | idx_mobile | | mobile | A | | NULL | NULL | | BTREE | | |
| auditing | | idx_identity_id | | identity_id | A | | NULL | NULL | | BTREE | | |
+----------+------------+----------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
rows in set (0.01 sec)
mysql> select customer_id,org_id from auditing limit ;
+-------------+---------------------+
| customer_id | org_id |
+-------------+---------------------+
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
+-------------+---------------------+
发现
customer_id字段是表中不存在的值,执行计划走的是idx_customerId_orgId索引,而org_id字段是表中不存在的值得时候,走的是idx_org_id索引,两个字段都是表中存在的值得时候执行计划选择
idx_customerId_orgId索引,这是因为sql优化器会做成本分析,
mysql> explain select count(*) from auditing where customer_id='' and org_id='';
+----+-------------+----------+------------+------+---------------------------------+----------------------+---------+-------------+------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref |rows | filtered | Extra |
+----+-------------+----------+------------+------+---------------------------------+----------------------+---------+-------------+------+----------+-------------+
| | SIMPLE | auditing | NULL | ref | idx_org_id,idx_customerId_orgId | idx_customerId_orgId | | const,const | | 100.00 | Using index |
+----+-------------+----------+------------+------+---------------------------------+----------------------+---------+-------------+------+----------+-------------+
row in set, warning (0.00 sec) mysql> explain select count(*) from auditing where customer_id='' and org_id='';
+----+-------------+----------+------------+------+---------------------------------+------------+---------+-------+------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered| Extra |
+----+-------------+----------+------------+------+---------------------------------+------------+---------+-------+------+----------+-------------+
| | SIMPLE | auditing | NULL | ref | idx_org_id,idx_customerId_orgId | idx_org_id | | const | | 10.00| Using where |
+----+-------------+----------+------------+------+---------------------------------+------------+---------+-------+------+----------+-------------+
row in set, warning (0.00 sec) mysql> explain select count(*) from auditing where customer_id='' and org_id='';
+----+-------------+----------+------------+------+---------------------------------+----------------------+---------+-------------+------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref |rows | filtered | Extra |
+----+-------------+----------+------------+------+---------------------------------+----------------------+---------+-------------+------+----------+-------------+
| | SIMPLE | auditing | NULL | ref | idx_org_id,idx_customerId_orgId | idx_customerId_orgId | | const,const | | 100.00 | Using index |
+----+-------------+----------+------------+------+---------------------------------+----------------------+---------+-------------+------+----------+-------------+
row in set, warning (0.00 sec)
1.where子句的优化的更多相关文章
- MYsql优化where子句
该部分讨论where子句的优化,不仅select之中,相同的优化同样试用与delete 和update语句中的where子句: 1: 移去不必要的括号: ((a AND b) AND c OR ((( ...
- 分析oracle的执行计划(explain plan)并对对sql进行优化实践
基于oracle的应用系统很多性能问题,是由应用系统sql性能低劣引起的,所以,sql的性能优化很重要,分析与优化sql的性能我们一般通过查看该sql的执行计划,本文就如何看懂执行计划,以及如何通过分 ...
- 转载:SqlServer数据库性能优化详解
本文转载自:http://blog.csdn.net/andylaudotnet/article/details/1763573 性能调节的目的是通过将网络流通.磁盘 I/O 和 CPU 时间减到最小 ...
- mysql order by 优化 |order by 索引的应用
在某些场景,在不做额外的排序情况下,MySQL 可以使用索引来满足 ORDER BY 子句的优化.虽然 ORDER BY并不完全精确地匹配索引,但是索引还是会被使用,只要在WHERE子句中,所有未被使 ...
- Oracle的优化器介绍
Oracle优化器介绍 本文讲述了Oracle优化器的概念.工作原理和使用方法,兼顾了Oracle8i.9i以及最新的10g三个版本.理解本文将有助于您更好的更有效的进行SQL优化工作. RBO优化器 ...
- SQL优化----百万数据查询优化
百万数据查询优化 1.合理使用索引 索引是数据库中重要的数据结构,它的根本目的就是为了提高查询效率.现在大多数的数据库产品都采用IBM最先提出的ISAM索引结构.索引的使用要恰到好处,其使用原则如下: ...
- MySql学习(六) —— 数据库优化理论(二) —— 查询优化技术
逻辑查询优化包括的技术 1)子查询优化 2)视图重写 3)等价谓词重写 4)条件简化 5)外连接消除 6)嵌套连接消除 7)连接消除 8)语义优化 9)非SPJ优化 一.子查询优化 1. ...
- oracle sql 优化
2. 选择最有效率的表名顺序(只在基于规则的优化器中有效) ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,因此FROM子句中写在最后的表(基础表 driving table)将被最先 ...
- MYSQL查询语句优化
mysql的性能优化包罗甚广: 索引优化,查询优化,查询缓存,服务器设置优化,操作系统和硬件优化,应用层面优化(web服务器,缓存)等等.这里的记录的优化技巧更适用于开发人员,都是从网络上收集和自己整 ...
随机推荐
- 留学萌新Essay写作须知
Essay是留学生们接触比较多的一项留学生作业,但尽管如此,依旧有部分同学对于essay写作是没有足够的把握的.随着开学季的到来,很多萌新初次接触Essay写作,难免会有很多不懂得地方.所以今天小编就 ...
- pop3&smtp
pop3&smtp pop3 Post Office Protocol - Version 3 pop3协议是离线邮件协议,是客户端取邮件用的. 默认监听在TCP:110端口. POP3会话有 ...
- C++ opencv 数字识别
#include "cv.h" #include "highgui.h" #include "cxcore.h" #include < ...
- 电动车智能充电桩温度报警方案:SI24R2F
由于现在电动自行车便捷不少民众的出行都选择这种交通工具出行,随着越来越多人都使用电动自行车,智能电动车充电桩的需求也在慢慢的变多,电动车智能充电桩的安全性也慢慢成为市场的焦点,对此SI24R ...
- 微信小程序手绘地图实现之《Canvas》
环境:微信SDK2.9+ + uniapp (可切换直接使用.map.js不限制环境) 正题: 先创建一个地图组件 <template> <view class="cu ...
- JAVA字节码文件之第四篇(方法分析)
一.Methods 方法字节码结构 Methods 字节码结构: Methods num:占两byte,Methods 的具体内存占n个byte 方法中每个属性都是Attribute_info,Att ...
- 安装swoole redis异步 hiredis swoole扩展加载失败 或者不显示问题 解决办法
当前办法仅供参考 贴上报错 找了好久 根据网上办法也试了 没解决 最后 仔细读问题 觉得可能是 hiredis路径问题 终于解决了 解决办法: 进入你的安装包目录然后执行下面 mkdir /usr/l ...
- spring+springMVC+mybatis , 项目启动遇坑
github上找的框架组合例子 结合自己的数据库作为新项目开发. 但是项目启动时,tomcat启动失败: 检查不出错误. 于是改换maven引入jetty插件来启动项目, 结果在未改动的任何代码的情况 ...
- IIS7实现访问HTTP定向至HTTPS访问
工具及软件: 系统:windows2008R2 软件:IIS7.0,IIS的Microsoft URL重写模块2.0 下载 操作步骤: 1.下载并在IIS中安装Microsoft URL重写模块2.0 ...
- 【Java】Java计时器(秒表)
https://blog.csdn.net/c_jian/article/details/50506759 应用名称:Java计时器 用到的知识:Java GUI编程 开发环境:win8+eclips ...