不知道你有没有这种感受,那些所谓的数据结构和算法,在平常开发工做中不多用到或者几乎未曾用到,可能只是在每次换工做准备面试的时候才会捡起来学习学习。mysql
那我但愿今天这篇文章能让你对数据结构的具体应用能有个初步的概念,就从咱们天天都在用的 mysql 数据库提及吧。面试
今天这个标题,严格来讲实际上是不正确的,我在前面的文章中有这么解释过:算法
首先,mysql 主要是由 server 层和存储层两部分构成的。server >层主要包括链接器、查询缓存,分析器、优化器、执行器。存储层主要是用来存储和查询 数据的,经常使用的存储引擎有 InnoDB、MyISAM,MySQL 5.5.5版本后使用 InnoDB >做为默认存储引擎。sql
这篇文章咱们主要讨论 mysql 的存储层,不一样的存储引擎其底层的数据结构是不同的,咱们这里就以默认的 InnoDB 为例,因此严格来讲应该是 InnoDB 为啥要选择 B+ 树这种数据结构来存储数据。数据库
在文章正式开始以前,你先要知道 mysql 中的 InnoDB 在底层是采用 B+ 树这种数据结构来存储数据的。你先记住就行了,下面咱们再来一步一步解释为何。数组
首先你要知道,mysql 的索引主要是为了提升查询效率的,那必定得找一个合适的数据结构来存储数据,哈希表、数组、二叉搜索树这三种常见的数据结构均可以提升查询效率。缓存
哈希表就是一种以键值对来存储数据的结构,你能够经过一个 key 就能够很快的查询出对用的 value 值。哈希表主要是利用了数组的随机访问特性,实现思想主要是经过一个哈希函数把 key 转换成一个哈希值,这个哈希值就对应数组中的某个下标。数据结构
可是因为哈希表是无序的,区间查询效率会很是的慢,因此哈希表一般只用于查询单个值。数据结构和算法
数组就好说了,数组具备连续性和随机访问特性,所以数组都能很高效的进行单个等值查询和区间查询,可是 mysql 不只仅是查询数据,还会有插入和删除数据的操做。函数
在有序数组中插入或删除一个数据会须要批量移动数组中其余数据,这是一个不小的消耗,影响性能。所以有序数组适合处理静态数据,好比一些过往的不会再修改的数据。
在这里你可能会问,既然哈希表其实也是利用了数组的特性,那有了数组为啥还须要哈希表呢。是由于数组下标 key 只能是数字,而哈希表能够支持字符串 key,哈希函数能够把这个 key 转换成一个数组下标。
同时,不一样的 key 若是经过哈希函数转换成了相同的数组下标,这就会形成冲突,在哈希表中通常会经过再拉出一个链表来保存这个冲突的值。
关于哈希表这里就再也不多说了,后面的文章再详细解释哈希表的原理以及相关应用。
注意,二叉搜索树和二叉树不同,二叉树是指每一个节点的左儿子小于父节点,父节点又小于右儿子,即二叉搜索树的中序遍历就是一个有序序列。
因为索引不只仅是存在内存中,还会存储在硬盘中,所以就会涉及到 IO 性能了,就要求树的高度不能过高。实际上 B+ 树就是经过二叉搜索树推演改进的,我将在后面的文章再详细解释这个改进过程。
哈希表适合等值查询,因为是无序的,区间查询会很慢。
有序数组适合等值和区间查询,可是数组具备连续性,插入和删除操做均可能须要移动其余元素。
二叉搜索树因为树的高度,区间查询须要中序遍历,都会致使查询效率很慢。
注意,在一些文章中常常会把 B+ 树说成 B 树或者 B-tree,这实际上是错误的,B 树和 B+ 是两种不一样的树,B+ 树是 B 树的一个优化,后面的文章我会再详细解释这个优化过程。
并且 B- 树其实也就是 B 树,这个符号并非加减中的减号,并非所谓的 "B 减树",只是一个链接符号而已。
这篇文章就先写到这了,但愿你能有些收获,若是对你有一点点帮助,就给文章点个好看吧,感谢支持。