一条简单的SQL语句


在这里插入图片描述

一、唠叨几句

某个群里发现的一个问题:表t的id字段是主键索引时,select * from t where id=1 与 select * from t where id=10000000的区别,直观看过去应该是前者的速度比后者快一点,为了验证我的想法,马上去一个上亿量数据的表里去查询了一番。果不其然,一个0.00008s,一个0.00103s,我踏马这好奇心就瞬间提了上来。

二、聚簇索引

第一点:

当表中有聚簇索引时,它的数据行存放在索引的叶子页中,术语“聚类”表示数据行和相邻的键值紧凑的存储在一起。
因此无法同时把数据行放在两个不同的地方,所以一个表只能有一个聚簇索引
(如果你没有指定聚簇索引,InnoDB会用一个具有唯一且非空值的索引来代替。如果不存在这样的索引,InnoDB会定义一个隐藏的主键,然后对其建立聚簇索引。)

第二点:
因为是存储引擎负责实现索引,因此不是所有的存储引擎都支持聚族索引。这里我们主要关注InnoDB,但是这里讨论的原理对于任何支持聚族索引的存储引擎都是适用的。

下面展示了聚族索引中的记录是如何存放的。注意到,叶子页包含了行的全部数据,但是节点页只包含了索引列。

alt
所以说InnoDB是从磁盘中扫描到了主键所在的数据页,并将数据页提取到内存中,在内存中找到这条数据并返回。
那么扫描主键的速度是由什么决定的?

三、B+树

B+的搜索与B-树也基本相同,区别是B+树只有达到叶子结点才命中(B-树可以在非叶子结点命中),其性能也等价于在关键字全集做一次二分查找;
B+的特性:
1.所有关键字都出现在叶子结点的链表中(稠密索引),且链表中的关键字恰好是有序的;
2.不可能在非叶子结点命中;
3.非叶子结点相当于是叶子结点的索引(稀疏索引),叶子结点相当于是存储(关键字)数据的数据层;
4.更适合文件索引系统;

下面是B+树的树状图
alt
所以我个人感觉 select * from t where id=1 的这条语句B+树左叶子节点顺序查询,效率比较快。而 select * from t where id=10000000 这条语句B+树查询比较繁琐且用到了链表,又或者是这条语句的“树深”更为“深”一些。

转载整理自:
https://blog.csdn.net/guanghuichenshao/article/details/81948438
https://www.cnblogs.com/starhu/p/6406495.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

像豆芽一样优秀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值