关系型数据库sqlserver和pg创建覆盖索引的include写法示例及原理详解

这是一个覆盖索引(Covering Index)的创建语句,让我详细解释它的结构、作用和工作原理:

一、语法结构分解

CREATEINDEXidx_orders_coveringONorders(customer_id,created_date)-- 键列(Key Columns)INCLUDE(amount,status,product_id);-- 包含列(Included Columns)

1.键列(Key Columns)

  • customer_id, created_date:索引的排序和查找键
  • 这些列参与B+树结构
  • 用于WHERE条件、JOIN条件、ORDER BY、GROUP BY

2.包含列(Included Columns)

  • amount, status, product_id非键列,存储在索引叶子节点
  • 不参与B+树排序结构
  • 仅用于"覆盖查询"

二、与传统索引对比

传统复合索引

CREATEINDEXidx_traditionalONorders(customer_id,created_date);-- 索引只包含:customer_id, created_date, order_id(主键)-- 查询其他字段需要"回表"

覆盖索引

CREATEINDEXidx_coveringONorders(customer_id,created_date)INCLUDE(amount,status,product_id);-- 索引包含:customer_id, created_date, amount, status, product_id, order_id-- 无需回表

三、工作原理示例

查询场景

-- 查询1:完全覆盖SELECTcustomer_id,created_date,amount,statusFROMordersWHEREcustomer_id=123ANDcreated_date>='2024-01-01';-- 查询2:部分覆盖SELECTcustomer_id,created_date,amountFROMordersWHEREcustomer_id=123ORDERBYcreated_dateDESCLIMIT10;

执行流程对比

传统索引流程: 1. 使用索引找到符合条件的行位置(索引扫描) 2. 根据主键回表获取完整行数据(回表操作) 3. 从行数据中提取amount, status字段 4. 返回结果 覆盖索引流程: 1. 使用索引找到符合条件的行(索引扫描) 2. 直接从索引叶子节点读取所有需要的字段 3. 返回结果(无需回表!)

四、性能优势

1.消除回表(Bookmark Lookup)

-- 假设orders表有100万行-- 查询返回1000行传统索引:-索引扫描:1000次查找-回表操作:1000次随机IO(每次10ms)-总耗时:约10秒 覆盖索引:-索引扫描:1000次查找-无需回表:所有数据在索引中-总耗时:约0.1秒(快100倍!)

2.减少IO操作

磁盘访问模式: 随机IO(回表):每次10ms 顺序IO(索引扫描):每次0.1ms 覆盖索引将随机IO转为顺序IO

五、INCLUDE子句的优势

与传统方法的对比

-- 方法1:将列加入键列(不推荐)CREATEINDEXidx_badONorders(customer_id,created_date,amount,status,product_id);-- 问题:索引树变得庞大,维护成本高-- 方法2:使用INCLUDE(推荐)CREATEINDEXidx_goodONorders(customer_id,created_date)INCLUDE(amount,status,product_id);-- 优势:包含列不增加索引层级,只增加叶子节点大小

INCLUDE列的特点:

  1. 不参与排序:不影响索引查找效率
  2. 不用于过滤:不能用于WHERE条件
  3. 仅存储值:类似"附表"附加在叶子节点
  4. 更新代价低:修改包含列只更新叶子节点

六、适用场景

1.高频查询优化

-- 报表查询:经常查询固定字段SELECTcustomer_id,created_date,amount,statusFROMordersWHEREcustomer_idIN(1,2,3)ANDcreated_dateBETWEEN'2024-01-01'AND'2024-01-31';-- 创建针对性的覆盖索引CREATEINDEXidx_reportONorders(customer_id,created_date)INCLUDE(amount,status);

2.分页查询优化

-- 分页查询避免大量回表SELECTorder_id,customer_id,created_date,amountFROMordersWHEREcustomer_id=123ORDERBYcreated_dateDESCLIMIT100OFFSET1000;-- 覆盖索引可以完全满足CREATEINDEXidx_pagingONorders(customer_id,created_dateDESC)INCLUDE(amount);

3.聚合查询加速

-- 分组统计SELECTcustomer_id,DATE(created_date),SUM(amount),COUNT(*)FROMordersWHEREcreated_date>='2024-01-01'GROUPBYcustomer_id,DATE(created_date);-- 覆盖索引提供所有需要的数据CREATEINDEXidx_aggONorders(created_date,customer_id)INCLUDE(amount);

七、注意事项和限制

