一  优化SELECT语句

1.1 WHERE子句优化

  本文暂时只讨论可以处理WHERE子句的优化,下面的一些实例使用SELECT语句,但是相同的优化同样适用DELETE和UPDATE语句中的WHERE子句,同样文中有些作者也不理解的地方,希望路过的大神指教

 你或许会重写你的查询来让计算操作更快,或许会牺牲一些可读性.你通常可以不用浪费这个时间,因为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

    --> b > 5 and b = c and a = 5

  3 恒定条件去除 (去除无用的sql条件)

    ( b >=5 and b = 5 ) or ( b = 6 and 5 = 5 ) or ( b = 7 and 5 = 6 )

    ---> b = 5 or b = 6

  4 索引使用的常量表达式仅计算一次  ?

  5 COUNT(*)优化

    COUNT(*)在没有WHERE的单个表上时直接从Myisam和MEMORY表的表信息中检索. 当仅与一个表使用时,这也适用于任何 NOT NULL表达式。

    对于诸如Innodb之类的事务型存储引擎,不会存储确切的行数,因为可能正在发生多个事务,每个事务都可能影响计数,

  6 尽早检测无效的常量表达式

    MySQL快速检测到一些select语句是不可能的,并且不返回任何的行。

  7 尽量将WHERE、HAVING合并

    如果不使用GROUP  BY 或聚合函数 (COUNT() MIN() AVG()等),尽量将HAVING与WHERE合并

    select * from t1 (select * from tab where id > 10) as t2 where t1.age > 10 and t2.age < 25

    --> select * from t1,tab as t2 where t1.age > 10 and t2.id > 10 and t2.age < 25.

    具体步骤:

    1)from与form合并,修改相应的参数

    2)where与where合并,用and连接

    3)修改相应的谓词(in改=)

  8  对于连接中的每个表,构造一个更简单的WHERE条件,以便快速的对表的条件进行评估,并尽可能快的跳过行。(连接的时候  join on 的列要简单)

  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_REDULT选项,MySQL使用内存临时表

  13  每个数据表的索引都会被查询,会使用一个最好的索引,除非优化器相信当前选择直接表扫描更加高效.从前,最佳索引判断是索引是否能够过滤表的
  百分之30的数据.但是固定的百分比将不会是决定使用索引还是表扫描的因素. 当前的优化器现在更加复杂,基于包含其他因素的估价模型,比如表的大小,行的数目,
  I/O块数目.

  14 在有些样例下,MySQL能够从索引中直接读取行并且不用读取数据文件,如果索引中所有的行都是数字类型,仅使用索引书来解决查询

  15  在每一行输出前,跳过与HAVING子句不匹配的行

  16 优化选择条件的排列顺序, 把能够过滤更多数据的条件放在前面,过滤少的条件放在后面

  例如: select * from user

    where id = 1                     // 条件1 过滤数据较多

    and class_id > 1000;        // 条件2 过滤数据较少

下面是一些查询速度较快的示例:

select count(*) from t1;

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性能优化之数据库级别优化--优化sql语句的更多相关文章

  1. mysql优化(三)–explain分析sql语句执行效率

    mysql优化(三)–explain分析sql语句执行效率 mushu 发布于 11个月前 (06-04) 分类:Mysql 阅读(651) 评论(0) Explain命令在解决数据库性能上是第一推荐 ...

  2. MySQL面试题之如何优化一条有问题的SQL语句?

    如何优化一条有问题的sql语句? 针对sql语句的优化.我们可以从如下几个角度去分析 回归到表的设计层面,数据类型选择是否合理 大表碎片的整理是否完善 表的统计信息,是不是准确的 审查表的执行计划,判 ...

  3. 优化、分析Mysql表读写、索引等操作的sql语句效率优化问题

    为什么要优化: 随着实际项目的启动,数据库经过一段时间的运行,最初的数据库设置,会与实际数据库运行性能会有一些差异,这时我们 就需要做一个优化调整. 数据库优化这个课题较大,可分为四大类: >主 ...

  4. 如何找出MySQL数据库中的低效SQL语句

    面对业务的迅猛发展,DBA的一项重要工作就是及时发现数据库中的低效SQL语句,有的可以立刻着手解决(比如缺少合适的索引),有的需要尽快反馈给开发人员进行修改. MySQL数据库有几个配置选项可以帮助我 ...

  5. mysql用户授权、数据库权限管理、sql语法详解

    mysql用户授权.数据库权限管理.sql语法详解 —— NiceCui 某个数据库所有的权限 ALL 后面+ PRIVILEGES SQL 某个数据库 特定的权限SQL mysql 授权语法 SQL ...

  6. Python3:sqlalchemy对mysql数据库操作,非sql语句

    Python3:sqlalchemy对mysql数据库操作,非sql语句 # python3 # author lizm # datetime 2018-02-01 10:00:00 # -*- co ...

  7. mysql(1)—— 详解一条sql语句的执行过程

    SQL是一套标准,全称结构化查询语言,是用来完成和数据库之间的通信的编程语言,SQL语言是脚本语言,直接运行在数据库上.同时,SQL语句与数据在数据库上的存储方式无关,只是不同的数据库对于同一条SQL ...

  8. 创建数据库和表的SQL语句【转】

    创建数据库和表的SQL语句 转至http://www.cnblogs.com/philanthr/archive/2011/08/09/2132398.html 创建数据库的SQL语句: 1 crea ...

  9. Oracle数据库中,在SQL语句中连接字符串的方法是哪个?(选择1项)

    Oracle数据库中,在SQL语句中连接字符串的方法是哪个?(选择1项) A.cat B.concat C.join D.+ 解答:B

  10. Python3:sqlalchemy对sybase数据库操作,非sql语句

    Python3:sqlalchemy对sybase数据库操作,非sql语句 # python3 # author lizm # datetime 2018-02-01 10:00:00 # -*- c ...

