MsSql

关注公众号 jb51net

关闭
首页 > 数据库 > MsSql > SQL 索引优化

SQL数据库索引优化详解

作者:六月雨滴

这段文章详细介绍了SQL索引优化的重要性及其不同类型,包括B树索引、唯一索引、复合索、函数索引等,并强调了索引优化对提升查询速度和降低写入开销的关键作用,感兴趣的朋友一起看看吧

索引优化是 SQL 优化中最有效、性价比最高的技术手段,正确的索引设计能将 SQL 执行速度提升 10-1000 倍。它的核心本质是用空间换时间,通过构建有序的数据结构,将全表扫描的 O (n) 时间复杂度降低为索引扫描的 O (log n)。

1、索引基础

1.1、什么是索引

索引是一种与表关联的可选数据库对象,它存储了表中一列或多列的值以及对应的行物理地址(ROWID),能够快速定位到满足条件的数据行,而无需扫描整个表。

简单理解:索引就像书的目录,通过目录可以快速找到章节内容,而不需要逐页翻阅整本书。

1.2、索引的核心作用

1.3、索引的开销

索引会带来以下开销:

索引是一把双刃剑,只在必要的列上创建索引,避免过度索引。

2、索引类型

2.1、B 树索引(默认索引)

2.2、唯一索引

2.3、复合索引(组合索引)

2.4、函数索引

2.5、位图索引

2.6、反向键索引

2.7、分区索引

2.8、索引组织表(IOT)

CREATE TABLE emp_iot (
  empno NUMBER PRIMARY KEY,
  ename VARCHAR2(20),
  sal NUMBER
) ORGANIZATION INDEX;

3、索引扫描类型

执行计划中的索引扫描类型直接决定了 SQL 的性能,必须熟练掌握每种扫描的触发条件和特点。

扫描类型英文名称触发条件性能说明
唯一索引扫描INDEX UNIQUE SCAN唯一索引的等值查询最优最多返回一行数据,找到后立即停止
索引范围扫描INDEX RANGE SCAN索引的范围查询(>、<、BETWEEN、LIKE 'xxx%')扫描索引的一部分叶子节点
索引快速全扫描INDEX FAST FULL SCAN查询所有索引列,不需要排序多块读扫描整个索引,比全表扫描快
索引全扫描INDEX FULL SCAN需要排序的结果集,且排序列是索引列单块读扫描整个索引,结果有序
索引跳跃扫描INDEX SKIP SCAN复合索引的前导列没有出现在查询条件中,但后续列有过滤条件11g + 特性,性能不如包含前导列的查询
全表扫描TABLE ACCESS FULL没有合适的索引,或全表扫描比索引扫描更快最差扫描整个表的所有数据块

关键说明

实例:某公司 ERP 索引优化

S(Situation - 情境):某数据库运行2年后,频繁DML操作导致多个核心索引碎片率超过40%,索引高度从3层增长到5层,查询性能持续下降。

T(Task - 任务):制定索引维护计划,消除碎片、降低索引高度,恢复查询性能。

A(Action - 行动):

        1、分析所有核心索引的碎片率

        2、碎片率>30%的索引使用ALTER INDEX ... REBUILD ONLINE重建

        3、碎片率10%-30%的使用COALESCE合并

        4、在业务低峰期分批执行

R(Result - 结果):平均索引高度从5层降至3层,索引范围扫描性能提升40%-60%,并在线重建未影响业务正常运行,建立每季度索引维护计划。

到此这篇关于SQL 索引优化的文章就介绍到这了,更多相关SQL 索引优化内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文