索引相关问题

密集索引和稀疏索引的区别

  1、密集索引的每个搜索码值都对应一个索引值

  2、稀疏索引只为索引码的某些键建立索引项

主流mysql数据库引擎对这两索引的选择:

  InnoDB:

  1、如果一个主键被定义了,则改键作为密集索引。

  2、如果没有主键被定义,那么该表的唯一非空索引则作为密集索引。

  3、若不满足以上两点,InnoDB内部隐藏生成6字节的列作为密集索引。

  4、非主键索引存储相关键位和对应主键值,要定位数据必须需要两次查找。

  ISAM:

  主键索引个和辅助索引均为稀疏索引。

联合索引最左匹配的成因:

  1、mysql会向右匹配直到遇到范围查询(<> between like等)终止。

  2、= 和 in可以乱序,因为mysql的查询优化器会帮我们调整成能够索引识别的形式。

  3、mysl创建复合索引首先会对最左边的索引列进行排序,在对第一个索引字段排序的基础上在对第二个索引列进行排序,第一个字段是绝对有序的,直接用第二个索引字段单独查找是用不到索引的,

HASH索引弊端: 理论上来说HASH索引的效率要比B+tree的效率要高。

  1、仅仅能满足等于或者IN的查询,不能够使用范围查询。

  2、无法用来避免被排序的操作。

  3、不能利用部分索引键查询。

  4、不能避免表扫描。

  5、遇到大量HASH值相同的数据检索效率并不一定比B+树的检索效率高。

位图索引弊端:

  目前只有oracle数据库支持位图索引,只仅限有限值的固定的几个值,比如性别,颜色等,但位图索引不适用高并发的OLTP应用,只使用与OLAP应用,当数据发生删除,修改则需要锁定所有的行以防读错数据。

结论:

  HASH索引和位图索引由于自身避免并没有被广泛应用,与之相反的B+tree能很好的解决以上缺点,因此现在数据库是主流索引都是B+tree。

原文地址:https://www.cnblogs.com/niuyg928/p/15144888.html