随机推荐

  1. 超实用的JavaScript代码段 Item1 --倒计时效果

    现今团购网.电商网.门户网等,常使用时间记录重要的时刻,如时间显示.倒计时差.限时抢购等,本文分析不同倒计时效果的计算思路及方法,掌握日期对象Date,获取时间的方法,计算时差的方法,实现不同的倒时计 ...

  2. JavaScript的垃圾回收机制

    JavaScript语言是一门优秀的脚本语言.其中包含脚本语言的灵活性外还拥有许多高级语言的特性.例如充许构建和实例化一个对象,垃圾回收机制(GC:Garbage Collecation).通常我们使 ...

  3. Connection reset by peer的常见原因

    1,如果一端的Socket被关闭(或主动关闭,或因为异常退出而 引起的关闭),另一端仍发送数据,发送的第一个数据包引发该异常(Connect reset by peer). Socket默认连接60秒 ...

  4. [论文解读]CNN网络可视化——Visualizing and Understanding Convolutional Networks

    概述 虽然CNN深度卷积网络在图像识别等领域取得的效果显著,但是目前为止人们对于CNN为什么能取得如此好的效果却无法解释,也无法提出有效的网络提升策略.利用本文的反卷积可视化方法,作者发现了AlexN ...

  5. FTP用户无法登陆排错详解

    FTP作为一种简单便捷的文件共享技术,在许多企业内部得到使用.若启用FTP的验证控制,管理员更可对不同的用户设置不同的访问权限,控制用户对特定内容的访问.IIS中的FTP站点只有一种验证方式,即基本验 ...

  6. 如何在当前目录下快速打开cmd(或者以管理员的身份打开)

    1.在当前目录下,按住shift键+点击右键,选择在此处打开命令窗口 很多时候我们需要打开命令行然后进入到相应目录进行一些操作. 常规的做法是: D:\foo\bar", 然后输入cd 再把 ...

  7. LinkedBlockingQueue简介

    LinkedBlockingQueue是一个单向链表实现的阻塞队列,先进先出的顺序.支持多线程并发操作. 相比于数组实现的ArrayBlockingQueue的有界,LinkedBlockingQue ...

  8. 【莫比乌斯反演】BZOJ3309 DZY Loves Math

    Description 对于正整数n,定义f(n)为n所含质因子的最大幂指数.例如f(1960)=f(2^3 * 5^1 * 7^2)=3, f(10007)=1, f(1)=0. 给定正整数a,b, ...

  9. 【强连通分量】Bzoj1194 HNOI2006 潘多拉的盒子

    Description Sulotion 首先要对每对咒语机建图,判断机器a是否能生成所有机器b生成的 如果跑一个相同的串,最后结束的点b可输出a不可输出,判断就为否 大概就用这种思路,f[x][y] ...

  10. BZOJ_1797_[Ahoi2009]Mincut 最小割_最小割+tarjan

    BZOJ_1797_[Ahoi2009]Mincut 最小割_最小割+tarjan Description A,B两个国家正在交战,其中A国的物资运输网中有N个中转站,M条单向道路.设其中第i (1≤ ...