在前一篇文章中我们可以看到不同的查询执行计划会产生不同的成本。MySQL查询优化器并非灵丹妙药外贸网站优化不同的查询执行计划会产生不同的成本。MySQL查询优化器并非灵丹妙药我们需要通过一些手段改变它的查询计划。
1。优化SQL语句
1。只需要查询的字段列表这将对速度没有显著影响主要是为了节省内存
2。尝试使用内连接如果你必须使用左连接或右连接使用小的结果来驱动大结果——离开加入左表的结果应该尽可能小。如果有可用的条件它应该被处理在左边。正确的连接是一样的反向
3。尝试将多个联合查询分为多个语句执行
4。不要使用rand函数得到多个随机记录这将导致重复扫描
5。避免使用NULL。如果一个字段查询条件为空该领域将不会达到指数
6。使用count(*)而不是计数(列)计数(列)将判断值为空返回null数据增加了判断成本
7。使用像查询时尽量避免不前面的字段添加%您可以使用以下%第一个%不采取指数
8。不包括函数操作列的查询条件这将导致索引失败
9。在SQL语句的价值不应超过1000
2。添加一个合理的索引来减少硬盘I / O
1。中经常使用的查询条件列排序需要索引
2。如果表数据小于10000没有索引可以创建
3。在同一个表索引越少越好
4。试着只创建索引字段长度小
5。被索引的列表中重复的数据越少越好。如果它可以是独一无二的指数将达到最大化的效果。好如果1/3的表中的数据复制在一个专栏中没有必要指数这一列
6。您需要考虑匹配查询条件字段的顺序定义的指数例如a b是建立了复合索引的顺序c如果查询条件c b不能达到指数
mysql有工具来帮助我们进行性能调优?1。mysql的解释命令来查看查询计划
第一SQL下图是一个例子(解释)
结果
对特定参数的含义请参考官方文档:https://dev.mysql.com/doc/refman/5.5/en/explain-output.html
(PC端复制链接打开)
执行过程是:mysql首先比较了你的表我们根据我们。锁= 0是左连接操作条件(数据量:6777 * 5438)是不可能开放这么大的内存区域在实际内存。中间表需要写回硬盘然后是嵌套的子查询处理。查询的结果连接u r和表在内存存储在临时表中然后中间表中取出硬盘并满足你的条件的数据。id是执行计数和和操作。
2。这个概要文件的工具痕迹的线程过程
首先打开MySQL性能调试工具配置文件在默认情况下是关闭的。
设置概要= 1;
显示配置文件查询{query_id}
请参考官方文档的特定线程的意义:
https://dev.mysql.com/doc/refman/5.5/en/general线程状态。html
(PC端复制链接打开)
MySQL资料只能显示100线程状态(没有配置项可以改变显示计数在官方MySQL5.5文档)尽管它并不完整你可以看到MySQL的线程状态一直在执行的循环tmp表复制发送数据。表现消耗的过程中获取数据从硬盘复制到一个临时表并返回结果。
结论:最大的性能瓶颈是嵌套的子查询
知道存在的性能瓶颈有一个解决问题的办法:根据业务场景这个句子重写SQL使用连接而不是嵌套的子查询结合上述优化SQL的常见方法。
优化SQL语句:
优化MySQL耗时相同的查询条件下已经从之前的2 s减少到约0.03秒。
看这个SQL语句的查询执行计划再次
这个句子的查询执行的过程是先处理user_org表和查询合格标识。这里使用的在操作但当不能使用索引的数量超过1000时执行全表扫描结果存储在临时表在内存中。