MySQL数据库索引常见问题

  笔者看过不少数据库相关方面的面试题,但大多数答案都不太准确,所以决定在本身blog进行一个总结。mysql

Q1:数据库有哪些索引?优缺点是什么?面试

1.B树索引:大多数数据库采用的索引(innoDB采用的是b+树)。可以加快访问数据的速度,尤为是范围数据的查找很是快。缺点是只能从索引的最左列开始查找,也不能跳过索引中的列,若是查询中有某个列用到了范围查询,则右边全部列都没法使用索引优化查找。算法

2.哈希索引:基于哈希表实现。在MySQL中,只有Memory引擎显式的支持哈希搜索。哈希查找的速度很是快,但哈希索引只包含哈希值和行指针,不存储字段值,因此不能用索引中的值来避免读取行,也不能进行排序。因为哈希索引使用的是索引列的所有内容来计算哈希值的,因此不支持部分全部列匹配查找。哈希只支持等值比较,不支持任何范围查询。一旦哈希冲突不少的话,维护成本很是高。innoDB支持“自适应哈希索引”(adaptive hash index)。sql

3.全文索引:全文索引是一种特殊类型的索引,它查找的是文本中的关键字,而不是比较索引的值。最初只能在MyISAM上使用,5.6.24之后innoDB也支持了全文索引。全文索引的查询要使用Match....against,在相同的列上同时建立全文搜索和基于值的B-Tree索引不会有冲突。数据库

4.空间数据索引(R-tree索引),MyISAM支持R树索引,好处是无需前缀查询,会从全部纬度来索引数据,能够用做地理数据的存储;缺点是必须使用MySQL的GIS相关函数如MBRCONTAINS( )等来维护数据,但因为MySQL中的GIS并不完善,所以大多数人不会使用这个特性。数据结构


Q2:为何不实用二叉查找树或者红黑树做为数据库索引。函数

二叉树在处理海量数据时,树的高度过高,虽然索引效率很高,达到logN,但会进行大量磁盘io,得不偿失。并且删除或者插入数据可能致使数据结构改变变成链表,须要增进平衡算法。而红黑树,插入删除元素的时候会进行频繁的变色和旋转(左旋,右旋),很浪费时间。可是当数据量很小的时候,彻底能够放入红黑树中,此时红黑树的时间复杂性比b树低。所以,综上考虑,数据库最后选择了b树做为索引。性能


Q3:B tree和B+ tree应用场景:优化

1.B树经常使用于文件系统,和少部分数据库索引,好比mongoDB。指针

2.B+树主要用于mysql数据库索引。


 

Q4:B+ tree对比B tree的优势

B树的每一个节点除了存储指向 子节点的索引外,还要存储data域,所以单一节点指向子节点的索引并非不少,树的高度较高,磁盘io次数较多。B+树的高度更低,且全部data都存储在叶子节点,叶子节点都处于同一层,所以查询性能稳定,便于范围查找。

相关文章
相关标签/搜索