iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >这8种常见的SQL错误用法,80%的人还在使用
  • 652
分享到

这8种常见的SQL错误用法,80%的人还在使用

这8种常见的SQL错误用法,80%的人还在使用 2017-08-02 13:08:20 652人浏览 才女
摘要

点点这个链接免费获取:【推荐】2020年最新Java电子书集合.pdf(吐血整理) >>> 1、LIMIT 语句   分页查询是最常用的场景之一,但也通常也是最容易出问题的地方。比如对于下面简单的语句,一般 DBA 想到的办法是在

这8种常见的SQL错误用法,80%的人还在使用

点点这个链接免费获取:【推荐】2020年最新Java电子书集合.pdf(吐血整理) >>>

1、LIMIT 语句

 

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

 

这8种常见的SQL错误用法,80%的人还在使用

 

 

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

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

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

这8种常见的SQL错误用法,80%的人还在使用

 

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

 

2、隐式转换

 

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

这8种常见的SQL错误用法,80%的人还在使用

 

其中字段 bpn 的定义为 varchar(20),Mysql 的策略是将字符串转换为数字之后再比较。函数作用于表字段,索引失效。

上述情况可能是应用程序框架自动填入的参数,而不是程序员的原意。现在应用框架很多很繁杂,使用方便的同时也小心它可能给自己挖坑。

 

3、关联更新、删除

虽然 mysql5.6 引入了物化特性,但需要特别注意它目前仅仅针对查询语句的优化。对于更新或删除需要手工重写成 JOIN。

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

 

这8种常见的SQL错误用法,80%的人还在使用

 

执行计划:

这8种常见的SQL错误用法,80%的人还在使用

 

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

这8种常见的SQL错误用法,80%的人还在使用

 

执行计划简化为:

这8种常见的SQL错误用法,80%的人还在使用

 

 

4、混合排序

 

MySQL 不能利用索引进行混合排序。但在某些场景,还是有机会使用特殊方法提升性能的。

这8种常见的SQL错误用法,80%的人还在使用

 

执行计划显示为全表扫描:

这8种常见的SQL错误用法,80%的人还在使用

 

由于 is_reply 只有0和1两种状态,我们按照下面的方法重写后,执行时间从1.58秒降低到2毫秒。

这8种常见的SQL错误用法,80%的人还在使用

 

 

5、EXISTS语句

 

MySQL 对待 EXISTS 子句时,仍然采用嵌套子查询的执行方式。如下面的 SQL 语句:

这8种常见的SQL错误用法,80%的人还在使用

 

执行计划为:

这8种常见的SQL错误用法,80%的人还在使用

 

去掉 exists 更改为 join,能够避免嵌套子查询,将执行时间从1.93秒降低为1毫秒。

这8种常见的SQL错误用法,80%的人还在使用

 

新的执行计划:

这8种常见的SQL错误用法,80%的人还在使用

 

6、条件下推

外部查询条件不能够下推到复杂的视图或子查询的情况有:

 

  • 聚合子查询;
  • 含有 LIMIT 的子查询;
  • UNION 或 UNioN ALL 子查询;
  • 输出字段中的子查询;

 

如下面的语句,从执行计划可以看出其条件作用于聚合子查询之后

这8种常见的SQL错误用法,80%的人还在使用

 

这8种常见的SQL错误用法,80%的人还在使用

 

确定从语义上查询条件可以直接下推后,重写如下:

这8种常见的SQL错误用法,80%的人还在使用

 

执行计划变为:

这8种常见的SQL错误用法,80%的人还在使用

 

7、提前缩小范围

先上初始 SQL 语句:

这8种常见的SQL错误用法,80%的人还在使用

 

数为90万,时间消耗为12秒。

这8种常见的SQL错误用法,80%的人还在使用

 

由于最后 WHERE 条件以及排序均针对最左主表,因此可以先对 my_order 排序提前缩小数据量再做左连接。SQL 重写后如下,执行时间缩小为1毫秒左右。

这8种常见的SQL错误用法,80%的人还在使用

 

