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

Posted 整理是一切的开始

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了索引设计 《数据库高效优化》 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

以上是关于索引设计 《数据库高效优化》 p300的主要内容,如果未能解决你的问题,请参考以下文章

SQL优化,精准高效的手术刀

《数据库索引设计与优化》---前言

《数据库索引设计与优化》---前言

09-索引优化分析

mysql优化方向

MySql查询性能优化必知必会