找到切入点
程序的输入值为哪些,以及定义的数据子集的大小,是建立索引的基础。
索引是一种尽快访问“特定数据”的技术。
靠索引并不能实现对所有数据的快速访问。
处理开销:每当在表中插入或删除记录时,该表的所有索引都必须进行相应调整。每当对已建立索引的字段进行更新时,这种调整也会发生。这种调整意味着:占用大量CPU资源以扫描内存数据块、地洞I/O操作将变动记入日志文件、可能引起更多的数据库问价I/O操作,并可能引起数据库系统进行维护存储设备空间分配的操作。
维护一个索引的开销,可能比维护一张表的开销还要大。
在大规模并发访问的环境中,过多索引会造成资源竞争和加锁。更新带索引的表时,既要更新表中的数据,又要更新索引数据。于是,并发更新可能涉及的区域散布于表的各个部分。更改实际数据意味着一连串的冲击影响。
对支持事务处理的数据库,大部分SQL语句要么查出少数几行数据,要么处理少数几行记录,此时索引对提升性能价值很大。
决策支持系统的性能也在很大程度上依赖索引。
如果事务处理型数据库的表都符合范式的要求,需要增加索引的字段应该很少;这些表肯定都有主键,,在声明了主键字段后,它们会被自动加上索引;同样,具有唯一性的字段极可能在实现完整性约束时被加上索引;
索引与目录
书的索引和数据库的索引相似,而目录提供整书的机构概览,起到与索引互补的作用。
目录和索引之间的关键区别是:目录项指示正文块,可能是一章或是一节。
让索引发挥作用
如果需要的是某个数据项中非常具体的信息,就可以使用索引;但如果是想阅读整个主题的内容,则应该使用目录而不是索引。
匹配某索引键的记录所占的平均百分比反映了索引的可选择性,百分比越低,索引的可选择性就越高。
函数和类型转换对索引的影响
索引通常使用树(tree)结构实现。要找到一条数据记录的物理地址(该地址保持在索引中),就必须比较键值与保存在当前树节点中的值,判断要递归搜索哪个子树。
一定要显示的用转换函数进行转换。
索引与外键
主键访问冲突,加锁。
同一字段,多个索引
系统的为外键增加索引,常导致同一字段有多个索引的情况。
因为order_id正好是复合主键的第一个字段,所以不需要再加索引了。如果主键被定义为(article_id,order_id),我们就必须专门建立order_id上的索引,反而不用再为article_id专门建立索引了。
这两个表都不用加锁。
系统生成键
如果同一个表会有许多插入操作并发执行,而该表又采用了自动生成的键,那么在主键索引的创建操作上回发生十分严重的资源竞争。主键索引的主要用途,就是确保主键的唯一性。
这里通常会有一个问题,如果仅有一个生成器,那么申城的序列号就彼此非常接近。于是,将键值插入到主键索引中时所有进程将争用同一索引页,而DBMS引擎就必须串行化进程--利用锁,闩,信号量或任何合适的锁定机制--以避免任意一进程复写其他进程正在写入的数据。
采用逆序索引来降低系统生成键造成的影响。
where name like 'M%' 这是典型的范围搜索,它会使逆序索引完全失效。
一些数据库系统使用哈希索引,哈希索引是以相等与否作为工作的基础,换而言之,范围索引及类似通配符的查询,哈希索引都不支持。