索引是什么意思

相信很多程序员朋友都很熟悉数据索引 。比较常见的索引是b树索引,可以加快数据库的检索速度,但是会降低添加、修改、删除操作的速度,一些写错会导致索引失效 。
但是如果问,为什么使用索引后查询更快?b树指数的原理是什么?这个时候很多人可能还不知道 。我就以mysqlinnodb引擎为例,谈谈b树索引的原理 。
索引基础知识
mysql的基本存储结构是page,大概是这样的:
在这里,我们需要了解以下几点(非常重要):
当我们使用mysqlinnodb引擎创建一个表时,主键只能有一个;如果我们不明确指定介于,mysql会自动生成一个隐式字段作为主键 。
聚集索引:用主键创建的索引;聚集索引的叶节点将数据存储在表中;
非聚集索引:由非主键创建的索引;非聚集索引在叶节点存储主键和索引列 。使用非聚集索引查询数据会查询叶子上的主键,然后根据主键查找数据(这个过程称为返回表) 。
页面与页面之间以及页面与数据之间的关系
我们用聚集索引来解释,页面和页面之间,以及页面和数据之间的关系如下:
数据页之间形成双向链表 。
每个数据页中的记录都是单向链表;
【索引是什么意思】每个数据页根据内部记录生成一个页面目录 。如果是主键,可以通过二分法在页面目录中快速定位;
如果我们按照一个非主键、非索引的列进行查询,需要遍历双向链表才能找到页面;遍历页面中的单向链表;如果表中的数据很大,这样的查询会很慢 。
二叉树索引的原理
我们先来看看b树索引是什么样子的(以集群/主键索引为例):
如果我们此时要查询id=16的数据:
查询page-1,发现page-2存储的数据小于30;
查询第2页,发现第5页存储了10~20个数据;
查询第5页,找到id=16的数据 。
显然,在不使用索引的情况下,需要遍历双向链表来定位对应的页面,而有了索引,就可以通过层层“目录”来定位对应的页面 。
为什么b树索引降低了添加、修改和删除的速度
b树是一棵平衡的树 。如果您添加、修改或删除此树,它将破坏其原始结构 。
当我们添加、修改和删除数据时,我们需要花费额外的时间来维护索引;
由于这些额外的开销,索引会降低添加、修改和删除的速度 。
思考考试问题,欢迎留言讨论
现在你明白b树指数的原理了吗?
比较后,留下一个深思熟虑的问题:为什么建议使用自增长主键作为索引?,你可以在你的信息中写下你的答案 。

索引是什么意思

文章插图