EXPLAIN sql优化方法(3)DERIVED

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介:

派生表和视图的性能

MySQL 4.1开始,它已经支持派生表、联机视图或者基本的FROM从句的子查询。

这些特性之间彼此相关,但是它们之间的性能比较如何呢?

MySQL 5.0 中的派生表似乎和视图实现的方式不同,尽管我从合并的代码基数来看觉得在查询优化上应该是一样的。

派生表仍然以临时表的方式显式地处理,而且还是没有索引的临时表(因此最好不要像在例子中那样连接2个派生表)

需要考虑的另一方面是,派生表需要被显式处理,尽管只是执行 EXPLAIN 语句。因此如果在 FROM 字句中的 SELELCT 操作上犯了错误,例如忘记了写上连接的条件,那么 EXPLAIN 可能会一直在运行。

视图则不同,它无需被显式处理,只是把查询简单地重写了一下。只有在无法合并查询或者试图创建者请求时才需要被显式处理。

这意味着它们在性能上的差别如下:

在基本的表上执行有索引 的查询,这非常快

Java代码   收藏代码
  1. mysql> SELECT * FROM test WHERE i=5 ;  
  2. +---+----------------------------------+  
  3. | i | j                                |  
  4. +---+----------------------------------+  
  5. 5 | 0c88dedb358cd96c9069b73a57682a45 |  
  6. +---+----------------------------------+  
  7. 1 row IN SET ( 0 .03 sec)  

在派生表上做同样的查询,则如老牛拉破车

Java代码   收藏代码
  1. mysql> SELECT * FROM ( SELECT * FROM test) t WHERE i=5 ;  
  2. +---+----------------------------------+  
  3. | i | j                                |  
  4. +---+----------------------------------+  
  5. 5 | 0c88dedb358cd96c9069b73a57682a45 |  
  6. +---+----------------------------------+  
  7. 1 row IN SET ( 1 min 40 .86 sec)  

在视图上查询,又快起来了 

Java代码   收藏代码
  1. mysql> CREATE VIEW v AS SELECT * FROM test;  
  2. Query OK, 0 rows affected ( 0 .08 sec)  
  3.    
  4. mysql> SELECT * FROM v  WHERE i=5 ;  
  5. +---+----------------------------------+  
  6. | i | j                                |  
  7. +---+----------------------------------+  
  8. 5 | 0c88dedb358cd96c9069b73a57682a45 |  
  9. +---+----------------------------------+  
  10. 1 row IN SET ( 0 .10 sec)  

下面的2条EXPLAIN结果也许会让你很惊讶

Java代码   收藏代码
  1. mysql> EXPLAIN SELECT * FROM v  WHERE i=5 ;  
  2. +----+-------------+-------+-------+---------------+---------+---------+-------+------+-------+  
  3. | id | select_type | TABLE | type  | possible_keys | KEY      | key_len | ref   | rows | Extra |  
  4. +----+-------------+-------+-------+---------------+---------+---------+-------+------+-------+  
  5. |  1 | PRIMARY      | test  | const | PRIMARY        | PRIMARY | 4        | const |    1 |       |  
  6. +----+-------------+-------+-------+---------------+---------+---------+-------+------+-------+  
  7. 1 row IN SET ( 0 .02 sec)  
  8.    
  9. mysql> EXPLAIN SELECT * FROM ( SELECT * FROM test) t WHERE i=5 ;  
  10. +----+-------------+------------+------+---------------+------+---------+------+---------+-------------+  
  11. | id | select_type | TABLE       | type | possible_keys | KEY   | key_len | ref  | rows    | Extra       |  
  12. +----+-------------+------------+------+---------------+------+---------+------+---------+-------------+  
  13. |  1 | PRIMARY      | <derived2> | ALL   | NULL           | NULL | NULL     | NULL | 1638400 | USING WHERE |  
  14. |  2 | DERIVED     | test       | ALL   | NULL           | NULL | NULL     | NULL | 1638400 |             |  
  15. +----+-------------+------------+------+---------------+------+---------+------+---------+-------------+  
  16. 2 rows IN SET ( 54 .90 sec)  

避免使用派生表 -- 如果可能,最好采用其他方式来编写查询语句,大部分情况都比派生表来的快。很多情况下,甚至连独立的临时表都来的快,因为可以适当增加索引。

可以考虑使用临时试图来取代派生表 如果确实需要在 FROM 子句中使用到子查询,可以考虑在查询时创建试图,当查询完之后删除试图。

不适合多表视图,多表时用派生表取代视图

Java代码   收藏代码
  1. explain  select sum(pdm.qty) pre_total,pd.pre_doc_id from prepare_doc pd  
  2. left join pre_doc_item pdm on pd.pre_doc_id=pdm.pre_doc_id group by pd.pre_doc_id  


 

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
1天前
|
SQL 缓存 关系型数据库
一次sql改写优化子查询的案例
在生产环境中,一个MySQL RDS实例遭遇了高CPU使用率问题,原因是执行了一条复杂的UPDATE SQL语句,该语句涉及一个无法缓存的子查询(UNCACHEABLE SUBQUERY),导致子查询需要针对每一行数据重复执行,极大地影响了性能。SQL语句的目标是更新一行数据,但执行时间长达30秒。优化方法是将子查询转换为内连接形式,优化后的语句执行时间降低到毫秒级别,显著减少了CPU消耗。通过示例数据和执行计划对比,展示了优化前后的时间差异和执行效率的提升。
|
1天前
|
存储 SQL 关系型数据库
掌握高性能SQL的34个秘诀🚀多维度优化与全方位指南
掌握高性能SQL的34个秘诀🚀多维度优化与全方位指南
|
1天前
|
SQL 存储 关系型数据库
【MySQL系列笔记】SQL优化
SQL优化是通过调整数据库查询、索引、表结构和配置参数等方式,提高SQL查询性能和效率的过程。它旨在减少查询执行时间、减少系统资源消耗,从而提升数据库系统整体性能。优化方法包括索引优化、查询重写、表分区、适当选择和调整数据库引擎等。
231 3
|
1天前
|
SQL Oracle 关系型数据库
常见 SQL 注入绕过方法
常见 SQL 注入绕过方法
|
1天前
|
SQL Oracle 关系型数据库
利用 SQL 注入提取数据方法总结
利用 SQL 注入提取数据方法总结
|
1天前
|
SQL 关系型数据库 MySQL
利用 SQL 注入识别数据库方法总结
利用 SQL 注入识别数据库方法总结
|
1天前
|
SQL 数据库
常见寻找 SQL 注入方法总结
常见寻找 SQL 注入方法总结
|
1天前
|
存储 SQL 缓存
30个业务场景的SQL优化
这些优化策略和示例可以帮助改善 `SQL` 查询的性能和效率。在实践中,需要综合考虑数据库设计、`SQL` 编写、服务器配置等多方面因素,选择合适的优化方法,并进行充分的测试和验证。以上 30 个经验是 V 哥在实际经验中总结的内容,当然,业务场景不同,具体的优化策略也会不同,按实际情况处理,这不就是程序员要做的事情么。
|
1天前
|
SQL 存储 算法
clickhouse SQL优化
clickhouse 是 OLAP 数据库,但其具有独特的索引设计,所以如果拿 MySQL 或者其他 RDB 的优化经验来优化 clickhouse 可能得不到很好的效果,所以特此单独整理一篇文档,用于有 SQL 优化需求的同学,本人接触 clickhouse 时间也不长,难免有不足的地方,如果大家发现错误,还请不吝指正。
|
1天前
|
SQL 关系型数据库 MySQL
【MySQL】SQL优化
【MySQL】SQL优化