讲师中心 微信公众号
AI工具推荐 视频效率加速

为什么MySQL 8.0的视图处理更快_利用改进的查询折叠优化器

夜静同学_3347

夜静同学_3347

发布时间:2026-05-31 16:23:00

|

1074人浏览过

|

来源于php中文网

原创

MySQL 8.0视图查询变快的核心是优化器增强派生条件下推能力,使外部WHERE条件穿透进视图SQL执行,减少中间数据量并利用索引;该功能默认开启,但受UNION结构、嵌套派生表、函数、UDF等写法限制。

为什么mysql 8.0的视图处理更快_利用改进的查询折叠优化器

MySQL 8.0 的视图查询变快,核心不是“视图本身被优化了”,而是优化器对视图背后 SQL 的展开和重写能力大幅增强——尤其是派生条件下推(derived_condition_pushdown)在 8.0.29 后对 UNION 和聚合场景的支持更稳,让外部 WHERE 条件真正“穿透”进视图定义里执行,而不是先物化全部结果再过滤。

派生条件下推到底在推什么

MySQL 把视图(以及子查询、CTE)展开后,常会生成一个“派生表”(Derived Table),比如:

SELECT * FROM (SELECT id, name FROM users WHERE dept_id = 100) AS v WHERE v.id > 500;

旧版本中,这个 v.id > 500 很可能只作用于物化后的临时结果集;而开启 derived_condition_pushdown 后,优化器会尝试把它下推成:

SELECT id, name FROM users WHERE dept_id = 100 AND id > 500;

这才是性能跃升的关键:减少中间数据量 + 能走索引。

MySQL
MySQL

编写正确的MySQL查询,避免字符集、索引和锁方面的常见陷阱。

下载
  • derived_condition_pushdown 默认开启,但可通过 SET optimizer_switch='derived_condition_pushdown=off'; 临时关闭验证效果
  • 一旦视图定义含 LIMIT、外层条件含子查询、或用了窗口函数的 PARTITION BY 表达式不匹配,下推就会失败
  • 用 EXPLAIN FORMAT=TREE(8.0.16+)能直接看到“Condition pushdown: true”字样,比传统 EXPLAIN 更直观

UNION 视图在 8.0.29+ 真正可下推了

过去写 CREATE VIEW v AS SELECT ... FROM t1 UNION SELECT ... FROM t2,几乎必然阻断条件下推——因为优化器无法安全地把 WHERE 分发到两个分支。8.0.29 开始支持对 UNION 各分支分别下推等价条件,前提是各分支结构兼容(字段数、类型一致,且无冲突的 ORDER BY 或 LIMIT)。

  • 如果视图定义中 UNION 后跟了 ORDER BY 或 LIMIT,整个 UNION 会被视为不可下推单元
  • 避免用 UNION ALL + 外层 DISTINCT 模拟去重,这会破坏下推机会;优先用 UNION 显式语义
  • 测试时对比 EXPLAIN 的 rows 值:若 SELECT * FROM v WHERE id = 123 的 rows 接近基表单条索引查找量,说明下推成功

哪些写法依然会杀死条件下推

即便在 8.0.29,以下模式仍会让优化器放弃下推,导致“先算全量再过滤”,性能雪崩:

  • 视图定义中嵌套一层 SELECT * FROM (SELECT ...) AS v —— 这种人为派生表是下推常见断点,应扁平化为直接 JOIN 或单层 SELECT
  • 使用相关子查询,例如 SELECT u.*, (SELECT COUNT(*) FROM orders o WHERE o.user_id = u.id) cnt FROM users u
  • 在 WHERE 或 ON 中对字段用函数:WHERE YEAR(create_time) = 2024 不仅让索引失效,也切断下推路径;改用范围:create_time >= '2024-01-01' AND create_time
  • 视图里用了用户自定义函数(UDF)或存储函数,优化器无法静态分析其行为,直接禁用下推

验证下推是否生效的最小闭环

别只信文档,用三步确认你的视图是否真受益于新优化器:

  • 执行 EXPLAIN FORMAT=TREE SELECT * FROM your_view WHERE some_col = 'val';,找 Condition pushdown 行
  • 手动展开视图 SQL(用 SHOW CREATE VIEW your_view 获取定义),把外部 WHERE 条件“手写”塞进内层,再 EXPLAIN 对比两者的 key 和 rows
  • 在慢查询日志中打开 log_queries_not_using_indexes,如果视图查询不再被记录,大概率已走索引 + 下推成功

真正容易被忽略的是:下推能力高度依赖 SQL 写法的“可推理性”。哪怕 MySQL 8.0 支持了,你写的视图如果裹着多层嵌套、函数、动态逻辑,它照样选择保守策略——优化器宁可慢,也不愿错。

热门AI工具

更多
PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

相关专题

更多
mysql修改数据表名
mysql修改数据表名

MySQL修改数据表:1、首先查看数据库中所有的表,代码为:‘SHOW TABLES;’;2、修改表名,代码为:‘ALTER TABLE 旧表名 RENAME [TO] 新表名;’。php中文网还提供MySQL的相关下载、相关课程等内容,供大家免费下载使用。

2373

2023.06.20

MySQL创建存储过程
MySQL创建存储过程

存储程序可以分为存储过程和函数,MySQL中创建存储过程和函数使用的语句分别为CREATE PROCEDURE和CREATE FUNCTION。使用CALL语句调用存储过程智能用输出变量返回值。函数可以从语句外调用(通过引用函数名),也能返回标量值。存储过程也可以调用其他存储过程。php中文网还提供MySQL创建存储过程的相关下载、相关课程等内容,供大家免费下载使用。

1439

2023.06.21

mongodb和mysql的区别
mongodb和mysql的区别

mongodb和mysql的区别:1、数据模型;2、查询语言;3、扩展性和性能;4、可靠性。本专题为大家提供mongodb和mysql的区别的相关的文章、下载、课程内容,供大家免费下载体验。

855

2023.07.18

mysql密码忘了怎么查看
mysql密码忘了怎么查看

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql密码忘了怎么办呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

3332

2023.07.19

mysql创建数据库
mysql创建数据库

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql怎么创建数据库呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

5708

2023.07.25

mysql默认事务隔离级别
mysql默认事务隔离级别

MySQL是一种广泛使用的关系型数据库管理系统,它支持事务处理。事务是一组数据库操作,它们作为一个逻辑单元被一起执行。为了保证事务的一致性和隔离性,MySQL提供了不同的事务隔离级别。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

1239

2023.08.08

sqlserver和mysql区别
sqlserver和mysql区别

SQL Server和MySQL是两种广泛使用的关系型数据库管理系统。它们具有相似的功能和用途,但在某些方面存在一些显著的区别。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

5971

2023.08.11

mysql忘记密码
mysql忘记密码

MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。那么忘记mysql密码我们该怎么解决呢?php中文网给大家带来了相关的教程以及其他关于mysql的文章,欢迎大家前来学习阅读。

5182

2023.08.14

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

100

2026.10.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL vs MySQL
PostgreSQL vs MySQL

共1课时 | 192人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn