8种经常被忽视的SQL错误用法,你有没有踩过坑吗?

  

1,限制语句

分页查询是最常用的场景之一,但也通常也是最容易出问题的地方。比如对于下面简单的语句,一般DBA想到的办法是在类型、名称、create_time字段上加组合索引。这样条件排序都能有效的利用到索引,性能迅速提升。

SELECT *   从操作   类型=癝QLStats”   和名称=' SlowLog '   ORDER BY create_time   限制1000、10;

好吧,可能90%以上的DBA解决该问题就到此为止。但当限制子句变成“限制1000000,10”时,程序员仍然会抱怨:我只取10条记录为什么还是慢吗?

要知道数据库也并不知道第1000000条记录从什么地方开始,即使有索引也需要从头计算一次。出现这种性能问题,多数情形下是程序员偷懒了。

在前端数据浏览翻页,或者大数据分批导出等场景下,是可以将上一页的最大值当成参数作为查询条件的. sql重新设计如下:

SELECT *   从操作   类型=癝QLStats”   和名称=' SlowLog '   和create_time比;“2017-03-16 14:00:00”   ORDER BY create_time限制10;

在新设计下查询时间基本固定,不会随着数据量的增长而发生变化。

 8种经常被忽视的SQL错误用法,你有没有踩过坑?

2,隐式转换

SQL语句中查询变量和字段定义类型不匹配是另一个常见的错误。比如下面的语句:

mysql>解释扩展SELECT *   比;从my_balance b   比;在b。症=14000000123   比;和b。isverified是零;   mysql>显示警告;   | 1739 | |警告不能使用ref访问>

3,关联更新,删除

虽然MySQL5.6引入了物化特性,但需要特别注意它目前仅仅针对查询语句的优化。对于更新或删除需要手工重写成加入。欢迎大家关注我的公种浩【程序员追风】,整理了2019年多家公司java面试题资料100多页的pdf文档,文章都会在里面更新,整理的资料也会放在里面。

比如下面更新语句,MySQL实际执行的是循环/嵌套子查询(相关子查询),其执行时间可想而知。

更新操作   设置状态=坝τ谩?   在o。id(选择id   (选择o.id,   o.status   从操作啊   在o。组=123   和o。状态不在(“做”)   由o.parent秩序,   o.id   限制1)t);

执行计划:

+ - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +   | | id select_type表| | |型possible_keys关键| | key_len | ref额外| | |行   + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +   主要| 1 | | |阿指数| | 8主| | | 24 |使用的地方;使用临时|   | 2 |相关子查询| | | | | | | | |不可能的地方发现读完const表   | 3 |中| |阿ref | idx_2, idx_5 | idx_5 | 8 | const | 1 |使用;使用filesort |   + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +

重写为加入之后,子查询的选择模式从相关子查询变成,执行速度大大加快,从7秒降低到2毫秒

更新操作   加入(选择o.id,   o.status   从操作啊   在o。组=123   和o。状态不在(“做”)   由o.parent秩序,   o.id   限制1)t> + - - - - - - - - - - - - - - - - - - - - - - - - - + + - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +   | | id select_type表| | |型possible_keys关键| | key_len | ref额外| | |行   + - - - - - - - - - - - - - - - - - - - - - - - - - + + - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +   主要| 1 | | | | | | | | | |不可能的地方发现读完const表   | 2 |中| |阿ref | idx_2, idx_5 | idx_5 | 8 | const | 1 |使用;使用filesort |   + - - - - - - - - - - - - - - - - - - - - - - - - - + + - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +

8种经常被忽视的SQL错误用法,你有没有踩过坑吗?