数据库索引存储结构

数据库索引存储结构

主键索引(PRIMAY KEY):

       一个表中只能有一个主键,创建主键自动创建主键索引,该索引是唯一索引,其主键列的数据值不重复。建议使用INT型的自动增长主键,这样索引效率最高。

唯一索引(UNIQUE):

       不允许索引列的值相同。系统在创建该索引时检查是否有重复的键值,并在每次使用INSERT或UPDATE语句添加数据时进行检查。索引结果再根据主键索引查询数据。

复合索引(INDEX):

       多个列建立索引,复合索引在数据库操作期间所需的开销更小,可以代替多个单一索引;第一个字段作为条件时才能保证系统使用该索引。建议不超过2个字段的复合索引。

 

B-Tree的存储结构(例如100条数据):

数据库索引存储结构_第1张图片

       在B-Tree中按key检索数据的算法非常直观:首先从根节点进行二分查找,如果找到则返回对应节点的data,否则对相应区间的指针指向的节点递归进行查找,直到找到节点或找到null指针,前者查找成功,后者查找失败。每个域的大小都相同。

 

 

B+Tree的存储结构(例如100条数据):
数据库索引存储结构_第2张图片

       

       在B+Tree中key检索数据算法如同目录:首先从根节点进行二分查找,从左(小)边到右(大)匹配,找到key匹配成功的索引值,根据索引值对应的节点地址,进入节点地址key继续进行匹配,直到进入叶节点,再根据key获取数据。

       在B+Tree的每个叶子节点增加一个指向相邻叶子节点的指针,就形成了带有顺序访问指针的B+Tree。做这个优化的目的是为了提高区间访问的性能。

       注意:每个索引的最小值,也就是子索引的最小值,依次类推,最后的子索引的最小值,也就是该数据页的key索引的最小值。最小值都是靠最左边排列。都是节点开始的第一个值。

       注意:叶节点的数据页存有邻近的数据页节点地址,可以通过数据页的节点直接进入邻近数据页,查询需要的主键索引值。 

索引性能影响:

  • 插入:按顺序插入在尾部,对索引影响微乎其微,索引不用重新排列顺序,只需要添加顺序的记录即可。如果是中间插入,则影响索引顺序,索引需要重写排列顺序,导致性能下降。
  • 删除:尾部删除,对索引影响甚微,索引不用重新排列顺序,只要去除顺序尾部的记录即可。如果中间删除,则影响索引顺序,索引需要重写排列顺序。导致性能下降。
  • 更新:更新字段不包含索引列,性能不会降低。如果更新索引列,索引目录表将重写排列索引顺序,导致性能下降。

 

索引规则:

建立索引规则:

  • 数据量超过300的,经常与其他表进行连接的表,在连接字段上应该建立索引;表的主键、外键必须有索引;经常出现在Where子句中的字段,特别是大表的字段,应该建立索引;
  • 索引应该建在选择性高的字段类型的小字段上,比如INT类型字段;
  • 尽量不要对数据库中某个含有大量重复的值的字段建立索引。

复合索引规则:

  • 复合索引的建立需要进行仔细分析,尽量考虑用单字段索引代替;如果需要复合索引,正确选择复合索引中的主列字段,一般是选择性高的字段类型的小字段上;
  • 复合索引的几个字段是否经常同时以AND方式出现在Where子句中?单字段查询是否极少甚至没有?如果是,则可以建立复合索引;否则考虑单字段索引;
  • 如果复合索引中包含的字段经常单独出现在Where子句中,则分解为多个单字段索引;
  • 如果复合索引所包含的字段超过3个,那么仔细考虑其必要性,考虑减少复合的字段;复合索引最好只使用2个字段,索引本身也有I/O、内存、存储开销。复合索引字段越少越好。
  • 如果既有单字段索引,又有这几个字段上的复合索引,一般可以删除复合索引;

索引操作影响:

  • 频繁进行数据操作的表,不要建立太多的索引;删除无用的索引,避免对执行计划造成负面影响;
  • 表上建立的每个索引都会增加存储开销,索引对于插入、删除、更新操作也会增加处理上的开销。另外,过多的复合索引,在有单字段索引的情况下,一般都是没有存在价值的;相反,还会降低数据增加删除时的性能,特别是对频繁更新的表来说,负面影响更大。

你可能感兴趣的:(MySQL数据库)