注册
达梦SQL优化方法-索引
技术分享/ 文章详情 /

达梦SQL优化方法-索引

Arno 2025/09/30 32 0 0

一、索引的基本原理

索引,作为数据库管理系统中用于提升数据检索效率的关键数据结构,其本质是对表中一列或多列数据进行排序后形成的一种特殊数据结构,并附加了指向这些排序后数据物理位置的标识(如ROWID,特别是在聚集索引中)。
1.作用
索引的作用类似于书籍的目录,它为用户提供了一个快速查找数据行的“导航图”。通过索引,数据库能够迅速定位到包含所需数据的页面,从而大幅缩短查询时间。如:
全表扫描(Table Scan):就像一页一页地翻书找内容,当数据量巨大时,效率极低。
索引扫描(Index Scan):先通过目录(索引)找到内容所在的页码(数据行的物理地址),然后直接翻到那一页,效率极高。
在达梦中,索引是一种独立于数据的数据库对象,它存储了表中一列或多列值的排序副本以及对应数据行的物理地址(ROWID)。当查询条件中使用了索引列时,数据库引擎会先查找索引,快速定位到符合条件的ROWID,再根据ROWID去表中读取数据,从而避免全表扫描。

二、达梦常见的索引类型

1.B-Tree索引(平衡树索引)
特点:最常用、默认的索引类型。适用于等值查询(=)和范围查询(>, <, BETWEEN, LIKE ‘abc%’)。
结构:树形结构,保持数据平衡,保证从根节点到任何叶子节点的路径长度基本相同,查询效率稳定。
适用场景:高基数列(列中不同值很多,如ID、手机号)、经常作为查询条件的列。
2.函数索引(Function-Based Index)
特点:索引的不是列本身,而是基于列的计算或函数表达式的结果。
适用场景:查询条件中经常对列使用函数或表达式。
例如:经常按 UPPER(student_name) 查询,可以创建函数索引 
CREATE INDEX idx_upper_name ON students(UPPER(student_name));
例如:经常按 salary * 12 查询,可以创建索引 
CREATE INDEX idx_annual_salary ON employees(salary * 12);
3.唯一索引(Unique Index)
特点:确保索引列的值是唯一的。主键(Primary Key)会自动创建唯一索引。
作用:除了加速查询,还用于保证数据完整性。
4.复合索引(Composite Index / Concatenated Index)
特点:基于多个列创建的索引。
核心原则:最左前缀匹配原则。查询条件必须包含复合索引的最左列,才能有效利用索引。

三、索引优化实践方法与步骤

1.步骤一:识别需要优化的SQL
1.1执行计划(EXPLAIN):在SQL语句前加上 EXPLAIN 可以查看数据库如何执行该SQL。
如:
EXPLAIN SELECT * FROM students WHERE student_id = 1001;
关注点:查看执行计划中的 OPERATION。如果出现 TABLE SCAN(全表扫描),而该表数据量很大,就是优化的重点。
1.2动态视图:
VSESSIONS / VSQL_AREA:查找执行时间长、逻辑读(LOGICAL_READS)高的SQL语句。
V$SQL_PLAN:查看SQL语句的历史执行计划。
2.步骤二:分析where子句和join条件
索引优化的核心是为查询条件服务。仔细分析SQL语句的以下部分:
WHERE 子句中的列。
JOIN … ON 条件中的列。
ORDER BY 和 GROUP BY 子句中的列(索引本身有序,可以避免排序操作)。
3.步骤三:创建合适的索引
3.1单列索引:如果某个列频繁作为独立查询条件。
如:
CREATE INDEX idx_orders_student_id ON orders(student_id);
3.2复合索引:如果多个列经常同时作为查询条件。
原则1:将选择性最高(最能过滤掉大量数据)的列放在最左边。
原则2:考虑 ORDER BY 或 GROUP BY 的列,将其放在复合索引中,可以利用索引排序。
如:
– 假设经常按状态和创建时间查询订单,且状态的选择性高于时间
CREATE INDEX idx_orders_status_time ON orders(status, create_time);
– 以下查询可以高效使用索引进行查找和排序
SELECT * FROM students WHERE status = ‘SHIPPED’ ORDER BY create_time DESC;
4.步骤四:验证优化效果
创建索引后,务必再次使用 EXPLAIN 查看执行计划,确认:
原来的 TABLE SCAN 是否已变为 INDEX SCAN(如 INDEX RANGE SCAN, INDEX UNIQUE SCAN)。
执行成本(COST)是否显著降低。
在测试环境执行SQL,对比执行时间。

四、 索引优化需要避免的误区(重要!)

1.索引不是越多越好。
2.占用空间:每个索引都是一个独立的数据结构,会占用磁盘空间。
3.降低DML性能:每次执行 INSERT、UPDATE、DELETE 操作时,数据库都需要维护所有相关的索引,索引越多,维护开销越大,写操作越慢。
4.小表不需要索引:数据量很小的表(如配置表),全表扫描可能比索引扫描更快,因为省去了检索索引树的开销。
5.频繁更新的列建索引要谨慎:如果某列数据频繁变更,维护其索引的开销会很大,需要权衡查询收益和写入代价。
6.忽视最左前缀原则:创建了复合索引 (A, B, C),但查询条件没有 A,那么这个索引大概率不会被使用。

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服