文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

什么是走索引?

admin

admin

2024-04-02 19:55

关注

索引是一种利用某种规则的数据结构与实际数据的关系加快数据查找的功能。我们的数据库中存储有大量的内容,而索引能够通过数据节点,根据特定的规则和算法快速查找到节点对应的实际文件的位置。简单来说索引就像书的目录,能够帮助我们准确定位到书籍具体的内容。

最近在学习索引的时候遇到了一个问题,下面我们通过重现的方式来看一下。

首先建立一个如下测试表:

CREATE TABLE `simple_table` (
  `id` int NOT NULL AUTO_INCREMENT,
  `c1` datetime DEFAULT NULL,
  `c2` datetime DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `c2__idx` (`c2`),
  KEY `fun_c1_idx` ((cast(`c1` as date)))
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

fun_c1_idx: 是mysql8开始支持的函数索引

然后往这个表里随机插入1000 条数据。

select * from simple_table where date(c2) = '2022-01-01';

可以看到上面的这条 SQL 语句不能走索引。因为索引树中存储的是列的实际值和主键值,所以对条件字段做函数操作是会让索引失效的。简单来说就是,如果拿 ‘2022-01-01’ 去匹配,将无法定位到索引树中的值。因此正确选择是放弃走索引,选择全表扫描。

我们再看下一条 SQL。

select id,c2 from simple_table where date(c2) = '2022-01-01';

与第一条不同,这条 SQL 只返回了部分列,而且这些列都在索引中了。然后我们用 explain 分析一下这条 SQL 的执行计划,判断它能否走索引:

上图可以明显看到 key 值为`c2__idx`,即走了索引。

这里就很奇怪,不是说对条件字段做函数操作是会让索引失效吗,为什么这里又走了索引?

这就是我当时在学习时遇到的问题,后来我发现是因为我没有搞清楚“走索引”的意思。大家都知道索引能加快查询,但是索引能加快查询的原因你知道么?答案是减少了查询的次数。

现在我们回到上面的 SQL,可以看到虽然key 值为`c2__idx`,但是 rows 值为 1000。也就是扫描了扫描全表,即 `c2__idx`的所有记录。但是由于`c2__idx`已经包含了所有需要查询的列,优化器才选择了走这个索引。

最后再来思考一个问题,使用了索引是否一定快?这个问题我们通过一个具体例子看一下:

select * from simple_table;
select * from simple_table where id > 0;

不需要 explain 分析直接肉眼观察就能看到第一条 SQL 没有走索引,第二条 SQL 使用了主键索引。可以看到没有使用索引的速度快一些,这是因为虽然使用了索引,但是还是从主键索引的最左边的叶节点开始向右扫描整个索引树,进行了全表扫描,这让索引失去了意义。

总结一下:查询是否使用索引,只是表示一个 SQL 语句的执行过程;而是否为慢查询,是由它执行的时间决定的,也就是说是否使用了索引和是否是慢查询两者之间没有必然的联系。我们在使用索引时,不应只关注是否起作用,而应该关心索引是否减少了查询扫描的数据行数,扫描行数减少效率才会得到提升。对于一个大表,不止要创建索引,还要考虑索引过滤性,过滤性好,执行速度才会快。


阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-数据库
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