- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
SQL中“索引”的优化策略(如复合索引)
一、SQL索引的基础认知:从原理到核心价值
(一)索引的本质:数据库的“查询加速器”
提到SQL优化,“索引”是绕不开的核心概念——它就像图书馆里的“书籍目录”,能帮你快速定位到需要的内容,而不用逐页翻找。从技术底层看,大多数关系型数据库(比如MySQL、PostgreSQL)的索引都采用B+树结构:这是一种平衡树,叶子节点存储了数据的物理地址(或主键值),非叶子节点则是索引键的“指引层”。
举个直观的例子:如果一张用户表有1000万行数据,全表扫描需要读取1000万行,而通过id索引查询SELECT*FROMuserWHEREid=10时,数据库会沿着B+树的根节点往下遍历,快速找到id=10对应的叶子节点(只需3-4层遍历,因为每层节点能存约1000个键,3层就能覆盖10亿行数据),再通过叶子节点的指针找到磁盘上的数据行。这个过程的时间复杂度是O(logn),远快于全表扫描的O(n)。
简言之,索引的本质是“用空间换时间”——通过预先建立的有序结构,将“全表扫描”转化为“精准定位”,从而大幅提升查询速度。
(二)索引的“双刃剑”特性:查询加速与写入损耗
但索引不是“万能药”——它是一把双刃剑:在加速查询的同时,会给写入操作(插入、更新、删除)带来额外的性能损耗。
这是因为,每当你修改表中的数据时,数据库不仅要更新数据本身,还要同步维护索引的B+树结构。比如插入一条新数据,需要找到B+树中对应的位置,可能还要拆分节点(如果节点满了);更新一条数据的索引字段,需要删除旧的索引条目,再插入新的——这些操作都会增加写入的时间成本。
我曾遇到过一个典型案例:某电商系统的订单表,初期为了优化查询,建了8个索引(包括user_id、status、create_time等)。结果上线后,用户下单需要等3秒才能看到订单记录——插入一条订单数据要维护8个索引,写入性能被拖垮。后来删除了3个低频查询的索引,插入速度立刻提升到500毫秒以内。
这说明,索引的核心矛盾是“查询性能”与“写入性能”的平衡——我们需要的不是“更多的索引”,而是“更精准的索引”。
二、单一索引的局限性:为什么需要复合索引?
(一)单一索引的适用场景与边界
单一索引(针对单个字段的索引)是最基础的索引类型,它的适用场景很明确:当查询条件只涉及一个字段时,能发挥最大价值。比如:
按主键查询:SELECT*FROMuserWHEREid=10(主键本身是特殊的单一索引);
按唯一字段查询:SELECT*FROMuserWHEREemail=test@(唯一索引也是单一索引);
按高频筛选字段查询:SELECT*FROMordersWHEREstatus=1(状态是高频筛选条件,单一索引能快速过滤)。
但单一索引的“边界”也很明显:当查询条件涉及多个字段时,它的性能会急剧下降。比如,假设用户表建了age的单一索引,现在要执行查询:SELECT*FROMuserWHEREage=30ANDgender=男。此时,数据库会先通过age索引找到所有年龄为30的行(假设1000行),再逐行检查这些行的gender字段是否为“男”——这1000行的“二次扫描”,就是单一索引的性能瓶颈。
(二)多条件查询的痛点:单一索引的“失效”与性能瓶颈
当查询条件涉及多个字段时,单一索引的局限性会更突出,甚至会“失效”。比如:
情况1:非最左前缀的多字段查询:假设订单表建了create_time的单一索引,查询SELECT*FROMordersWHEREcreate_time2023-01-01ANDstatus=1。数据库会先通过create_time索引找到所有符合时间条件的行(假设10万行),再逐行检查status字段——这10万行的“二次扫描”会拖慢查询。
情况2:范围查询+其他字段:查询SELECT*FROMuserWHEREage30ANDgender=男。age索引能过滤出年龄大于30的行(假设10万行),但gender字段没有索引,只能逐行检查——10万行的扫描成本很高。
这些情况的共同痛点是:单一索引只能过滤“第一重”条件,剩下的条件需要“暴力扫描”。当业务场景从“单一条件查询”升级到“多条件查询”时,单一索引的性能瓶颈就会凸显——这时候,复合索引(针对多个字段的索引)就成了破局的关键。
三、复合索引的设计策略:从规则到实践
复合索引是将多个字段的键值组合成“联合键”存储在B+树中,能直接覆盖多条件查询。但它的设计不是“凑字段”,而是要遵循严格的规则——字段顺序、覆盖查询、最左匹配,是复合索引的三大核心。
(一)复合索引的“前缀匹配”原则:如何排列字段顺序
复合
您可能关注的文档
最近下载
- 醚与酯的醚键与酯键结构.pptx VIP
- 达州市2025-2026学年八年级上学期语文期末测试试卷.doc VIP
- GB 50794-2012 光伏发电站施工规范 高清晰版.docx VIP
- 在线网课学习课堂《高级医学免疫学(北京)》单元测试考核答案.docx
- 冶金技术课件-炼钢学概述.ppt VIP
- 一元二次方程应用题分类训练(10种类型共50道)(解析版) .pdf VIP
- 脑卒中伴吞咽障碍护理查房.pptx VIP
- 2025年度民主生活会“五个带头”个人对照检查发言材料.docx VIP
- 鱼酷烤鱼策划方案.pptx VIP
- 2024年上海市高考作文备考之哲思化写作素材8——《西方现代思想讲义》(弗里德里希·哈耶克).docx VIP
原创力文档


文档评论(0)