1. 索引的出现是为了提高查询效率,就像书的目录。
  2. 实现索引的数据结构有很多,常见的三种分别是哈希表、有序数组和搜索树。
  3. 哈希表是一个key-value的表,将索引key经过哈希计算放置到表中对应位置,如果该位置已经被占用了,那么将这个位置的元素通过地址串联成一条链。
  4. 可以发现哈希表中元素的存放是通过索引值进过哈希计算得出的位置,这样连续索引值在表中也不是顺序存放的;那么哈希表的方式只适用于等值查询的场景,比如Memcached或其他NoSQL引擎。如果要做区间查询,那么就需要将整个hash表遍历一遍。
  5. 有序数组在等值查询区间查询上的表现都优秀,但是如果数据表做插入操作的话,整张有序数组表都要更新,性能消耗较大。所以有序表只适用于静态存储引擎
  6. 二叉搜索树是一种很好的查询工具,其查询的时间复杂度是O(log(n)),当更新数据后其为了维持平衡性所做的自平衡操作的时间复杂度也是O(log(n))。但是在现实中的数据库中使用在索引上的却并不是二叉树,为什么数据库存储使用b+树 而不是二叉树,因为二叉树树高过高,每次查询都需要访问过多节点,即访问数据块过多,而从磁盘随机读取数据块过于耗时。
  7. 在innoDB的存储引擎中,默认使用主键为索引,主键索引:key:主键,value:整行data。普通索引:key:索引列的值,value:主键值。以主键为索引搜索,则直接搜索主键索引的B+树就可得到结果,而搜索普通所有,则会先搜索普通索引B+树得到主键值,然后回表得到完整data。
  8. 自增主键防止页分裂,逻辑删除而非物理删除防止页合并。
  9. 如果选用业务值做主键的话,往往会引起1.业务值过长,导致其他普通索引的value值过长,占用空间;2.业务值往往不能保证顺序,更新可能会引起页分裂,影响性能。
  10. 所以一般情况下,使用自增主键更为合理。
  11. 因为普通所以的value存放的是主键值,所以一般通过普通索引进行查询的话需要先在普通索引查询到主键值,然后回主键索引上去查找整行信息,这个过程称为回表。
  12. 覆盖搜索,是只需要通过一次搜索不需要回表,应为覆盖搜索的属性就是主键本身。
  13. 建立联合索引也可以实现覆盖搜索,比如身份证系统中,建议一个身份证号card_id和人名name的联合索引,那么用户名的信息也会出现在身份证号的索引树上,这样通过身份证号查询人名就不需要回表了,极大提高了查询效率。但建立信息冗余的联合索引需要消耗额外资源,需要考虑。
  14. 建立联合索引(a,b)、(b) 还是 (b,a)、(a)?考虑空间,字段长的只建立一次,短的建立两次。

牛刀杀鸡
3 声望0 粉丝