数据库为什么需要索引呢?
我们都是知道数据库的数据都是存储在磁盘上的,当我们程序启动起来的时候,就相当于一个进程运行在了机器的内存当中。所以当我们程序要查询数据时,必须要从内存出来到磁盘里面去查找数据,然后将数据写回到内存当中。但是磁盘的io效率是远不如内存的,所有查找数据的快慢直接影响程序运行的效率。
而数据库加索引的主要目的就是为了使用一种合适的数据结构,可以使得查询数据的效率变高,减少磁盘io的次数,提升数据查找的速率,而不再是愣头青式的全局遍历。
那索引为啥要用B+Tree的数据结构呢?
如果我们简单地想的话,想要快速地查找到数据,感觉hash表是最快的,根据key,hash到某个槽位上,直接一次查找就可以准确的找到数据的位置,这多快呀。但是我们在做业务时,往往只需要一条的数据需求很少,大部分的需求都是根据一定的条件查询一部分的数据,这个时候hash显示不是很合适。
我们再考虑树,比如二叉树,平衡二叉树,红黑树,B树等,他们都是二分查找,找数也快,但是不管是平衡二叉树还是优化后的红黑树,说到底他们都是二叉树,当节点多了的时候,它们的高度就会高呀,我找一个数据。根节点不是,那就找下一层,下一层还没有我就再去找下一层,这样造成的后果就是我找一个数据可能要找好几次,而每一次都是执行了一次磁盘的io,而我们的索引的目的就是要减少磁盘io呀,这样设计可不行。那我们是不是把高度变矮就可以了呢?
所以我们再考虑下B树。首先简单介绍下B树的数据结构:
首先看看B树的定义。
- 每个节点