文章插图
确保直接向下推语义查询条件,然后将其重写如下:

文章插图
请参考以下更新的执行计划 。

文章插图
7)提前缩小范围从初始SQL语句开始,如下所示 。

文章插图
数量为900,000,执行时间为12秒 。

文章插图
由于最后一个WHERE条件和排序是在最左边的主表上执行的,因此在执行左连接之前,首先要缩小数据量以进行my_order排序 。如下所示重写SQL语句后,执行时间减少到大约1毫秒 。

文章插图
查看执行计划 。实现子查询后,select_type = DERIVED参与JOIN操作 。尽管估计要扫描的行数仍为900,000,但在应用索引和LIMIT子句后,实际的执行时间会减少 。

文章插图
8)下推中间结果集让我们看一下以下最初优化的示例(查询条件首先作用于左联接中的主表):

文章插图
此声明还有其他问题吗? 不难看出,子查询c是全表聚合查询 。因此,当表的数量特别多时,整个语句的性能会下降 。
实际上,对于子查询c,左联接的最终结果集仅与匹配主表resourceid的数据有关 。因此,按如下所示重写该语句,以将执行时间从2秒减少到2毫秒 。

文章插图
但是,子查询多次出现在SQL语句中 。此方法不仅会导致额外的开销,而且会使整个语句更加复杂 。使用WITH语句再次重写该语句 。

文章插图
摘要数据库编译器生成一个执行计划,该计划确定SQL语句的实际执行方法 。但是,编译器仅尽其所能提供服务,而没有哪个数据库编译器是完美的 。
在大多数上述情况下,其他数据库中也会出现性能问题 。您必须了解数据库编译器的功能,以避免其缺点并编写高性能的SQL语句 。
在设计数据模型和编写SQL语句时,请结合您的算法思想和认识 。例如,在编写复杂的SQL语句时,请尽可能使用WITH子句 。简单明了的SQL语句还可以减轻数据库的负担 。
原始资料来源:https://www.alibabacloud.com/blog/8-sql-pitfalls-are-you-making-these-mistakes_596168
(本文翻译自Alibaba Cloud的文章《8 SQL Pitfalls: Are You Making These Mistakes?》,参考:https://medium.com/dataseries/8-sql-pitfalls-are-you-making-these-mistakes-b8f9d8181a1c)
推荐阅读
- MYSQL 由一个锁问题,带出MYSQL事务错误不回滚的问题
- 常见分布式锁实现方式
- MySQL压力测试工具,值得收藏
- MySQL 子查询优化
- MySQL Binlog 技术原理和业务应用案例分析
- mysql数据库时间类型datetime、bigint、timestamp的查询效率比较 java互联网架构
- 快速解“锁”MySQL,拿下这7把钥匙,便能撬倒面试官
- MySQL中另一种查询优化方案—重构查询的方式
- MySQL 中你必须要懂的 MVCC
- 华为二面凉凉:Linux+Redis+MySQL+算法+网络+Java一个都讲不清
