ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

索引设计 《数据库高效优化》 p300

2022-02-20 10:03:50  阅读:150  来源: 互联网

标签:Hash 函数 创建 数据库 复合 查询 索引 p300


对于查询中需要作为查询条件的字段,可以考虑建立索引,当然,最终还要根据性能的需要决定是否建立索引。
建立索引时也要考虑维护成本,不能无序地创建索引。
下面介绍构建战略性索引的策略
1.B树索引 b tree

  • 控制单表索引个数,尽量不能超过5个,没有任何索引的单表也需要关注。
  • 需注意监控创建的索引中不要出现无用索引。必要时,删除无用的索引,避免对执行计划造成影响。
  • 如果存在外键,需要在对应字段创建索引,否则会引发死锁并影响表连接性能,
  • 对于经常出现在WHERE子句中且过滤性比较强的字段,特别是大表的字段,应该创建索引。

2.位图索引 bitmap
位图索引不同于传统的B树索引,其原理是根据数据列的离散值构建出一张位图。它应该建立在低基数列,适合集中读取。
不适合插入和修改,比B树索引节省空间。它主要应用于数据仓库和决策支持系统,特点是绝大多数操作是复杂的查询操作。
导入数据的操作也是采用批量导入的方式,几乎没有删除和更新操作。

位图索引的锁机制和B树索引不同,B树索引中包含所有键值非空的ROWID,而位图索引包含的是一个ROWID范围和范围
对应的编码,如果删除一条记录,那么不仅会锁住这条记录,而且会锁定位图索引中与这条记录同一索引范围内的所有记录。
由此可见,建立位图索引的表时,锁的最小粒度变成位图索引的范围。这就意味着多个用户并非访问时,表被锁定的概率大大
增大。因此,操作位图索引时,应采用批量修改、迅速提交的方式。

3.复合索引
当某个索引包含多个索引的列时,这种索引就称为复合索引。当查询多个条件为AND关系的数据时,可以使用复合索引快速定位
到该数据。对符合索引的使用,需要注意:

  • 过度索引:不要讲所有的WHERE条件中的字段都创建为符合索引。因为索引会造成DML操作的开销增大,且空间上也会存在很大的浪费。
  • 复合索引中的列顺序:所有的索引列都在WHERE条件中时,索引的效率和索引中列的顺序是无关的。因而,当不是所有索引的列都在WHERE条件中时,
    最佳的列顺序要求就是能够尽最大可能使用索引,in other words,应该能够对最多的SQL语句应用索引。当多个列的使用频率相同时,可以遵从以下两种截然相反的方法:
  • 如果将来的SQL语句只对部分列应用限制条件,前导列应该是具有最多唯一值的列,换句话说,就是使索引被优化器选择的概率最大化。

复合索引的使用建议:

  • 如果约束条件字段比较固定,则优先考虑创建针对多字段的普通B树复合索引
  • 如果单个字段是主键或唯一字段,或者可选性非常高的字段,尽管约束条件字段比较固定,也不一定要创建复合索引,有时可创建单字段索引,降低复合索引开销。
  • 在复合索引设计中,应考虑复合索引的第一个设计原理:复合索引的前缀性。即在SQL语句中,只有将复合索引的第一个字段作为约束条件,该复合索引才会启用。
  • 在复合索引设计中,应考虑复合索引的可选性,即按可选性高低,进行复合索引字段的排序。

5.函数索引
除了上述索引外,还有一些其他索引,其中用得比较多的是函数索引。函数索引可以是B树索引,也可以是位图索引,它将一个函数计算的结果存储在索引中,而不是
存储列数据本身。我们可以把基于函数的索引看作是一个虚拟列上的索引。总之,索引函数索引,是基于加工过的逻辑列创建的索引。

函数索引适用于基于基础表中一个或者多个列的函数或表达式,查询语句条件列上包含函数的情况。
函数和表达式值预先计算并存放在索引中。要使用函数索引,就要分析表,启用查询重写。
设置函数索引,会减慢DML的速度,因为需要先求函数值或表达式。

视图

references:
https://blog.csdn.net/weixin_36269733/article/details/113538907

Hash散列索引

Hash散列索引是根据HASH算法来构建的索引。虽然 Hash 索引效率高,但是 Hash 索引本身由于其特殊性也带来了很多限制和弊端,主要有以下这些。

适合:

精确查找非常快(包括= <> 和in),其检索效率非常高,索引的检索可以一次定位,不像BTree 索引需要从根节点到枝节点,所以 Hash 索引的查询效率要远高于 B-Tree 索引。

不适合:

不适合模糊查询和范围查询(包括like,>,

不适合排序,数据库无法利用索引的数据来提升排序性能,同样是因为Hash值的大小不确定;

复合索引不能利用部分索引字段查询,Hash 索引在计算 Hash 值的时候是组合索引键合并后再一起计算 Hash 值,而不是单独计算 Hash 值,所以通过组合索引的前面一个或几个索引键进行查询的时候,Hash 索引也无法被利用。

同样不适合键值较少的列(重复值较多的列)
————————————————
版权声明:本文为CSDN博主「zhoudiNEU」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_36269733/article/details/113538907

标签:Hash,函数,创建,数据库,复合,查询,索引,p300
来源: https://www.cnblogs.com/ukzq/p/15914880.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有