1.索引大小权衡

-- 覆盖索引会更大-- 原始数据:customer_id(8B) + created_date(8B) = 16B-- 覆盖索引:16B + amount(8B) + status(4B) + product_id(8B) = 36B-- 索引大小增加125%,但查询性能提升显著

2.更新代价

-- 更新包含列时UPDATEordersSETamount=200WHEREorder_id=1;-- 需要更新:主表 + 所有包含该列的覆盖索引-- 写操作变慢,读操作变快

3.数据库支持

-- 不同数据库语法不同-- SQL Server/PostgreSQL: 支持INCLUDE语法-- MySQL: 不支持INCLUDE,所有列都是键列-- Oracle: 通过"索引组织表"或"函数索引"实现类似功能-- MySQL的替代方案(没有INCLUDE):CREATEINDEXidx_mysqlONorders(customer_id,created_date,amount,status,product_id);-- 但这不是真正的覆盖索引,所有列都参与排序

八、最佳实践建议

1.选择性包含

-- 只包含高频查询的列CREATEINDEXidx_selectiveONorders(customer_id,created_date)INCLUDE(amount,-- 经常用于SUM/AVGstatus,-- 经常用于筛选-- 不包含:description(大文本字段)-- 不包含:updated_at(很少查询));

2.监控使用情况

-- 检查索引使用SELECT*FROMsys.dm_db_index_usage_statsWHEREobject_id=OBJECT_ID('orders');-- 检查索引大小EXECsp_spaceused'orders';

3.组合策略

-- 针对不同查询创建多个覆盖索引-- 索引1:用于客户查询CREATEINDEXidx_customer_queryONorders(customer_id,created_date)INCLUDE(amount,status);-- 索引2:用于产品分析CREATEINDEXidx_product_analysisONorders(product_id,created_date)INCLUDE(amount,customer_id);-- 索引3:用于状态监控CREATEINDEXidx_status_monitorONorders(status,created_date)INCLUDE(amount,customer_id);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1043503.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI导游多语种支持:服务国际游客的实用方案

AI导游多语种支持:服务国际游客的实用方案 在巴黎卢浮宫,一位日本游客指着《蒙娜丽莎》轻声提问:“这幅画为什么这么有名?” 几秒钟后,她的手机屏幕上,一位身着正装的虚拟讲解员微笑着开口——用流利的日语…

思考与练习(第十一章 面向对象编程基础)

一、单项选择题(本大题共 10 小题)1、关于 Python 面向对象编程的四大特性,下列说法错误的是:① 封装是将数据和方法组织在对象内部② 继承是子类复用父类代码的机制③ 多态是指一个类可以有多个实例④ 抽象是关注“做什么”而不是…

小型神经网络如何表示基本函数

原文:towardsdatascience.com/how-tiny-neural-networks-represent-basic-functions-8a24fce0e2d5?sourcecollection_archive---------4-----------------------#2024-09-10 通过简单的算法示例,温和地介绍机械解释性 https://medium.com/taubenfeld9?…

Linly-Talker支持动态批处理,提高GPU吞吐量

Linly-Talker支持动态批处理,提高GPU吞吐量 在虚拟主播直播间里,成百上千名观众同时发问:“今天推荐什么股票?”“你能唱首歌吗?”“用四川话说一遍祝福语。”如果每个问题都要等系统逐个处理、逐个生成视频回应&#…

MySQL 5.7覆盖索引的实现方式、替代方案和限制

由于MySQL 5.7 不支持 INCLUDE 语法! 本文我详细解释MySQL 5.7覆盖索引的实现方式、替代方案和限制: 一、MySQL的覆盖索引实现方式 MySQL 5.7的实际语法 -- MySQL 5.7 不支持INCLUDE语法 -- 以下语句会报错: CREATE INDEX idx_orders_cove…

五、选择器进阶

五、选择器进阶 1.1 后代选择器:空格 作用:根据HTML标签的嵌套关系,选择父元素后代中满足条件的元素选择器语法:选择器1 选择器2 {css}结果: 在选择器1所找到标签的后代(儿子、孙子、重孙子……)中,找到…

零基础也能做数字人?Linly-Talker开源镜像全解析

零基础也能做数字人?Linly-Talker开源镜像全解析 在电商直播间里,一个面容亲和的虚拟主播正用标准普通话介绍新款护肤品,口型与语音严丝合缝,语气自然得仿佛真人;而在某企业客服页面,一位“数字员工”正在实…

