不需要在牺牲可读性的情况下重写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子句的优化的更多相关文章

  1. MYsql优化where子句

    该部分讨论where子句的优化,不仅select之中,相同的优化同样试用与delete 和update语句中的where子句: 1: 移去不必要的括号: ((a AND b) AND c OR ((( ...

  2. 分析oracle的执行计划(explain plan)并对对sql进行优化实践

    基于oracle的应用系统很多性能问题,是由应用系统sql性能低劣引起的,所以,sql的性能优化很重要,分析与优化sql的性能我们一般通过查看该sql的执行计划,本文就如何看懂执行计划,以及如何通过分 ...

  3. 转载:SqlServer数据库性能优化详解

    本文转载自:http://blog.csdn.net/andylaudotnet/article/details/1763573 性能调节的目的是通过将网络流通.磁盘 I/O 和 CPU 时间减到最小 ...

  4. mysql order by 优化 |order by 索引的应用

    在某些场景,在不做额外的排序情况下,MySQL 可以使用索引来满足 ORDER BY 子句的优化.虽然 ORDER BY并不完全精确地匹配索引,但是索引还是会被使用,只要在WHERE子句中,所有未被使 ...

  5. Oracle的优化器介绍

    Oracle优化器介绍 本文讲述了Oracle优化器的概念.工作原理和使用方法,兼顾了Oracle8i.9i以及最新的10g三个版本.理解本文将有助于您更好的更有效的进行SQL优化工作. RBO优化器 ...

  6. SQL优化----百万数据查询优化

    百万数据查询优化 1.合理使用索引 索引是数据库中重要的数据结构,它的根本目的就是为了提高查询效率.现在大多数的数据库产品都采用IBM最先提出的ISAM索引结构.索引的使用要恰到好处,其使用原则如下: ...

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

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

  8. oracle sql 优化

    2. 选择最有效率的表名顺序(只在基于规则的优化器中有效) ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,因此FROM子句中写在最后的表(基础表 driving table)将被最先 ...

  9. MYSQL查询语句优化

    mysql的性能优化包罗甚广: 索引优化,查询优化,查询缓存,服务器设置优化,操作系统和硬件优化,应用层面优化(web服务器,缓存)等等.这里的记录的优化技巧更适用于开发人员,都是从网络上收集和自己整 ...

随机推荐

  1. 六十二、SAP中的字符串运算符与文本拼接

    一.代码如下 二.输出效果如下

  2. 3.2Adding custom methods to mappers(在映射器中添加自定义方法)

    3.2Adding custom methods to mappers(在映射器中添加自定义方法) 有些情况下,我们需要实现一些MapStruct无法直接自动生成的复杂类型间映射.一种方式是复用其他已 ...

  3. SQL分组后获取其中一个字段最大值的整条记录

    SELECT * FROM( SELECT id,name,counts,createDate,row_number() OVER(partition BY name ORDER BY createD ...

  4. oracle 使用触发器实现id自增

    前提:存在数据库di_test,主键为id.1.创建一个索引sequence create sequence di_test_id minvalue 1 nomaxvalue start with 1 ...

  5. c++程序—switch分支

    #include<iostream> using namespace std; #include<string> int main() { //多元分支 cout <&l ...

  6. 关联容器--保存指针时要指定容器的比较类型---引用Effective STL

    无论何时你建立指针的关联容器,注意你也得指定容器的比较类型.大多数时候,你的比较类型只是解引用指针并比较所指向的对象(就像上面的StringPtrLess做的那样).鉴于这种情况,你手头最好也能有一个 ...

  7. VNC连接桌面

    1.#yum -y install vnc *vnc-server* 2.修改VNCServer主配置文件 #vim /etc/sysconfig/vncservers 复制最后两行并去掉行首注释符, ...

  8. 吴裕雄--天生自然TensorFlow2教程:数据统计

    import tensorflow as tf a = tf.ones([2, 2]) a tf.norm(a) tf.sqrt(tf.reduce_sum(tf.square(a))) a = tf ...

  9. Nginx系列p3:实现一个具有缓存功能的反向代理服务器

    今天我们利用 OpenResty 来实现一个反向代理服务器 step1:首先下载安装 OpenResty # 下载安装 OpenResty # 默认安装在 /usr/local 目录下,可在编译时指定 ...

  10. part8 详情页面动态路由以及banner布局

    1.<router-link>标签 a标签就会把里面文字的颜色变掉 那我们可以换一种写法 <router-link tag='li'> //这样vue就会把这个标签渲染成li标 ...