旗下导航:搜·么
当前位置:网站首页 > MySQL教程 > 正文

Mysql中常见的8种SQL毛病用法【MySQL教程】,mysql

作者:搜教程发布时间:2019-12-01分类:MySQL教程浏览:48评论:0


导读:媒介MySQL在2016年依然坚持强劲的数据库盛行度增进趋向。越来越多的客户将本身的运用建立在MySQL数据库之上,以至是从Oracle迁移到MySQL上来。但也存在部份客户在...

媒介

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网别的相干文章!

标签:mysql


欢迎 发表评论: