媒介
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
相相识更多相干题目请接见ki4网:mysql视频教程
以上就是Mysql中罕见的8种SQL毛病用法的细致内容,更多请关注ki4网别的相干文章!