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

如何在SQL中设计轻量级视图替代大体积宽表降低存储

酷瑶同学_3137

酷瑶同学_3137

发布时间:2026-10-16 10:17:05

|

543人浏览过

|

来源于php中文网

原创

宽表不能直接用视图“瘦身”,因为视图不减少物理I/O,必须先删除高成本字段(JSON/TEXT/XML、冗余计算字段、历史快照字段),再用视图做逻辑隔离;轻量视图应避免WHERE过滤、未索引JOIN、无下推能力的计算字段,并依赖基础表的覆盖索引优化。

如何在sql中设计轻量级视图替代大体积宽表降低存储

宽表为什么不能直接用视图“瘦身”?

视图本身不存储数据,它只是保存 SQL 查询逻辑。如果你把一张 50 列、含大量冗余字段(比如重复的用户地址、多级分类路径、JSON 扩展字段)的宽表 orders_full 直接封装成 CREATE VIEW v_orders_light AS SELECT id, user_id, amount, status FROM orders_full,那确实看起来“轻”了——但底层执行时,数据库仍要全量读取原表所有列(尤其当原表有 LOB、TEXT 或未索引的大字段),I/O 和内存开销一点没少。

真正降低存储压力的前提是:**先删掉宽表里不该存的数据,再用视图做逻辑隔离**。视图不是减肥药,而是手术后的绷带。

哪些字段必须从宽表物理删除?

重点盯三类高成本字段:

  • jsonb / TEXT / XML 类型字段:它们不参与查询过滤或聚合,仅用于下游系统解析(如日志快照、埋点原始数据)——这类应迁出到归档表或对象存储,原表只留 metadata_hash 或 log_id 外键
  • 派生字段(full_name, category_path, is_vip_flag):若计算逻辑稳定且高频使用,应改用生成列(PostgreSQL 12+ 支持 STORED 生成列)或物化视图;若低频,则彻底删除,由视图按需计算
  • 历史快照字段(user_name_at_order_time, price_at_order_time):这类本质是时间切片冗余,应拆成独立 order_snapshots 表,主表只保留当前有效引用

视图怎么写才能避免拖慢查询?

轻量视图的核心是「查什么,取什么」,不是「取出来再筛」。常见陷阱:

  • 在视图里写 WHERE status IN ('paid', 'shipped') —— 这会让所有调用该视图的 SQL 都强制走这个过滤,丧失灵活性。正确做法是去掉 WHERE,让上层决定是否加条件
  • 用 LEFT JOIN 关联用户表取 user_name,但没给 users.id 加索引 → 每次查视图都触发全表扫描。必须确保所有 JOIN 字段已建索引
  • 视图里包含 CASE WHEN 计算字段(如 discount_type),但底层字段无索引 → 无法下推谓词。如果该字段常被 WHERE 或 GROUP BY 使用,宁可建函数索引:CREATE INDEX idx_orders_discount_type ON orders ((CASE WHEN discount > 0 THEN 'coupon' ELSE 'none' END))

示例:一个安全的轻量视图定义

CREATE VIEW v_orders AS
SELECT 
  o.id,
  o.user_id,
  o.amount,
  o.status,
  o.created_at,
  -- 不做 JOIN,用外键代替关联字段,由应用层或上层 JOIN 控制
  o.user_id AS _user_ref
FROM orders o
-- 不加 WHERE,不限定时间范围
-- 不 SELECT json_detail、raw_log 等大字段

MySQL / PostgreSQL 在轻量视图上的关键差异

同一份视图 SQL,在不同引擎表现可能天差地别:

  • MySQL 8.0+ 支持 ALGORITHM = MERGE(默认),意味着视图会被内联展开,能利用底层索引;但一旦视图含子查询、聚合、DISTINCT,就会退化为 TEMPTABLE,强制物化中间结果 → 查询变慢、内存暴涨
  • PostgreSQL 的视图始终是 MERGE 式展开,无 TEMPTABLE 模式,但要注意:如果视图用了 LATERAL 或窗口函数,且上层查询又加了 LIMIT,优化器可能无法下推 LIMIT,导致全量计算后再截断
  • 两者都不支持对视图直接 CREATE INDEX。想加速视图查询,唯一靠谱方式是:在视图所依赖的基础表上建好覆盖索引,例如视图只查 (user_id, status, created_at),那就建复合索引 CREATE INDEX idx_orders_usc ON orders (user_id, status, created_at)

真正省存储的发力点永远在基础表结构上——视图只是让这张“瘦下来”的表更易用、更难误用。很多人卡在“以为建了视图就万事大吉”,结果发现慢查询日志里全是视图名,而底层宽表还在默默膨胀。

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

热门AI工具

更多
Laper
Laper Hot

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

WorkBuddy

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

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

AionClaw
AionClaw Hot

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

DeepSeek

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

豆包大模型

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

切问学术

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

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

相关专题

更多
大数据分析工具有哪四个
大数据分析工具有哪四个

大数据分析的四个工具分别是rapidminer、Hpcc、Hadoop和Pentaho bi。大数据分析用于从各种来源生成的原始数据中提取有价值的数据。这些数据帮助我们获得有意义的见解、隐藏的模式、未知的相关性、市场趋势等等,具体取决于行业。大数据分析的主要动机是提供有价值的见解,以便为未来做出更好的决策。php中文网为大家带来了大数据分析的相关教程、以及相关文章等内容,供大家免费下载使用。

5056

2023.06.21

Java 大数据处理基础(Hadoop 方向)
Java 大数据处理基础(Hadoop 方向)

本专题聚焦 Java 在大数据离线处理场景中的核心应用,系统讲解 Hadoop 生态的基本原理、HDFS 文件系统操作、MapReduce 编程模型、作业优化策略以及常见数据处理流程。通过实际示例(如日志分析、批处理任务),帮助学习者掌握使用 Java 构建高效大数据处理程序的完整方法。

1249

2025.12.08

大数据专业学习教程
大数据专业学习教程

本专题整合了大数据专业学习相关教程,阅读专题下面的文章了解更多详细内容。

243

2026.01.05

python处理大数据合集
python处理大数据合集

本专题整合了python处理大数据相关教程,阅读专题下面的文章了解更多详细内容。

486

2026.01.05

数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

4263

2023.10.12

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

891

2023.10.27

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

1109

2024.02.23

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

6181

2024.03.06

Revel框架入门与安装配置
Revel框架入门与安装配置

本专题从Revel框架环境搭建讲起,系统介绍命令行工具安装、项目创建、目录结构、配置文件及热代码重载,帮助开发者快速完成首个Go Web应用。

0

2026.10.16

热门下载

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

精品课程

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

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