达梦索引测试
达梦索引测试
索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可减少IO,快速访问数据库表中的特定信息。索引需要额外的磁盘空间,并降低写操作的性能。在修改表内容的时候,索引会进行更新甚至重构,索引列越多,这个时间就会越长。所以只保持需要的索引有利于查询即可。
建设原则:
1索引应该经常建在Where 子句经常用到的列上。如果某个大表经常使用某个字段进行查询,并且检索行数小于总表行数的5%。则应该考虑。(返回数据量占10%以上 建议使用全表扫描,使用多块读操作,提升吞吐量)。
2 在经常存取的多个列上建立复合索引,但要注意复合索引的建立顺序(先等值再其他,返回数据量,使用频率)
3 对于小型的表,没必要建立索引,优化不明显,增加开销
4 随着数据的变化,索引的效率会下降,因此应定期重建索引
alter index index_name rebuild
CSCN :基础全表扫描(a),从头到尾,全部扫描
SSCN :二级索引扫描(b), 从头到尾,全部扫描
SSEK :二级索引范围扫描(b) ,通过键值精准定位到范围或者单值
CSEK :聚簇索引范围扫描(c) ,通过键值精准定位到范围或者单值
BLKUP :根据二级索引的ROWID 回原表中取出全部数据(b + a)
创建测试表
create table idx (id int,name varchar(50),count int)
构造10万条测试数据
CREATE OR REPLACE PROCEDURE proc_index AS
begin
for i in 1..100000 loop
INSERT INTO idx (id,name,count) select i,CHR(MOD(i,27)+65),convert(int,100*rand()) from dual;
end loop;
commit;
end;
调用存储过程,可以看到idx有10万条数据,name为A的有3千多条
call PROC_INDEX
没建索引之前,查看执行计划
如下示例,执行计划走了全表扫描CSCN
创建索引,查看执行计划
create index index_t on idx (name)
explain select /*+INDEX(idx, index_t) */ * from idx where name='A'
下图可以看到,执行计划走了二级索引范围扫描SSEK
创建聚集索引
create cluster index index_t2 on idx(id);
explain select * from idx where id >1000 and id <2000
如下所示,执行计划走了聚簇索引范围扫描CSEK
创建组合索引
create index index_t3 on idx(name,count)
explain select /*+INDEX(idx, index_t3) */ * from idx where name='A' and count=50
删除组合索引,查看执行计划
drop index index_t3
下列情况不走索引
索引列上使用函数
索引列上进行计算
索引列上使用IS NULL和IS NOT NULL
索引列上做了隐式转换(经测试,实际上走了索引)
返回结果过多
1 聚集索引创建之后执行计划都能走索引
2 经测试,除了聚集索引,其他索引如不加hint,执行计划还是走的全表扫描
create index index_t5 on idx(count);
3 加hint之后,执行计划虽走了索引,因返回值过多,开销太大,优化不明显
查看索引信息
select table_name,index_name from dba_indexes where table_name=表名
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了