如果数据库中没有索引,此时查找的时候就需要把整个表遍历一遍。
没有索引,此时的查找过程就相当于一个"顺序表查找"。
“顺序表查找”:
1.如果针对顺序表查找,顺序表在内存中,内存访问速度快,并且数据也没有那么
多,其实速度也还行。
2.如果是针对数据库顺序查找,数据库的数据是在磁盘上,磁盘访问速度更慢,并且数据量可能非常多,这个速度可能就会很慢。
所以索引就是为了避免数据库进行顺序查找 提高查找效率。
索引可以考虑的数据结构:
1.哈希表:查找效率0(1)。数据库可以考虑使用哈希表,但也有问题。
哈希表的查找过程:把key代入哈希函数,计算得到下标,再根据下标得到对应的链表,再去遍历比较key是否相等。
但只能处理相等的情况,不能处理其他的逻辑:例如> >= < <=等等。
2.二叉树(二叉搜素树):如果比较平衡,查找效率就是O(logN)。
二叉搜索树内部元素是有序的(中序遍历结果是有序的)
例如:查找id>4并且id<8的学生信息:需要先找到id为4的元素,再找到id为8的元素,中序遍历中4和61之间的结果就是想要的。但效率是O(N)。
所以,相比于哈希表,二叉搜索树虽然能处理范围查找,但是处理效率不高。
但用它来做索引会有几个问题:
1.二叉搜素树每个节点最多两个叉,当数据量比较大的时候,树的高度就会比较高。最终的操作效率也就会越低。
2.二叉搜索树直接获取到中序表遍历结果也不是很高效。
真实的索引结构是一种N叉搜索树=>B+树。
要想认识B+树,先要认识B树。
B树:
和二叉树的差异:
1.每个节点不是二叉,而是N叉了。
2.每个节点不是有一个数据,而可能存多个数据。
3.每个节点的存的数据的个数和该节点的度是相关的(度=存的数据个数+1)。
优势:
1.此时在B树上查找就是一个N分查找,而不是二分查找了,效率比二分还快。
2.由于每个节点存了多个数据,每个节点又有多个度,和二叉树相比,在保存相同个数元素时,B树的高度比二叉树低很多。
3.处理范围查找也更容易了。
B+树:
和B树相比:
1.每一层的元素之间都链接到一起了。
2.数据只在叶子节点上保存,非叶子节点上只保存一些辅助查找的边界信息。
优势:
1.叶子之间,增加了链表,获取所有节点,不再需要中序遍历,使用链表的next节点就可以快速访问到。
2.范围查找方向,不用中序遍历,直接定位到MIN和MAX之后,中间叶子节点就是结果集。
3.叶子节点放到磁盘上,非叶子节点放到内存中,查找效率就更高了(减少了读磁盘的个数)。
4.B+树从根到每一个节点的路径长度一样,查询到任何一条记录速度都是平均的,不会出现太大差异。
索引引起的效果:加快查找效率,减慢插入、删除和修改的效率,也会占用额外的空间(本质上使用空间换时间)。
索引主要的应用场景:主要是应用在查找很频繁,但是插入、删除、修改都不频繁的场景。
索引的使用:
1.查看索引:
2.创建索引:
3.删除索引:
注意事项:
创建主键约束(primary key)、唯一约束(unique)、外键约束(foreign key)时,自动创建对应列的索引。