MySQL只学有用的只学有用的–MYSQL索引原理及创建技巧索引原理及创建技巧
MySQL只学有用的只学有用的–MYSQL索引原理及使用索引原理及使用索引的基础理解索引的常见模型(字典目录的编写形式)1. 哈希表2. 有序数组3. 二叉树聊一聊InnoDB的索引模型(B+树)索引的维护
(《新华字典》的目录修改)SQL索引执行过程–回表索引创建技巧–索引覆盖索引创建技巧—最左前缀原则索引下推小结引用交个朋友好吗?
索引的基础理解索引的基础理解
索引是数据库系统里面最重要的概念之一,索引就是为了提高数据查询的效率,就像书的目录一样。一个字典如果想找其中的一个字的解释,如果不借助目录的情况下,那估计要找
很长一段时间了。索引就是数据库的目录。 我们学习索引就像是在学校查字典。我们学习索引就像是在学校查字典。
索引的常见模型(字典目录的编写形式)索引的常见模型(字典目录的编写形式)
下面我们介绍三种常见的数据结构:哈希表、有序数组、搜索树
1. 哈希表哈希表
哈希表是一种以键-值(key-value)存储数据的结构,我们只要输入待查找的值即key,就可以找到其对应的值即value。 哈希的思路很简单,把值放在数组里,用一个哈希函数把key
换算成一个确定的位置,然后把value放在数组的这个位置。
多个key值经过哈希函数的换算,会出现同一个值的情况。处理这种情况的一种方法是,拉出一个链表。
假设,你现在维护着一个身份证信息和姓名的表,需要根据身份证号查找对应的名字,这时对应的哈希索引的示意图如下表示 :
因为身份证号全国都是唯一的,所以我们用身份证号作为key,用姓名作为
图中,User2和User4根据身份证算出来的值都是N,但没关系,后面还跟了一个链表。假设,这时候你要查ID_card_n2对应的名字是什么,处理步骤就是:首先,将ID_card_n2通过
哈希函数算出N;然后,按顺序遍历后面的链表,找到User2。
需要注意的是,图中四个ID_card_n 的值并不是递增的,这样做的好处是增加新的User时速度会很快,只需要往后面追加。但缺点是,因为不是有序的,所以哈希索引做区间查询的
速度 是很慢的。
你可以设想下,如果你现在要找身份证号在[ID_card_X,ID_card_Y]这个区间的所有用户,就必须全部扫描一遍了。
所以,哈希表这种结构适用于只有等值查询的场景,比如Memcached及其他一些NoSQL引擎。
java语言中的hashMap就是用的这种数据结构,里面有一个概念叫做哈希碰撞,就是指将key 进行哈希运算之后,得到的值相等,value应该怎么存储。就是通过上面所说的,数组
+链表的方式来保存的。
2. 有序数组有序数组
关于数组的介绍请看另一篇文章
数组
3. 二叉树二叉树
先来看一张图