读书笔记:揭开索引的两个常见误区

news/2025/9/25 17:13:36/文章来源:https://www.cnblogs.com/www-htz-pw/p/19111581

我们的文章会在微信公众号IT民工的龙马人生和博客网站( www.htz.pw )同步更新 ,欢迎关注收藏,也欢迎大家转载,但是请在文章开始地方标注文章出处,谢谢!
由于博客中有大量代码,通过页面浏览效果更佳。

本文为个人学习《Expert Oracle Database Architecture Techniques and Solutions for High Performance and Productivity(第四版本》一书过程中的笔记与理解分享,仅用于学习与交流,部分内容参考原书观点并结合>实际经验进行整理。若涉及版权问题,请联系删除或沟通处理。也请大家支持购买原版书籍。

揭开索引的两个常见误区

在数据库优化领域,关于索引有两个流传甚广的"常识",但实际上它们都是错误的认知。今天我们就来揭开这两个误区,帮助你更好地理解和使用索引。

误区一:索引空间永远不会被重用 ❌

误区的由来

很多人认为:一旦在索引中使用了某个位置,这个空间就永远被占用了。比如你在表中插入X=5,然后删除它,这个X=5使用的索引空间就永远闲置了,除非你再次插入X=5。

真相:空间是会被重用的 ✅

通过一个简单的实验就能证明这一点:

-- 创建测试表
CREATE TABLE test_table (id INT PRIMARY KEY);-- 插入一些数据
INSERT INTO test_table VALUES (1);
INSERT INTO test_table VALUES (2); 
INSERT INTO test_table VALUES (999999);-- 然后进行大量删除和插入操作

实验结果显示:尽管我们不断地删除旧数据、插入新数据,索引占用的空间大小基本保持不变。这说明索引空间确实在被循环利用

但是...这里有个重要的细节

虽然空间会被重用,但索引不会自动"整理碎片"。想象一下你的书架:

  • 你有很多书(数据)放在书架上
  • 你拿走了一些书(删除数据),留下空位
  • 你可以放入新书(插入新数据)来填补空位
  • 但书架不会自动重新整理让所有书紧挨着摆放

这就是索引的实际情况:删除数据会留下"空洞",只有合适大小的新数据才能填入这些空洞。如果需要彻底整理,需要手动执行:

ALTER INDEX index_name REBUILD;  -- 重建索引

误区二:要把最具区分度的列放在索引最前面 ❌

传统的"常识"

很多人认为:在创建复合索引(多列索引)时,应该把区分度最高的列(唯一值最多的列)放在最前面。

比如表中有10万行数据:

  • 列C1有10万个不同值(区分度极高)
  • 列C2有2.5万个不同值(区分度较高)

按照这个误区,应该创建索引(C1, C2)

真相:顺序应该由查询需求决定 ✅

通过实际测试发现:

  • 索引(C1, C2)和(C2, C1)占用的空间几乎相同
  • 两者的查询性能也基本没有差别
  • 唯一不同的是压缩效果:低区分度的列在前压缩效果更好

正确的决策方式

索引列的顺序应该根据实际查询需求来决定:

-- 情况1:如果经常这样查询
SELECT * FROM 表 WHERE C1 = ? AND C2 = ?;
SELECT * FROM 表 WHERE C2 = ?;-- 那么索引(C2, C1)更合适,因为:
-- 1. 两个查询都能使用这个索引
-- 2. 压缩效果更好(C2的重复值更多)

举个实际例子

假设你管理一个用户表,经常需要:

  1. 按城市和年龄查询用户
  2. 有时只按城市查询

那么索引应该这样设计:

CREATE INDEX idx_users ON users(城市, 年龄);
-- 而不是
CREATE INDEX idx_users ON users(年龄, 城市);

因为城市值的重复较多,放在前面压缩效果更好,而且支持更多种类的查询。

总结

误区 真相 建议
索引空间不会被重用 空间会被循环利用 定期重建索引整理碎片
高区分度列必须放前面 顺序由查询需求决定 按实际查询模式设计索引顺序

记住这两个要点,你就能避免常见的索引设计陷阱,让数据库性能更上一层楼!

------------------作者介绍-----------------------
姓名:黄廷忠
现就职:Oracle中国高级服务团队
曾就职:OceanBase、云和恩墨、东方龙马等
电话、微信、QQ:18081072613
个人博客: (http://www.htz.pw)
CSDN地址: (https://blog.csdn.net/wwwhtzpw)
博客园地址: (https://www.cnblogs.com/www-htz-pw)

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

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

相关文章

国标GB28181平台EasyGBS如何赋能路网数字化管理与应急指挥?

国标GB28181平台EasyGBS如何赋能路网数字化管理与应急指挥?随着智慧交通建设的深入,海量、异构的道路监控设备如何实现统一接入、低延迟调阅与智能分析成为关键挑战。本文探讨基于GB/T28181国家标准的EasyGBS视频平台…

完整教程:Spring Boot 核心注解分类与应用指南

完整教程:Spring Boot 核心注解分类与应用指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", &…

分布式数据库迁移OceanBase——基于网易云音乐自研CDC服务的平滑迁移方案

分布式数据库迁移OceanBase——基于网易云音乐自研CDC服务的平滑迁移方案网易云音乐在大体量的业务数据背后,是何种技术方案在支撑?本文分享网易云音乐PB级分库分表架构向原生分布式数据库架构迁移的技术优化经验。编…

获取用户ip所在城市

整体流程图获取当前登录用户所在城市,是一个非常常见的需求,在很多业务场景中用到。 比如:导航的定位功能默认选择的城市,或者一些防盗系统中识别用户两次登录的城市不一样的会有报警提示。 下载geoip2数据库 geoi…

郑州市网站建设公司石河子规划建设局网站

文章目录 📖 前言1. 认识URL && 引入http协议2. http协议格式2.1 宏观格式:2.2 实验演示: 3. http的方法3.1 GET方法:3.2 POST方法:3.3 GET vs POST: 4. HTTP的报头和状态码5. http的cookie5.1 htt…

电商外贸网站建设新网域名自助管理平台

ANSYS Fluent和COMSOL Multiphysics以及OpenFOAM这3款CFD软件哪个好?cfd软件中哪款最实用?cfd软件有哪些?今天就给大家带来这几款CFD软件对比分析,一起来看看吧。 ANSYS Fluent ANSYS Fluent 是一种流行的计算流体动力学 (CFD) …

【Proteus仿真】AT89C51单片机串行数据转换为并行仿真 - 实践

【Proteus仿真】AT89C51单片机串行数据转换为并行仿真 - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Cons…

第13章 day14-15 Webpack逆向

Webpack逆向 Webpack是一个现代的静态模块打包工具,它主要用于前端开发中的模块化打包和构建。通过Webpack,开发者可以将多个模块(包括JavaScript、CSS、图片等)进行打包,生成优化后的静态资源文件,以供在浏览器…

Viper远程配置踩坑记录

尝试etcd做配置中心,就用了Viper。没想到踩了一堆坑,记录一下。 一开始的代码是这么写的,想着先监听再读取: func initViperRemote() {err := viper.AddRemoteProvider("etcd3","http://127.0.0.1:…

深入解析:JVM(六)-- StringTable

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

开发一个彩票网站多少钱济南医院网站建设服务公司

来源:AI科技评论作者:陈彩娴、Mr Bear编辑:青暮近日,图灵奖得主、“贝叶斯网络之父”Judea Pearl在Twitter上分享了一篇新论文“What are the most important statistical ideas of the past 50 years?”(过去50年中最…

医院网站系统源码怎么推广引流

Linux平台 一、从yum源脚本安装部署Zabbix-Agent,添加Linux Servers/PC 概述 Zabbix 主要有以下几个组件组成: Zabbix Server:Zabbix 服务端,Zabbix的核心组件,它负责接收监控数据并触发告警,还负责将监控数据持久化到数据库中。 Zabbix Agent:Zabbix客户端,部署在被监…

国产智能体脂秤PCBA方案设计

一、产品介绍:智能体脂秤是一款高精度、多功能的健康管理工具,通过测量身体脂肪百分比、肌肉质量、骨骼密度等参数,帮助用户了解自身身体健康状况,并提供个性化的健康建议。其结构设计紧凑,外观简约时尚,适用于家…

完整教程:JRE、JDK、JVM 及 JIT 之间有什么不同?

完整教程:JRE、JDK、JVM 及 JIT 之间有什么不同?pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas"…

第15章 day18 Ast系列篇

Ast系列篇 何为混淆? 混淆可以理解为是一种对js代码加密技术,主要用于隐藏代码的真实功能,以防止js代码被逆向工程师分析和修改。通过混淆,让代码变得复杂和难以理解,使得逆向工程师在调试工程中消耗大量的时间或…

微波雷达模块在智能家居中的具体应用案例有哪些?

​微波雷达模块在智能家居中的具体应用案例有哪些?首先我们要明确什么是微波雷达? 微波是指频率在300MHz至300GHz之间的电磁波,其波长范围从1米到1毫米不等。微波具有穿透性、反射性和热效应等特点,因此在通信、加…

Ubuntu 桌面快捷方式创建增加记录

使用图形界面创建桌面快捷方式打开终端进入 GoLand 的 bin 目录:cd ~/Apps/GoLand-2024.1/bin创建桌面快捷方式文件:sudo nano /usr/share/applications/goland.desktop编写内容到文件中:[Desktop Entry] Version=1…

网站 wap 插件长春火车站是哪个站

1、 Lua:元表是什么,怎么实现对象继承 2、OPP是什么 3、mvc结构 4、C#: list和array区别和使用场景 5、项目: (1)ui框架类设计,ui层级管理怎么做,对象初始化内存占用这样做高,资源是…

arm64中的内存屏障指令

asm volatile("dmb osh" : : : "memory")是什么? arm架构有三种内存屏障,分别是: Data Memory Barrier, Data Synchronization Barrier, and Instruction Synchronization Barrier. OSH表示DMB…

三分

篇首语啊~~三分~你比二分多一分~——A86562U正文 顾名思义,三分会比二分多一个分区,但它是用来做什么的呢?先来偷一道拿一道例题来举例 P3382 三分 - 洛谷 我们把二分的模板偷一份拿一份过来#include<bits/stdc+…