再检查执行计划:子查询物化后(select_type=DERIVED)参与 JOIN。虽然估算行扫描仍然为90万,但是利用了索引以及 LIMIT 子句后,实际执行时间变得很小。

这8种常见的SQL错误用法,80%的人还在使用

 

 

8、中间结果集下推

 

再来看下面这个已经初步优化过的例子(左连接中的主表优先作用查询条件):

这8种常见的SQL错误用法,80%的人还在使用

 

那么该语句还存在其它问题吗?不难看出子查询 c 是全表聚合查询,在表数量特别大的情况下会导致整个语句的性能下降。

其实对于子查询 c,左连接最后结果集只关心能和主表 resourceid 能匹配的数据。因此我们可以重写语句如下,执行时间从原来的2秒下降到2毫秒。

这8种常见的SQL错误用法,80%的人还在使用

 

但是子查询 a 在我们的SQL语句中出现了多次。这种写法不仅存在额外的开销,还使得整个语句显的繁杂。使用 WITH 语句再次重写:

这8种常见的SQL错误用法,80%的人还在使用

 

总结

数据库编译器产生执行计划,决定着SQL的实际执行方式。但是编译器只是尽力服务,所有数据库的编译器都不是尽善尽美的。

上述提到的多数场景,在其它数据库中也存在性能问题。了解数据库编译器的特性,才能避规其短处,写出高性能的SQL语句。

程序员在设计数据模型以及编写SQL语句时,要把算法的思想或意识带进来。

编写复杂SQL语句要养成使用 WITH 语句的习惯。简洁且思路清晰的SQL语句也能减小数据库的负担 。

您可能感兴趣的文档:

--结束END--

本文标题: 这8种常见的SQL错误用法,80%的人还在使用

