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服务器,缓存)等等.这里的记录的优化技巧更适用于开发人员,都是从网络上收集和自己整 ...
随机推荐
- 10.swoole学习笔记--进程队列通信
<?php //进程仓库 $workers=[]; //最大进程数 $worker_num=; //批量创建进程 ;$i<$worker_num;$i++){ //创建子进程 $proce ...
- 一百零七、SAP的OO-ALV之一,新建程序
一.来带SE38模块,新建一个Z_TIANPAN_20190807_OOALV的本地程序 二.设置一个标题,点击对勾 三.选择保存为本地对象 我们下一篇来写创建屏幕
- 087-把PHP数组中的元素按随机顺序重新排列shuffle
<?php $arr=array(3,23,'A','f','123','hello'); //定义一个数组 echo '排序之前的数组信息:<br>'; print_r($arr) ...
- (转) Spring 3 报org.aopalliance.intercept.MethodInterceptor问题解决方法
http://blog.csdn.net/henuhaigang/article/details/13678023 转自CSDN博客,因为一个jar包没引入困扰我好长时间 ,当时正在做spring A ...
- webpack散记--Typescript
Typescript 1.js的超集 官网:typescriptlang.org/tslang.cn 来自:微软 安装:官方的 npm i typescript ts-loader --save-d ...
- java嵌套循环练习
打印一个等腰三角形 package com.lv.jj; import java.util.Scanner; public class DemoDy { public static void main ...
- 每天一点点之vue框架开发 - 部署到线上
1.在项目根目录下运行如下命令 npm run build 会生成一个dist目录, 2.然后将dist目录上传至服务器就可以访问页面了,不需要配置vue环境了.
- JS页面校验
结构: 1.导入正则表达式校验包:https://blog.csdn.net/weixin_44718300/article/details/88726653 2.页面校验.HTML <!DOC ...
- 《新标准C++程序设计》3.1.1-3.1.3(C++学习笔记5)
构造函数 1.构造函数的概念和作用 (1)概念 构造函数就是一类特殊的成员函数,其名字和类一样,不写返回值类型(void也不可以写),可以有参数,可以重载. 如果定义类时没写构造函数,则编译器生成一个 ...
- centos7-DNS(主从)
一.安装DNS. 本机ip:192.168.1.3 [root@localhost ~]# yum -y install bind bind-utlis 二.编辑配置文件. [root@localho ...