这一章节讨论能够在WHERE处理语句中使用的优化. 样例使用SELECT 语句, 但是同样适用于DELETE,UPDATE语句中的WHERE语句.

注意

因为MYSQL优化器在不断的发展,MySQL执行的优化行为并不完全包含在这里.

你或许会重写你的查询来让计算操作更快,或许会牺牲一些可读性.你通常可以不用浪费这个时间,因为MySQL会自动执行相同的优化,
而且会让查询更加容易理解,更加容易维护.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=5 //可以推导出 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.索引使用的常量表达只预估一次(MySQL索引基于代价模型)

5.COUNT(*)在单个数据表上执行,且没有where语句,结果直接从表信息中取回(对于MyISAM和MEMORY数据表)。同样也适用于在一个数据表上使用非空的表达式.

6.尽早的检测非法的常量表达式.某些SELECT 可能返回空的结果集.

7.如果没有使用GROUP BY或者其他聚合函数(COUNT(),MIN()....其他的聚合函数)HAVING会被合并到where

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包含列来自的数据表和join队列里第一个数据表不同,一个临时表将会被创建.

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 tb1_name;

SELECT MAX(key_part2) FROM tb1_name WHERE key_part1=constant

SELECT ... FROM tb1_name ORDER BY key_part1,key_part2,....LIMIT 10

SELECT ... FROM tb1_name ORDER BY key_part1 DESC,key_part2 DESC,.... LIMIT 10;

对于以下查询,MySQL只用索引树,假定索引的列是数字类型(numeric)

SELECT key_part1,key_part2 FROM tb1_name WHERE key_part1 =val;

SELECT COUNT(*) FROM tb1_name
WHERE key_part1=val1 AND key_part2=val2;

SELECT key_part2 FROM tb1_name GROUP BY key_part1;

以下查询使用索引按照排序顺序取回行而不用再次排序.
SELECT ... FROM tb1_name
ORDER BY key_part1,key_part2,...

SELECT ... FROM tb1_name ORDER BY key_part1 DESC,key_part2 DESC,....;

8.2.1.2-MySQL如何优化 WHERE 语句的更多相关文章

  1. 浅谈MySQL中优化sql语句查询常用的30种方法 - 转载

    浅谈MySQL中优化sql语句查询常用的30种方法 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中使 ...

  2. MySQL中优化sql语句查询常用的30种方法

      1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使 ...

  3. MySQL中优化sql语句查询常用的种方法

    1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索 ...

  4. 浅谈MySQL中优化sql语句查询常用的30种方法

    1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索 ...

  5. Mysql 性能优化7【重要】sql语句的优化 浅谈MySQL中优化sql语句查询常用的30种方法(转)

    原文链接   http://www.jb51.net/article/39221.htm 这篇文章大家都在转载,估计写的有条理吧,本人稍微做一下补充 1.对查询进行优化,应尽量避免全表扫描,首先应考虑 ...

  6. 浅谈 MySQL 中优化 SQL 语句查询常用的 30 种方法

    1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索 ...

  7. MySQL 下优化SQL语句的一些经验

    http://java-guru.iteye.com/blog/143377

  8. mysql性能优化-简易版

    mysql性能优化 sql语句优化 如何发现有问题的sql? 开启mysql慢查询 show variables like 'slow_query_log' set global slow_query ...

  9. MySQL查询不使用索引汇总 + 如何优化sql语句

    不使用索引原文 : http://itlab.idcquan.com/linux/MYSQL/918330.html MySQL查询不使用索引汇总 众所周知,增加索引是提高查询速度的有效途径,但是很多 ...

  10. Mysql - 性能优化之子查询

    记得在做项目的时候, 听到过一句话, 尽量不要使用子查询, 那么这一篇就来看一下, 这句话是否是正确的. 那在这之前, 需要介绍一些概念性东西和mysql对语句的大致处理. 当Mysql Server ...

随机推荐

  1. EXPLAIN执行计划中要重点关注哪些要素

    MySQL的EXPLAIN当然和ORACLE的没法比,不过我们从它输出的结果中,也可以得到很多有用的信息. 总的来说,我们只需要关注结果中的几列: 列名 备注 type 本次查询表联接类型,从这里可以 ...

  2. windows下vscode修复c++找不到头文件

    因为原博客太长将部分内容分开 vscode找不到头文件的问题是由于windows下vscode默认的编译器是微软的MSVC(vs使用的编译器)的头文件路径 如果你没有安装vs肯定会因为找不到头文件而报 ...

  3. 转自高手关于SQL 锁的叙述。。(nolock,rowlock,tablock,xlock,paglock)

    锁的概述 一. 为什么要引入锁 多个用户同时对数据库的并发操作时会带来以下数据不一致的问题: [丢失更新]A,B两个用户读同一数据并进行修改,其中一个用户的修改结果破坏了另一个修改的结果,比如订票系统 ...

  4. WhereHows前后端配置文件

    前端: # This is the main configuration file for the application. # ~~~~~ # Secret key # ~~~~~ # The se ...

  5. zTree分批异步加载方式下实现节点搜索功能(转载)

    原文地址:https://segmentfault.com/a/1190000004657854 最近公司做一个项目用到zTree,zTree功能强大就不用多说了,相信用过的人都知道.       公 ...

  6. DevOps利器- Hygieia平台开发部署

    前言碎语 Hygieia是什么? Capitalone(全美十大银行之一)开源的DevOps利器.使用Hygieia后,在整个软件开发周期中,用户可以选择VersionOne或Jira进行用户故事的追 ...

  7. 开发框架-.Net:Learun(力软敏捷开发)

    ylbtech-开发框架-.Net:Learun(力软敏捷开发) 1.返回顶部   2.返回顶部 1. 系统简介:(1)后台采用MVC+EF架构,前台使用Jquery+Bootstrap,界面美观大气 ...

  8. IntelliJ IDEA2017 激活方法 最新的

    今天打开电脑,非常不幸,idea出问题了!!! 大部分人以前应该都是用的以下方法: 1. 到网站 http://idea.lanyus.com/ 获取注册码 2.填入下面的license server ...

  9. 保持url唯一性 解决多个网站首页问题

    原文地址:http://www.seowhy.com/bbs/thread-2694339-1-1.html 在网站SEO优化过程中,经常会遇到这样或者那样的常见技术型问题,达闻现将此类常见技术问题总 ...

  10. 20165312 C语言基础调查和JAVA学习展望

    C语言基础调查和JAVA学习展望 一.有关学习技能的经历 掌握一项技能,我认为最重要的是练习和认真程度. 我在上幼儿园的时候学过电子琴,上台表演过多次,但是三四年之后就半途而废了,后来小学毕业之后对钢 ...