本文已参与「新人创作礼」活动,一起开启掘金创作之路。
概述
什么是索引?有什么用?
索引是帮助MySQL高效获取数据的一种数据结构,可以提高数据查询的效率。
例如我们要找书名为"MySQL"的书籍,那么我们的筛选条件是where book_name = "MySQL",此时如果没有排序,我们可能要进行全表扫描,反之若排了序,直接去M开头里面的数据找就行了。
也就是说,除了存储的数据,数据库会维护一个数据结构使得我们的查询效率提高,这种数据结构就是索引,比如B+树索引。一般索引结构会很大,不会放在内存中,而是以索引文件的形式存放在磁盘上。(物理存储的形式是索引页)
使用索引的优缺点
优点:
- 提高数据库检索效率,降低IO成本;
- 通过索引对数据进行排序,降低排序成本。
- 唯一性索引可以保证表中每一行数据的唯一性;
缺点:
- 建立和维护索引耗费时间和空间。
- 会降低修改效率。
为什么InnoDB选择B+tree索引?
hash索引,精确查找O(1),不支持范围查找和排序,若发生大量哈希冲突会降低检索效率。
红黑树和B树,每节点都会存数据,所以一个结点放不了太多索引,在数据量很大的情况下,会导致树的深度过深而降低检索效率。
B+树,非叶节点只存索引,所以可以存放更多索引,叶子节点只存放数据,所以可以存放更多数据,使得B+树更加矮胖。
- 叶子结点之间通过双向链表建立连接,从而支持范围查找和排序操作。
- 范围查询效率更高:B树中序遍历整个树,B+树遍历叶结点中的链表;
- 查询效率更加
稳定:每次查询都从根结点到叶结点,路径长度相同;
为什么mysql使用B+树作为索引,MongoDB选择B树作为索引?
MongoDB 是 nosql 类的聚合型数据库,更适用于数据模型简单,性能要求高的场景,要求单个数据的查询效率要高。B树将数据与索引存储在同一个结点上,只要找到指定索引就可以访问数据,查询单个数据的平均时间B树少于B+树。
Mysql是关系型数据库,数据的关联性非常强,范围查询更为常见。B+树中间节点不存储数据,所有数据存储在叶节点,并用双向链表维护,更容易进行范围查询。