建立索引--索引的各种问题和建立索引的策略

索引能提升数据库查询性能,但也增加维护开销。本文探讨如何找到切入点建立索引,函数和类型转换对索引的影响,以及索引与外键、同一字段多个索引的关系,强调了在并发环境下索引的挑战和解决策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

找到切入点

程序的输入值为哪些,以及定义的数据子集的大小,是建立索引的基础。

索引是一种尽快访问“特定数据”的技术。

靠索引并不能实现对所有数据的快速访问。

处理开销:每当在表中插入或删除记录时,该表的所有索引都必须进行相应调整。每当对已建立索引的字段进行更新时,这种调整也会发生。这种调整意味着:占用大量CPU资源以扫描内存数据块、地洞I/O操作将变动记入日志文件、可能引起更多的数据库问价I/O操作,并可能引起数据库系统进行维护存储设备空间分配的操作。

 

维护一个索引的开销,可能比维护一张表的开销还要大。

在大规模并发访问的环境中,过多索引会造成资源竞争和加锁。更新带索引的表时,既要更新表中的数据,又要更新索引数据。于是,并发更新可能涉及的区域散布于表的各个部分。更改实际数据意味着一连串的冲击影响。

对支持事务处理的数据库,大部分SQL语句要么查出少数几行数据,要么处理少数几行记录,此时索引对提升性能价值很大。

决策支持系统的性能也在很大程度上依赖索引。

如果事务处理型数据库的表都符合范式的要求,需要增加索引的字段应该很少;这些表肯定都有主键,,在声明了主键字段后,它们会被自动加上索引;同样,具有唯一性的字段极可能在实现完整性约束时被加上索引;

索引与目录

书的索引和数据库的索引相似,而目录提供整书的机构概览,起到与索引互补的作用。

目录和索引之间的关键区别是:目录项指示正文块,可能是一章或是一节。

让索引发挥作用

如果需要的是某个数据项中非常具体的信息,就可以使用索引;但如果是想阅读整个主题的内容,则应该使用目录而不是索引。

匹配某索引键的记录所占的平均百分比反映了索引的可选择性,百分比越低,索引的可选择性就越高。

函数和类型转换对索引的影响

索引通常使用树(tree)结构实现。要找到一条数据记录的物理地址(该地址保持在索引中),就必须比较键值与保存在当前树节点中的值,判断要递归搜索哪个子树。

一定要显示的用转换函数进行转换。

索引与外键

主键访问冲突,加锁。


同一字段,多个索引

系统的为外键增加索引,常导致同一字段有多个索引的情况。

因为order_id正好是复合主键的第一个字段,所以不需要再加索引了。如果主键被定义为(article_id,order_id),我们就必须专门建立order_id上的索引,反而不用再为article_id专门建立索引了。

这两个表都不用加锁。

系统生成键

如果同一个表会有许多插入操作并发执行,而该表又采用了自动生成的键,那么在主键索引的创建操作上回发生十分严重的资源竞争。主键索引的主要用途,就是确保主键的唯一性。

这里通常会有一个问题,如果仅有一个生成器,那么申城的序列号就彼此非常接近。于是,将键值插入到主键索引中时所有进程将争用同一索引页,而DBMS引擎就必须串行化进程--利用锁,闩,信号量或任何合适的锁定机制--以避免任意一进程复写其他进程正在写入的数据。

采用逆序索引来降低系统生成键造成的影响。

where name like 'M%' 这是典型的范围搜索,它会使逆序索引完全失效。

一些数据库系统使用哈希索引,哈希索引是以相等与否作为工作的基础,换而言之,范围索引及类似通配符的查询,哈希索引都不支持。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值