什么是走索引?
索引是一种利用某种规则的数据结构与实际数据的关系加快数据查找的功能。我们的数据库中存储有大量的内容,而索引能够通过数据节点,根据特定的规则和算法快速查找到节点对应的实际文件的位置。简单来说索引就像书的目录,能够帮助我们准确定位到书籍具体的内容。
最近在学习索引的时候遇到了一个问题,下面我们通过重现的方式来看一下。
首先建立一个如下测试表:
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 语句的执行过程;而是否为慢查询,是由它执行的时间决定的,也就是说是否使用了索引和是否是慢查询两者之间没有必然的联系。我们在使用索引时,不应只关注是否起作用,而应该关心索引是否减少了查询扫描的数据行数,扫描行数减少效率才会得到提升。对于一个大表,不止要创建索引,还要考虑索引过滤性,过滤性好,执行速度才会快。
推荐阅读

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
传统企业数字化转型,到底难在哪里?
数字化浪潮轰轰烈烈,被卷入其中的不只是 IT 技术行业,各行各业都裹挟其中。 2022年的政府工作报告提出,要促进数字经济发展,加强数字中国建设整体布局,建设数字信息基础设施,推进5G规模化应用,促进产业数字化转型,发展智慧城市、数字乡村。 然而,这并不是政策第一次强调“数字经济”。事实上,从2017年的“促进数字经济加快成长”开始,这已经是“数字经济”第五次被写入政府工作报告了。 相应地,数字化转型浪潮也在各行各业中兴起,热度一时无两。近年来,O2O、大数据等概念先后涌现,也出现了一批新型的数字化科技企业,这给传统企业带来了无形的压力。固守一隅,很难不被时代淘汰;而激进闯入,又难以保证不落入“起了个大早,赶了个晚集”的尴尬境地。 传统企业不像互联网企业,不仅无法在开发技术团队上投入很大比例的资源,而且还要求强业务导向、为业务赋能。与此同时,传统企业在数字化转型中,又总会遇见这样那样的问题,这就呼吁更新的解决办法和更好用的工具出现。 01 “数字化”实现不易,传统企业面临“内外部困境” 什么是“数字化”?有了解过的人都知道,“数字化”绝不是将流程、表单、数据等搬到电脑上这么简单。 目前...
- 下一篇
实时开发平台建设实践,深入释放实时数据价值丨04期直播回顾
原文链接:实时开发平台建设实践,深入释放实时数据价值 视频回顾:点击这里 课件获取:点击这里 一、实时数仓建设背景 随着整体行业的数字化转型不断深入以及技术能力的不断提高,传统的 T+1 式(隔日)的离线大数据模式越来越无法满足新兴业务的发展需求,开展实时化的大数据业务,是企业深入挖掘数据价值的一条必经之路。 面对数字化转型下的数据快速产生、“小步快跑”的精细化运营及实时化和自动化的决策需求,如何提高实时数据处理能力将成为企业提升竞争力的一大因素。 而企业在建设实时数据应用时,又往往面临诸多困难: 实时开发技术门槛高,学习难度大,开发过程依赖各种引擎,链路复杂 开发数据效率低,代码调试复杂 建设成本、使用成本高 数据建模及开发规范不统一,问题难监控,管理困难 为了解决这些问题,我们在实时建设过程中需要确定建设方式和建设目标,帮助企业更好的实现实时数仓建设。 二、实时数仓建设方法论 如何帮助企业建设实时数仓,我们主要从以下四个步骤入手: 1、明确需求 企业进行实时数仓建设的第一步是明确需求,需求需要业务需求和技术需求想结合。 1)业务需求方面: 详细梳理各类实时计算应用场景 详细梳理每个...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- SpringBoot2整合Redis,开启缓存,提高访问速度
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS7设置SWAP分区,小内存服务器的救世主
- 设置Eclipse缩进为4个空格,增强代码规范
- CentOS7安装Docker,走上虚拟化容器引擎之路
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- Hadoop3单机部署,实现最简伪集群