为什么MySQL 8.0视图性能优于旧版本_解析算法由MERGE替代TEMPTABLE

陌萱小哥_9654

陌萱小哥_9654

2026-05-25

217人浏览

原创

MySQL 8.0视图性能提升源于MERGE算法更稳定启用,而非默认变快;其前提是视图定义避开聚合、子查询等强制降级为TEMPTABLE的结构,否则仍会静默退化且索引失效。

为什么mysql 8.0视图性能优于旧版本_解析算法由merge替代temptable

MySQL 8.0 视图性能提升不是“默认变快”,而是因为 MERGE 算法在更多场景下可被实际启用,且优化器对视图展开(view expansion)的支持更稳定——前提是你的视图定义没踩中那些强制降级的坑。

ALGORITHM = MERGE 在 MySQL 8.0 才真正可用

MySQL 5.7 及之前版本,ALGORITHM = UNDEFINED 几乎总是退化为 TEMPTABLE,哪怕视图只查单表、无聚合。这不是 bug,是设计限制:旧版优化器缺乏足够上下文判断是否安全合并。MySQL 8.0 重构了视图解析路径,只要满足条件,UNDEFINED 就能稳住 MERGE;显式声明 ALGORITHM = MERGE 的成功率也显著提高。

  • 验证方式必须是 SHOW CREATE VIEW view_name,看输出里写的是 ALGORITHM=MERGE 还是悄悄变成了 TEMPTABLE
  • 别信建表语句里写的 ALGORITHM = MERGE——如果定义含子查询或 DISTINCT,MySQL 会静默改写,只发 warning(可能被客户端忽略)
  • EXPLAIN SELECT * FROM v1 WHERE id = 123 中若 type 是 ref 或 const,说明条件已下推到基表并用了索引;若是 ALL,基本就是 TEMPTABLE 在干活

MERGE 能下推 WHERE,TEMPTABLE 不能

这是性能差异的核心。MERGE 不生成中间结果,而是把外层查询的 WHERE、ORDER BY、LIMIT 直接“塞进”视图原始 SQL 里重写执行;TEMPTABLE 必须先全量扫描基表生成临时结果,再对临时表过滤——索引完全失效,数据量一过百万就明显卡顿。

MySQL
MySQL

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

下载
  • 坏例子:CREATE VIEW v_orders AS SELECT * FROM orders WHERE status = 'shipped' —— 视图里自带 WHERE,外层再加 WHERE created_at > '2024-01-01',MERGE 仍可下推,但 TEMPTABLE 会先扫出全部已发货订单,再筛时间
  • 好做法:视图只做字段投影和简单 JOIN,过滤逻辑留给调用方;例如 CREATE VIEW v_orders_basic AS SELECT id, user_id, amount FROM orders
  • WITH CHECK OPTION 只对 MERGE 生效,TEMPTABLE 下该子句被直接忽略——这也是个快速判断算法是否生效的侧写点

MySQL 8.0 默认参数让 TEMPTABLE 更“贵”了

MySQL 8.0.16+ 把临时表默认引擎从 MEMORY 换成 TempTable,表面是增强稳定性,实则放大了 TEMPTABLE 视图的开销:它不再只是内存分配问题,还涉及 mmap 内存池管理、按页落盘、磁盘 I/O 等新维度。

  • temptable_max_ram 控制内存上限(默认 1GB),超限后不是报错,而是悄悄写磁盘临时文件,监控上难察觉但延迟飙升
  • tmp_table_size 和 max_heap_table_size 对 TempTable 引擎**不直接生效**,仅间接影响其内存分配策略;误调这两个值根本压不住物化开销
  • 用 SELECT @@internal_tmp_mem_storage_engine 确认当前默认临时表引擎,避免凭经验假设还是 MEMORY

真正决定视图快不快的,从来不是 MySQL 版本号,而是你写的那条 SELECT 语句有没有触发 MERGE 的所有前提条件——少一个聚合、少一个子查询、少一个 GROUP BY,就多一分下推成功的可能。而一旦掉进 TEMPTABLE,再多的硬件资源也救不了全表扫描的命。

相关文章

数码产品性能查询
数码产品性能查询

该软件包括了市面上所有手机CPU,手机跑分情况,电脑CPU,电脑产品信息等等,方便需要大家查阅数码产品最新情况,了解产品特性,能够进行对比选择最具性价比的商品。

下载

相关标签:

mysql

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

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

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

2023.06.20

2393

6

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

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

2023.06.21

1459

5

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

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

2023.07.18

855

5

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

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

2023.07.19

3372

5

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

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

2023.07.25

5788

4

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

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

2023.08.08

1259

3

sqlserver和mysql区别
sqlserver和mysql区别

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

2023.08.11

6051

4

mysql忘记密码
mysql忘记密码

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

2023.08.14

5242

7

mysql事务隔离级别
mysql事务隔离级别

mysql规范中定义了四种事务隔离级别,不同的隔离级别对事务的处理有所不同。本专题为大家提供mysql事务隔离级别相关的文章内容,大家可以免费体验。

2023.08.16

7034

11

热门下载

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

精品课程

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

共1课时 | 193人学习