本文链接: https://www.lsjlt.com/news/5270.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • SQL的常见错误用法有哪些
    今天小编给大家分享一下SQL的常见错误用法有哪些的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1、LIMIT 语句分页查询是...
    99+
    2023-06-28
  • 8种最坑的SQL错误用法分别是哪些
    8种最坑的SQL错误用法分别是哪些,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。1、LIMIT 语句分页查询是最常用的场景之一,但也通常也是最...
    99+
    2024-04-02
  • 常见HTML5的错误用法有哪些
    这篇文章主要介绍了常见HTML5的错误用法有哪些,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、使用section作为div的替代品人们在...
    99+
    2024-04-02
  • 在Laravel中使用Git:如何避免常见的错误?
    Laravel是一个流行的PHP框架,许多开发者喜欢在其中使用Git来管理代码。Git是一个版本控制系统,它能够跟踪代码的变化并允许多人在同一时间协同工作。在本文中,我们将探讨如何在Laravel中使用Git,并且避免一些常见的错误。 初...
    99+
    2023-09-14
    django git laravel
  • SQL 中 HAVING 常见的使用方法
    目录HAVING 子句1. 寻找缺失的编号2. 查询缺少编号的最小值3. 求众数4. 求中位数5. 查询不包含 NULL 的集合6. 关系除法运算总结HAVING 子...
    99+
    2024-04-02
  • 了解这些常见的编程算法错误,避免在 Java 和 Django 中犯错
    在编程中,算法是非常重要的一部分。一个好的算法可以使得程序运行更加高效、稳定。但是,如果我们犯了一些常见的算法错误,不仅会降低程序的性能,还会导致程序的不稳定甚至崩溃。本文将介绍一些常见的编程算法错误,并且提供一些在 Java 和 Dja...
    99+
    2023-10-09
    函数 django 编程算法
  • 还原Sql Server数据库BAK备份文件的3种方式以及常见错误总结
    目录第一种方法,使用Sql Server Management Studio还原 常见错误:第二种方法,使用sql server语句还原常见错误:第三种方法,使用Navicat还原常见错误:总结第一种方法,使用...
    99+
    2023-02-02
    sqlserver备份bak文件 sqlserver还原bak文件报错 bak文件还原数据库
  • java使用@Transactional时常犯的N种错误
    目录1.在同一个类中调用2. @Transactional修饰方法不是public3. 不同的数据源4. 回滚异常配置不正确5. 数据库引擎不支持事务小结@Transactional...
    99+
    2024-04-02
  • JS使用Promise时常见的错误有哪些
    本文小编为大家详细介绍“JS使用Promise时常见的错误有哪些”,内容详细,步骤清晰,细节处理妥当,希望这篇“JS使用Promise时常见的错误有哪些”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。Promise...
    99+
    2023-07-04
  • C# foreach使用中常见的错误有哪些
    这篇文章主要讲解了“C# foreach使用中常见的错误有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C# foreach使用中常见的错误有哪些”吧!在做项目时经常会碰到用C# for...
    99+
    2023-06-17
  • 如何在使用NPM时避免常见的错误和陷阱?
    NPM(Node Package Manager)是一个包管理器,用于在Node.js中管理软件包。它是Node.js社区最流行的包管理器之一。NPM可以帮助开发者轻松地安装、更新和卸载软件包,以及管理软件包之间的依赖关系。但是,即使对于...
    99+
    2023-06-21
    并发 ide npm
  • PHP方法调用的常见错误及解决方法
    PHP方法调用的常见错误及解决方法 在PHP开发中,方法调用是一个非常常见的操作。然而,由于开发人员可能会犯一些常见的错误,导致程序出现问题。本文将介绍一些常见的方法调用错误以及相应的...
    99+
    2024-02-29
    错误 方法 php 作用域
  • JS使用Promise时常见的5个错误总结
    目录1.避免 Promise 地狱2.在 Promise 中使用 try/catch 块3.在 Promise 块内使用异步函数4.在创建 Promise 后立即...
    99+
    2022-11-13
    JS Promise 错误 JS Promise Promise 错误
  • Linux中使用curl命令访问https站点的4种常见错误和解决方法
    这篇文章主要讲解了“Linux中使用curl命令访问https站点的4种常见错误和解决方法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Linux中使用curl命令访问https站点的4种常...
    99+
    2023-06-13
  • C++ 中使用 STL 函数对象的常见错误和陷阱
    stl 函数对象的常见错误和陷阱包括:忘记捕获默认成员变量。意外的值捕获。修改内部状态。类型不匹配。并发问题。 C++ 中使用 STL 函数对象的常见错误和陷阱 简介 函数对象(函数式...
    99+
    2024-04-26
    stl 陷阱 c++ 编译错误
  • 在HTML中使用CSS的常见方法有哪些
    这篇文章主要讲解了“在HTML中使用CSS的常见方法有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“在HTML中使用CSS的常见方法有哪些”吧!层叠样式...
    99+
    2024-04-02
  • PHP中使用explode函数时常见的错误及解决方案
    标题:PHP中使用explode函数时常见的错误及解决方案 在PHP中,explode函数是用于将字符串分割成数组的常用函数。然而,由于使用不当或者数据格式不正确,可能会导致一些常见的...
    99+
    2024-03-11
    错误 php explode
  • 使用 PHP 函数的最佳实践有哪些,以避免常见的错误?
    php 函数最佳实践包括:1. 使用类型提示声明参数和返回值类型;2. 使用默认参数值避免冗长的条件检查;3. 检查函数是否返回预期的值;4. 使用 try-catch 块处理异常;5....
    99+
    2024-05-01
    php最佳实践
  • chatGPT使用及注册过程中常见的一些错误解决方法(所以报错汇总)
    目录前言一、在注册或者使用chatGPT之前要做的准备工作。二、chatGPT注册过程及使用过程中报错解决方法。1、Access denied,报错1020   ...
    99+
    2023-02-08
    chatGPT注册报错 chatGPT使用
  • 数据科学家在使用Python时常犯的九个错误
    最佳实践都是从错误中总结出来的,所以这里我们总结了一些遇到的最常见的错误,并提供了如何最好地解决这些错误的方法、想法和资源。1、不使用虚拟环境这本身不是编码问题,但我仍然认为每种类型的项目进行环境的隔离是一个非常好的实践。为什么要为每个项目...
    99+
    2023-05-14
    Python 编码 软件工程
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作