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

为什么MySQL视图的算法选择不可忽视_对比MERGE与TEMPTABLE性能

阿芳姑娘_6563

阿芳姑娘_6563

发布时间:2026-05-27 10:52:36

|

944人浏览过

|

来源于php中文网

原创

MERGE算法决定视图能否走索引、是否可更新及锁行为,EXPLAIN中出现select_type=DERIVED即表明MERGE失效而降级为TEMPTABLE;含聚合、DISTINCT、子查询、UNION、ORDER BY等结构会强制降级,且ALGORITHM=UNDEFINED仅静态判断一次,不可控。

为什么mysql视图的算法选择不可忽视_对比merge与temptable性能

MERGE 算法不是“可选优化”,而是决定视图能否走索引、是否可更新、会不会锁全表的关键开关;写 ALGORITHM = MERGE 不等于它真在用 MERGE,MySQL 会在你没注意时静默降级为 TEMPTABLE。

为什么 EXPLAIN 显示 select_type = DERIVED 就说明 MERGE 失效了

MySQL 执行视图时,若实际走的是 TEMPTABLE,优化器会把视图当作一个派生表(DERIVED)处理:先执行视图定义、物化进临时表,再对外层查询做二次扫描。这会导致:

  • type 列常为 ALL 或 index,基表索引基本失效
  • Extra 中出现 Using temporary 或 Using filesort
  • WHERE 条件无法下推到基表,只能在临时表上过滤
  • 大结果集时内存/磁盘临时表开销陡增,QPS 明显下跌

反过来说,只要 EXPLAIN SELECT * FROM my_view WHERE x = 1 的输出里没有 DERIVED,且 type 是 ref 或 range,就大概率是 MERGE 生效了。

哪些写法会让 ALGORITHM = MERGE 被忽略

哪怕你明明白白写了 ALGORITHM = MERGE,只要视图定义中含以下任一结构,MySQL 就会直接无视该声明,强制改用 TEMPTABLE:

  • COUNT()、SUM()、AVG() 等聚合函数
  • DISTINCT 或 GROUP BY
  • 任何子查询——包括 SELECT (SELECT ...)、FROM (SELECT ...)、WHERE id IN (SELECT ...)
  • UNION、LIMIT、ORDER BY(除非配合 LIMIT 且无歧义)
  • 列重命名使用表达式导致类型不一致,例如 id + 0 AS id

验证方式不是看 SHOW CREATE VIEW 里写了什么,而是执行 EXPLAIN —— 输出里的 Algorithm 字段(5.7+)或 select_type 才是真实依据。

MySQL
MySQL

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

下载

为什么 MERGE 视图能 UPDATE 而 TEMPTABLE 一定只读

MERGE 的本质是文本合并:执行 UPDATE v SET name = 'a' WHERE id = 1 时,MySQL 把这条语句和视图定义拼成一条完整 SQL,直接下推到基表执行,保留主键、索引、行锁上下文。

TEMPTABLE 则必须先生成一张无元数据的临时表(无主键、无索引、无外键),再对这张表操作——它根本不知道哪一行对应基表哪一行,所以连 WHERE 都没法安全映射,更别说加锁更新了。

这意味着:

  • 只有 ALGORITHM = MERGE 的视图才可能支持 INSERT/UPDATE/DELETE(还需满足单表、无计算列等条件)
  • WITH CHECK OPTION 只对 MERGE 视图生效;TEMPTABLE 下该子句被完全忽略
  • 如果业务依赖视图写入能力,却误用了 TEMPTABLE,错误通常表现为 ERROR 1288 (HY000): The target table v of the UPDATE is not updatable

ALGORITHM = UNDEFINED 并不“智能”,它只是放弃控制权

UNDEFINED 不是运行时动态决策,而是在 CREATE VIEW 时做一次静态判断:满足 MERGE 条件就固化为 MERGE,否则直接设为 TEMPTABLE。问题在于:

  • 它不会随基表结构变化重新评估——比如后续给基表加了生成列或触发器,原先能用 MERGE 的视图在 ALTER VIEW 后可能突然退化
  • 你无法从语句本身预判结果,得靠 EXPLAIN 实测
  • 团队协作时,别人改了视图定义但没跑 EXPLAIN 验证,性能或更新能力就可能悄无声息地崩掉

真正可控的做法,是让视图定义足够“干净”:去掉所有触发降级的语法糖,哪怕牺牲一点抽象便利,也要换回执行路径的确定性——尤其是线上核心视图。

相关文章

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

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

下载

相关标签:

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

热门AI工具

更多
WorkBuddy

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

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

火山引擎

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

豆包大模型

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

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

DeepSeek

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

相关专题

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

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

2293

2023.06.20

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

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

1399

2023.06.21

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

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

815

2023.07.18

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

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

3172

2023.07.19

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

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

5388

2023.07.25

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

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

1199

2023.08.08

sqlserver和mysql区别
sqlserver和mysql区别

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

5651

2023.08.11

mysql忘记密码
mysql忘记密码

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

4942

2023.08.14

Playwright 测试失败怎么办
Playwright 测试失败怎么办

Playwright测试失败专题汇集超时、定位器匹配、浏览器提前关闭、依赖与插件配置、文件上传、SSL及Docker启动等故障文章,并介绍通过截图、报告和Trace定位错误。

0

2026.10.21

热门下载

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

精品课程

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

共1课时 | 188人学习

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

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