当前位置: 首页 > news >正文

MySQL 视图使用场景与限制

视图是把查询封装成「虚拟表」的方式用对了简化查询用错了性能爆炸。这篇说说视图的用法和注意事项。什么是视图-- 视图保存好的 SQL 查询像表一样使用CREATEVIEWview_nameASSELECTcolumn1,column2FROMtableWHEREcondition;-- 使用视图SELECT*FROMview_name;视图的类型1. 简单视图单表CREATEVIEWv_active_usersASSELECTid,name,emailFROMuserWHEREstatusactive;-- 使用SELECT*FROMv_active_usersWHEREid1;2. 复杂视图多表 JOINCREATEVIEWv_order_detailsASSELECTo.idASorder_id,u.nameASuser_name,o.amount,o.status,o.created_atFROMorderoINNERJOINuseruONo.user_idu.id;-- 使用SELECT*FROMv_order_detailsWHEREuser_nameTom;3. 可更新视图CREATEVIEWv_simple_userASSELECTid,name,emailFROMuserWHEREstatusactive;-- 可以通过视图更新数据UPDATEv_simple_userSETnameTomWHEREid1;-- 视图更新会反映到原表4. 不可更新视图-- 以下情况视图不可更新-- - 聚合函数SUM, COUNT, AVG 等-- - DISTINCT-- - GROUP BY-- - HAVING-- - UNION-- - 子查询-- - JOINCREATEVIEWv_user_order_countASSELECTuser_id,COUNT(*)ASorder_countFROMorderGROUPBYuser_id;-- ❌ 错误不可更新UPDATEv_user_order_countSETorder_count10WHEREuser_id1;视图的使用场景场景1权限控制-- 创建一个只包含部分字段的视图给普通用户用CREATEVIEWv_user_publicASSELECTid,name,emailFROMuser;-- 只给这个视图的 SELECT 权限GRANTSELECTONmydb.v_user_publicTOapp_user%;-- app_user 看不到 password 字段场景2简化复杂查询-- 每次都要 JOIN 三张表直接建视图CREATEVIEWv_report_monthlyASSELECTDATE_FORMAT(o.created_at,%Y-%m)ASmonth,u.region,COUNT(DISTINCTo.user_id)ASuser_count,SUM(o.amount)AStotal_amountFROMorderoINNERJOINuseruONo.user_idu.idWHEREo.statuscompletedGROUPBYmonth,u.region;-- 报表查询变得超简单SELECT*FROMv_report_monthlyWHEREmonth2024-01;场景3兼容旧表结构-- 表结构改了但应用不想改-- 创建视图保持原有表名和字段名CREATEVIEWorderASSELECTnew_idASid,new_amountASamount,new_statusASstatusFROMorder_new;WITH CHECK OPTION防止通过视图插入或更新不符合视图条件的数据。CREATEVIEWv_active_usersASSELECTid,name,emailFROMuserWHEREstatusactiveWITHCHECKOPTION;-- ✅ 可以更新满足 WHERE 条件UPDATEv_active_usersSETnameTomWHEREid1;-- ❌ 报错尝试修改 status会被拒绝UPDATEv_active_usersSETstatusinactiveWHEREid1;-- ERROR: Check option violation视图的性能问题问题视图是「虚拟表」没有索引-- 每次查询视图都要重新执行定义里的 SQLCREATEVIEWv_order_summaryASSELECTuser_id,SUM(amount)AStotalFROMorderGROUPBYuser_id;-- 查询这个视图SELECT*FROMv_order_summaryWHEREuser_id1;-- 执行计划GROUP BY 全表-- 解决方案用物化视图MySQL 不支持用其他方案解决方案使用物化视图替代MySQL 没有原生物化视图可以用定时任务模拟-- 1. 创建汇总表CREATETABLEorder_summary_materialized(user_idBIGINTPRIMARYKEY,totalDECIMAL(10,2),updated_atDATETIME);-- 2. 定时刷新用事件或 crontabINSERTINTOorder_summary_materializedSELECTuser_id,SUM(amount),NOW()FROMorderGROUPBYuser_idONDUPLICATEKEYUPDATEtotalVALUES(total),updated_atNOW();-- 3. 查询物化表SELECT*FROMorder_summary_materializedWHEREuser_id1;查看和删除-- 查看所有视图SHOWFULLTABLESWHERETable_typeVIEW;-- 查看视图定义SHOWCREATEVIEWv_order_details;-- 查看视图列信息DESCv_order_details;-- 删除视图DROPVIEWIFEXISTSv_order_details;视图的优缺点优点缺点简化复杂查询每次查询都要重新执行权限控制没有自己的索引兼容旧表结构复杂视图性能差逻辑复用可更新视图限制多小结场景建议简化 JOIN 查询✅ 用视图权限控制✅ 用视图只暴露必要字段聚合统计❌ 别用视图用物化表复杂业务逻辑❌ 别用视图用存储过程或应用代码视图是简化工具不是性能工具。记住这一点就够了。相关阅读[MySQL 存储过程完全指南][MySQL 触发器使用场景][MySQL 性能优化实战]
http://www.rkmt.cn/news/1302520.html

相关文章:

  • MySQL 索引底层 B+ 树原理
  • 3D打印定制外壳:为Adafruit HalloWing打造可穿戴电子装饰
  • OBS鼠标位置追踪插件:提升直播教学与游戏演示的视觉指引
  • 从零构建高效个人技术工具箱:Hub仓库的设计、实践与维护指南
  • openclaw-memory:为LLM应用构建高效记忆系统的工程实践
  • Neovim集成Goose数据库迁移工具:提升开发效率的现代化插件方案
  • 2026年期刊投稿论文降AI攻略:学术期刊投稿论文AIGC超标4.8元快速达标完整方案
  • 2026年商科案例分析论文降AI攻略:MBA案例分析论文AIGC超标免费4.8元知网达标完整方案
  • Godot强化学习实战:用godot_rl_agents训练游戏AI
  • 期权交易基础框架:模块化设计与Python实现指南
  • GitClaw:基于Go的轻量级Git钩子服务器与集中式权限管理方案
  • Python自动化工具:YouTube播放列表批量导出为结构化文本
  • 3步极速获取百度网盘提取码:开源神器baidupankey的智能解密指南
  • 六轴串联机械臂路径规划【附程序】
  • 程序员超能力:代码技能树全解析
  • PowerInfer:基于热点神经元预测的LLM高性能推理引擎部署指南
  • 构建高可用AI模型代理服务:统一接口、智能路由与生产级部署
  • Arm架构Iris事件流机制与断点调试技术详解
  • 毕业论文党福音:手把手教你用Endnote X9搞定参考文献,告别手动编号噩梦
  • Godot游戏集成Discord状态:RPC插件原理与实战指南
  • Go语言缓存雪崩:防止缓存失效
  • Linux防火墙规则检查与放通实践
  • Rulebook-AI:用规则引擎为AI智能体构建可控决策框架
  • 三维重建实时映射技术在智慧水利中的核心应用
  • 去除豆包视频水印(最稳定小程序)福气满满去水印小程序 - 政企云文档
  • Arm CoreLink PCK-600电源管理架构与寄存器编程详解
  • Bifrost:轻量高效的实时数据同步平台架构与实战
  • 深入解析go-containerregistry:无守护进程的容器镜像操作利器
  • 基于电容触摸与NeoPixel的交互式音乐城堡制作全解析
  • 如何在 CI/CD 流水线中自动根据分支名部署环境?