目录。
理解索引:
功能:
使用索引:
数据结构在索引的底部a;
哈希表。
AVL树。
红黑树。
b树:
B+树:
B+树木搜索:
在数据库中,索引是数据结构,用于加快查询操作。
例如,字典如果一一搜索,这种效率会很低。
但是如果给它贴上标签,,你可以找到你想搜索的东西,所有它。大大提高了我们的查询速度。
索引可以提高查询速度,但是,增删和删除的速度可能会减慢,后续增删数据的操作,都需要同步索引。但在实际开发中,查询频率远高于增删改操作,所以利大于弊。
///查看索引show index from 表名;///创建索引//非主键、非唯一约束、非外键字段,可以创建普通索引createe index 索引名 on 表名(字段名);///删除索引dropp index 索引名 on 表名;
操作:
注意:。
。 创建索引也是一个危险的操作!!!
在空表或数据量相对较小的表中创建索引没有问题,但是,如果表中的数据很大,此时,创建索引将导消耗大量CPU/硬盘IO,MySQL可以直接挂起;方法:
1.预测哪些索引可能会频繁使用,根据建议提前创建。
2.引入新的数据库服务器,提取创建索引#xff0c;将旧数据库服务器数据慢慢导入新服务器(常规做法);
索引必须引入一些额外的数据结构,加快查询速度!
引入索引的目的,通过其他数据结构,加快查询速度,为了减少表的遍历!
那么哪些数据结构可以加快查询速度?
。1.顺序表: 随机访问,插入删除效率低 不适合加快查询速度。
2.链表:从头到尾遍历更不能加快查询速度。
。3.哈希表 。
众所周知,#xff0c;查询哈希表最快的,构建合适的哈希函数,即使在极端情况下,也能达到O(1)查询速度c;通过哈希函数将所有值映射到同一个哈希桶上达到O(N),理论上,这种情况只存在于,现实中几乎不可能出现。最坏的情况下哈希桶上的每个链表长度为M,O(M)也是近视O(1)。 。
虽然哈希表的查询速度特别快,但它只能找到特定的值(key),不是一系列范围,但是,当我们在数据库中找到它时,它是一系列的范围数据,因此,不适合数据库查询;
4.树。
二叉搜索树的数据 中序遍历是连续范围内的数据 有序,可进行范围查询假如是一棵相对平衡的二叉树搜索树 遍历速度O(logN) 在最坏的情况下,成为链表,就会变成O(N)速度。
是一棵严格的二叉搜索树,子树高度不得超过1 所以遍历速度O(logN) 但是当你非常严格的时候,每次增删操作,从而触发旋转操作每次旋转都会有开销。
红黑树没有AVL树那么严格,触发旋转的概率很小,虽然没有AVL树平衡,但查询速度也没有太大差别。
红黑树中的数据 中序遍历是连续范围内的数据 有序,可进行范围查询但是因为是二叉型,所以是二叉型c;如果数据量特别大这将使树的高度非常高,每加一层树的高度c;比较次数会增加一次,因为数据保存在硬盘中,会有更多的硬盘IO操作,它的查询效率会变慢,因此不适合大规模数据。
。因此,引入了B树,它是N叉搜索树,相同数量的数据,所需节点减少,树的高度大大降低了,从而减少了遍历的次数。
以上是B树的大致形状。
1.每个节点上的key有序,比较时可以直接用二分搜索。
2.B树将控制每个节点上的key数量,如果key太多,c;它会分裂出更多的叶节点。
3.多个数据都放在连续的存储空间上,比较时,使用一次IO就可以遍历整个节点。 。所以B树更适合这个数据量的范围搜索,但数据库索引的最终形式是。B+树。,B树升级版。
B+树也是N叉树。 。对比B树 B+进一步优化了树木。
1.B+每个父节点的元素都会出现在子节点的最大值。
2.。 B树的每个节点都包含键值(Key)以及相应的值(Value)(包括。叶节点和非叶节点。)。而。B+树非叶节点。只存储。键值(Key)也就是说,ID叶子节点。存储所有数据,而且每个叶节点都是以。链表结构。存储,B+树叶节点可以通过简单的顺序访问。高效实施范围查询。
3.每次查询操作,都会落到最后一个叶节点,硬盘IO每次都是。稳定(在计算机中稳定地做一件事是非常重要的;
4. B+存储在树非叶节点的数据相对较小,所有可以存储在内存中的,进一步减少硬盘IO的数量。
特性。 | B树。 | B+树。 |
---|---|---|
数据存储位置。 | 所有节点(数据存储;包括内部节点) | 叶节点中只存储数据。 |
内部节点。 | 存储键和值。 | 存储键(不存储数据) |
叶节点链接。 | 无链接。 | 叶节点通过链表连接。 |
查询效率。 | 适合单点查询。 | 更适合范围查询。 |
性能范围查询。 | 较差。 | 非常高效(#xff09通过叶子节点链表; |
树的高度。 | 相对较高。 | 较低。 |
使用内存/磁盘。 | 内存和磁盘使用相对较低。 | 更高效,能容纳更多的节点。 |
Mysql支持各种存储引擎,其中。InnoDB。最常用的(也是面试经常考试的内容),不同的存储引擎使用不同的索引 。
以下是BƱ如何检索有无索引的树:
CREATE TABLE employees ( id INT PRIMARY KEY, name VARCHAR(50), age INT);
在这张表中,id为主键所有默认会创建索引,name和age列没有创建索引。
1)主键索引列遍历。 。
SELECT * FROM employees WHERE id = 5;
MySQL 会利用 B+ 树索引,直接从根节点开始搜索#xff00c;快速定位到 。id = 5。
叶节点,查询的时间复杂度为 O(log N)。 。
2)无索引列遍历。 。
SELECT * FROM EMPLOYEES WHERE NAME = 'zhangsan' ;
MySQL 只能通过全表扫描找到数据,效率低,特别是当表中的数据量较大时。
3) 。有索引的列不是主键索引。
create index index_id on employees(age) ;
。此时为age列创建索引。
select * from employees where age = 20 ;
此时,根据关于age的B+找到相应的叶子节点,但此时非主键索引的B+存储树叶节点的主键ID,所以找到ID后然后在ID主键索引的B+中;树中遍历 找到相应的叶节点,此时,叶节点正在存储我们想要找到的数据;
因此,有必要经历两次B+次;树,第一次找到主键ID然后在B+#主键ID;找到相应的值;
总结: 。