Mysql中常见的8种SQL差错用途
前言
MySQL在2016年依然保持强劲的数据库流行度增长趋势。越来越多的客户将本人的利用创立在MySQL数据库之上,乃至是从Oracle迁移到MySQL上来。但也存在部分客户在使用MySQL数据库的历程中碰到一些比方响应时间慢,CPU打满等状况。
阿里云RDS专家效劳团队帮忙云上客户解决过许多紧急问题。现将《ApsaraDB专家诊断报告》中显现的部分常见SQL问题总结如下,供大家参照 。
1、LIMIT 语句
分页查询是最常用的场景之一,但也平常也是最容易出问题的地方。
比方关于下面简便的语句,一样 DBA 想到的方法是在 type, name, create_time 字段上加组合索引。这样前提排序都能有效的利用到索引,机能快速晋升。
SELECT * FROM operation WHERE type = 'SQLStats' AND name = 'SlowLog' ORDER BY create_time LIMIT 1000, 10;
好吧,大概90%以上的 DBA 解决该问题就到此为止。
但当 LIMIT 子句变成 “LIMIT 1000000,10” 时,程序员依然会埋怨:我只取10笔记录为什么还是慢?
要知道数据库也并不知道第1000000笔记录从什么地方开端,即便有索引也需要从头运算一次。显现这种机能问题,多数情形下是程序员偷懒了。在前端数据阅读翻页,或者大数据分批输出等场景下,是可以将上一页的最大值当做参数作为查询前提的。SQL 从新设计如下:
SELECT * FROM operation WHERE type = 'SQLStats' AND name = 'SlowLog' AND create_time > '2017-03-16 14:00:00' ORDER BY create_time limit 10;
2、隐式转换
SQL语句中查询变量和字段定义类型不匹配是另一个常见的错误。比方下面的语句:
其中字段 bpn 的定义为 varchar(20),MySQL 的战略是将字符串转换为数字之后再比力。函数作用于表字段,索引失效。
上述状况大概是利用程序框架主动填入的参数,而不是程序员的原意。此刻利用框架许多很冗杂,使用利便的同时也当心它大概给本人挖坑。
3、关联更新、删除
虽然 MySQL5.6 引入了物化特性,但需要特殊留意它当前仅仅针对查询语句的优化。关于更新或删除需要手工重写成 JOIN。
比方下面 UPDATE 语句,MySQL 实际施行的是轮回/嵌套子查询(DEPENDENT SUBQUERY),其施行时间不言而喻。
施行方案:
4、混合排序
MySQL 不克不及利用索引停止混合排序。但在某些场景,还是有时机使用非凡办法晋升机能的。
施行方案显示为全表扫描:
由于 is_reply 只要0和1两种状态,我们依照下面的办法重写后,施行时间从1.58秒落低到2毫秒。
5、EXISTS语句
MySQL 看待 EXISTS 子句时,依然采纳嵌套子查询的施行方式。如下面的 SQL 语句:
施行方案为:
去除 exists 更换为 join,能够幸免嵌套子查询,将施行时间从1.93秒落低为1毫秒。
新的施行方案:
6、前提下推
外部查询前提不克不及够下推到复杂的视图或子查询的状况有:
聚合子查询;
含有 LIMIT 的子查询;
UNION 或 UNION ALL 子查询;
输出字段中的子查询;
如下面的语句,从施行方案可以看出其前提作用于聚合子查询之后:
肯定从语义上查询前提可以直接下推后,重写如下:
SELECT target Count(*) FROM operation WHERE target = 'rm-xxxx' GROUP BY target
施行方案变为:
关于 MySQL 外部前提不克不及下推的具体说明说明请参照 文章:
http://mysql.taobao.org/monthly/2016/07/08
相理解更多相关问题请拜访PHP中文网:mysql视频教程
以上就是Mysql中常见的8种SQL错误用途的具体内容,更多请关注百分百源码网其它相关文章!