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

读书笔记:为什么你的数据库有时不用索引?一个关键参数告诉你答案

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

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

为什么你的数据库有时不用索引?一个关键参数告诉你答案

想象一下,你要在图书馆找10本相关的书。如果这些书都放在同一个书架上,你只需要去一次书架就能全部找到。但如果这些书分散在整个图书馆的不同区域,你就需要来回跑很多次,花费更多时间和精力。

数据库中的"聚类因子"(Clustering Factor)就是衡量数据排列有序程度的指标,它决定了数据库通过索引查找数据的效率。

什么是聚类因子?

聚类因子是Oracle数据库中的一个重要参数,它告诉我们表中的数据是否按照索引的顺序来存储:

  • 聚类因子接近数据块数量 = 数据排列有序(好比书籍都放在同一个书架上)
  • 聚类因子接近数据行数量 = 数据排列混乱(好比书籍分散在整个图书馆)

实际例子说明问题

通过一个实际测试,我们创建了两个完全相同的表(都有10万行数据),但数据的排列方式不同:

  • 有序表(COLOCATED):聚类因子为1190(接近数据块数量1252)
  • 无序表(DISORGANIZED):聚类因子为99929(接近数据行数量10万)

当查询表中10%的数据时,出现了截然不同的结果:

  • 有序表:数据库选择使用索引(成本142)
  • 无序表:数据库选择全表扫描(成本333)

为什么会这样?

因为数据库在通过索引查找数据时,如果发现下一行数据就在同一个数据块中,它不需要额外的I/O操作。就像在图书馆找书,如果下一本书就在当前书架上,你不需要走到其他区域。

但对于无序表,几乎每一行数据都在不同的数据块中,数据库需要频繁进行I/O操作,效率反而比直接全表扫描还要低。

给开发者的启示

  1. 索引不是万能的:即使建立了索引,数据库也不一定会使用,数据物理存储方式直接影响查询效率

  2. 不要盲目重建表:试图让所有索引都有良好的聚类因子是不现实的,因为数据只能按一种方式物理排序

  3. 考虑其他方案:如果数据物理聚类很重要,可以考虑使用:

    • 索引组织表(IOT)
    • B*树簇
    • 哈希簇

简单总结

聚类因子就像图书馆的书籍摆放系统:有序摆放让你快速找到所需书籍,混乱摆放则让你跑来跑去效率低下。了解这个概念,能帮助你更好地理解数据库的行为,做出更合理的设计决策。

记住:有时候全表扫描比使用索引更高效,这不是优化器的错误,而是它基于数据实际情况做出的明智选择。

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

http://www.wxhsa.cn/company.asp?id=4711

相关文章:

  • MacOS升级15.2后的问题(一):安装第三方下载的软件,提醒文件已损坏
  • Playwright MCP浏览器自动化教程
  • 故障分析:ORA-00900 修改props$中字符集导致
  • 实用指南:Flask学习笔记(三)--URL构建与模板的使用
  • Ollama + Python 极简工作流
  • 快速搞定Dify+Chrome MCP:打造能操作网页的AI助手
  • HCIP——RSTP
  • ORA-01555系列:三、ORA-01555总结与高级优化建议
  • Unstable Twin - TryHackMe
  • 单片机实现挡位调节
  • 完整教程:从 WildCard 野卡到 gptplus.plus:一次解决 OpenAI 支付难题的实战复盘,轻松搞定Gpt充值
  • 阿里 Qoder 新升级,Repo Wiki 支持共享、编辑和导出
  • 长城杯WriteUp
  • vite取别名@
  • JavaScript数据网格方案AG Grid 34.2 发布:更灵活的数据结构、更流畅的大数据交互与全新 UI 体验
  • BOE(京东方)IPC电竞嘉年华盛典圆满收官 第三届无畏杯总决赛引领电竞生态发展热潮
  • P1886 滑动窗口 /【模板】单调队列
  • kingbase金仓数据库docker部署完整步骤
  • glTF/glb功能、应用和 5 个基本最佳实践
  • AI 应用开发,不就是调个接口么?
  • 95.费解的开关
  • godot4人物移动一段距离后随机旋转代码,(死循环)
  • Spotify 音乐ML练习数据集含158 个特征,11
  • abc423
  • AI辅助分析HP DL360 GEN7 服务器安装USB3扩展卡
  • 最新药物数据集下载:来自Drugs
  • 【VPX361】基于3U VPX总线架构的XCZU47DR射频收发子模块
  • 自动驾驶ADAS数据集 13万张高清道路车辆识别图像 覆盖多场景智能交通应用 支持目标检测图像识别模型训练与AI视觉算法开发
  • Norwood-Hamilton男性脱发分级图像集|2400+张多角度高清头皮图像|涵盖7类脱发诊断标注|适用于AI诊断工具开发、皮肤科研究与植发产品研发|包含5角度标准化拍摄、支持秃顶早期检测
  • AI生成文本检测数据集:基于不平衡数据集(人类94% vs AI 6%)的高效机器学习模型训练,涵盖ChatGPT、Gemini等LLM生成内容