索引
数据库的表就如同一本厚厚的字典.字典里面有我们想要查询的数据.
但是呢,一页一页地翻,然后去找到相应的内容.真是太漫长了.
而索引
呢,就如同字典的中的目录.通过索引我们可以快速地定位想要查询的内容.
然后呢,当然就去找咯!
索引的数据结构类型
索引的数据结构有三种.
- hash表
- 有序数组
- B+树
hash表
hash表大家都很熟悉了.根据某一个条件,然后把数据尽可能地均匀地分布.然后在不同的桶中.
一般就是一个数组,然后每个数组中的元素是一个链表.
但这样数据量少,还不错.但是数据量一旦上去了.每次查询就可能遍历链表中的很多数据.
会有很多时间上的不足.
有序数组
有序数组,顾名思义.数组中的元素是有顺序地.那么这样查询起来就会很快.
用二分查找 O(log n)
就可以了.
但是,我们知道数组的查询快,但是插入和删除都很糟糕.如果要是在数据前面插入或者删除第一个.
整个索引就相当于都重新排列了一下!
不同的应用场景,需要选择不同的数据库索引.
如果说,这个数据库索引类型,可以被替代,或者有什么更好的解决方案.那么就不会存在在现有的数据库中了.
在静态数据中,使用有序数据是非常有用的.
例如在去年的工资统计中,数据不会进行修改或者新加,那么有序数据就是一个很好的选择.
B+树
B+树.这里我对B+树的了解不够.不敢妄言.
我只知道B+树,在叶子节点中存储数据.而且还是有序的数据.
查询和修改都是非常快速的.
MySQL中的B+树,是N叉树.因为索引也是在磁盘中的.
索引的类型
主键索引
主键索引,一般一个表都需要一个主键作为索引.
但为啥主键一般都是递增的呢?
因为无论那种数据结构的索引,在新加数据时,如果索引是有序增加的.
那么,索引就能很方便地加入进去.
- Hash索引,希望分布在每个桶的数据是差不多的.有序的话,几乎就是平衡的.
- 有序数组,就更不用说了.如果是新增直接加到后面就好了.
- B+树
记住,数据删除了.但是索引可不会.
二级索引
除了主键之外的索引是二级索引.
二级索引的创建,可以进一步加快sql的查询.
这时,我才突然明白了一个之前的sql优化.
SELECT id FROM user
WHERE name = 'hello'
如果在name上加入了索引.那么查询user
表时,只查询id
会立刻返回结果,而不用回表
.
这里就涉及到一个非常重要的概念 回表
.
在数据库索引(B+树)中,每个叶子节点都按照顺序存放着数据.
mysql> create table T (
ID int primary key,
k int NOT NULL