Linly-Talker与HeyGen对比:谁更适合国内用户?

Linly-Talker与HeyGen对比:谁更适合国内用户? 在虚拟助手、AI主播和数字员工逐渐渗透进日常生活的今天,一个核心问题浮出水面:我们究竟需要的是“会说话的视频”,还是“能对话的伙伴”? 国外平台如 HeyG…

从零开始训练 LLM 需要多长时间?

原文:towardsdatascience.com/how-long-does-it-take-to-train-the-llm-from-scratch-a1adb194c624?sourcecollection_archive---------1-----------------------#2024-10-28 估算训练 X 亿个 LLM、Y 万亿个 tokens 以及 Z 个 GPU 计算所需时间的指南 https://med…

Linly-Talker唇形匹配误差低于8ms,达到行业领先水平

Linly-Talker&#xff1a;如何实现<8ms唇形同步的实时数字人系统 在虚拟主播直播带货、AI客服24小时在线、企业数字员工接待访客的今天&#xff0c;用户对“像人”的期待早已超越了简单的语音回复。真正的挑战在于——让数字人说话时&#xff0c;嘴型与声音严丝合缝&#xf…

MySQL多表join的底层优化技术详解

虽然阿里内部存在上述规范&#xff0c;但在很多场景下&#xff0c;即使进行多表JOIN且数据量大&#xff0c;SQL查询效率仍然很高。其实这背后涉及多个层面的优化技术。本文我将详细解释这些看似矛盾的现象&#xff1a; 一、底层优化技术 1. 现代优化器的智能化 -- 看似复杂但能…

Linly-Talker音频后处理模块:提升清晰度与饱满度

Linly-Talker音频后处理模块&#xff1a;提升清晰度与饱满度 在虚拟主播、智能客服和数字员工逐渐走入日常的今天&#xff0c;用户对交互体验的要求早已超越“能说话”这一基本功能。人们期待的是更自然、更具情感温度的声音表现——那种听起来像真人一样有呼吸感、有质感、有临…

一碗幸运魅力麦片有多幸运?

原文&#xff1a;towardsdatascience.com/how-lucky-is-a-bowl-of-lucky-charms-9040fe2cc560?sourcecollection_archive---------5-----------------------#2024-03-16 https://medium.com/gjkernsysu?sourcepost_page---byline--9040fe2cc560-----------------------------…

从文本到数字人视频:Linly-Talker全流程演示

从文本到数字人视频&#xff1a;Linly-Talker全流程解析 在虚拟主播24小时不间断带货、AI客服秒回千条咨询的今天&#xff0c;一个更高效、更低门槛的数字人生成方案正悄然改变内容生产的底层逻辑。你是否想过&#xff0c;只需一张照片和一段文字&#xff0c;就能让静态肖像“活…

状压dp|dfs|dijk

lc2816优雅递归&#x1f60b;class Solution { public:int t0;ListNode* doubleIt(ListNode* head) {auto dfs[&](this auto&& dfs,ListNode* node)->ListNode*{if(!node) return nullptr;dfs(node->next);//先递归到结尾//handleint vnode->val;node->…

Linly-Talker本地部署避坑指南(附性能调优建议)

Linly-Talker本地部署避坑指南&#xff08;附性能调优建议&#xff09; 在数字人技术加速落地的今天&#xff0c;越来越多企业与开发者希望构建具备自然交互能力的虚拟形象。然而&#xff0c;市面上大多数方案要么依赖云端API、存在数据泄露风险&#xff0c;要么系统复杂、难以…

Linly-Talker实战教程:如何用大模型生成虚拟主播

Linly-Talker实战教程&#xff1a;如何用大模型生成虚拟主播 在电商直播间里&#xff0c;一个面容亲切的“主播”正流畅地介绍着新品功能——她语气自然、口型精准、表情生动。可你或许想不到&#xff0c;这位24小时在线的虚拟主播&#xff0c;背后仅由一张照片和一段代码驱动。…

STL容器性能探秘:stack、queue、deque的实现与CPU缓存命中率优化

目录前言一、stack的模拟实现1.1 适配器Container的封装概念二、queue的模拟实现三、deque的介绍3.1 deque的使用3.2 CPU高速缓存访问命中率与数据访问效率3.2.1 数据访问效率3.2.2 CPU高速缓存访问命中率结语&#x1f3ac; 云泽Q&#xff1a;个人主页&#x1f525; 专栏传送入…