mysql有关索引_浅谈MySQL索引

索引对查询的速度有着至关重要的影响,理解索引也是进行数据库性能调优的起点。索引可以包含一个或多个列的值,如果索引包含多个列的值,则列的顺序也十分重要,因为MySQL只能高效地使用索引的最左前缀列。

B+树索引(InnoDB)

在B+树中,所有记录节点存放在叶子节点上且是顺序存放,由各叶子节点指针进行连接。如果从最左边的叶子节点开始顺序遍历,能得到所有键值的顺序排序。使用B+树存储数据可以让一个查询尽量少的读磁盘,从而减少查询时磁盘I/O的时间。

在 InnoDB 中,表都是根据主键顺序以索引的形式存放的,这种存储方式的表称为索引组织表。每一个索引在 InnoDB 里面对应一棵 B+ 树。

主键索引和非主键索引

主键索引的叶子结点存的是整条记录,主键索引也被称为聚簇索引。

非主键索引的叶子结点存的是主键的值,非主键索引也被称为二级索引/普通索引/辅助索引。基于非主键索引的查询需要多扫描一棵索引树。

1)在应用中应该尽量使用主键查询。

2)因为非主键索引树的叶结点存放的是主键的值,应该考虑让主键的字段尽量短,这样非主键索引的叶子结点就越小,非主键索引占用的空间也就越小。一般情况下,建议创建一个自增主键,这样非主键索引占用的空间最小。

联合索引

MySQL中的索引可以以一定顺序引用多列,这种索引叫作联合索引。

最左原则

联合索引(a, b)是根据a, b进行排序(先根据a排序,如果a相同则根据b排序)。查询的时候查询条件精确匹配索引的左边连续一列或几列,才能命中索引。

最左原则原理

联合索引的底层是一颗B+树,联合索引的B+树节点中存储的是键值。由于构建一棵B+树只能根据一个值来确定索引关系,所以数据库依赖联合索引最左的字段来构建。

注意

查询的时候如果两个条件都用上了,但是顺序不同,那么现在的查询引擎会自动优化为匹配联合索引的顺序,这样是能够命中索引的。

由于最左前缀原则,在创建联合索引时,索引字段的顺序需要考虑字段值去重之后的个数,较多的放前面。ORDER BY子句也遵循此规则。

回表

select * from T where k between 3 and 5;

则这条SQL语句的执行流程如下:在 k 索引树上找到 k=3 的记录,取得 ID = 300;

再到 ID 索引树查到 ID=300 对应的数据;

在 k 索引树取下一个值 k=5,取得 ID=500;

再回到 ID 索引树查到 ID=500 对应的 数据;

在 k 索引树取下一个值k=6,不满足条件,循环结束。

在这个过程中,回到主键索引树的过程,称为回表。由于查询的结果是所有字段,所需要的数据只有主键上才有,所以不得不回表。

select ID from T where k between 3 and 5;

由于查询的值是ID,而ID的值已经在k索引树上了,因此可以直接提供查询结果,不需要回表。也就是说,在这个查询里,索引k已经“覆盖了”我们的查询需求,故称为覆盖索引。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值