什么是走索引?

3A网络
• 阅读 255

什么是走索引?

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

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

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

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 使用了主键索引。可以看到没有使用索引的速度快一些,这是因为虽然使用了索引,但是还是从主键索引的最左边的叶节点开始向右扫描整个索引树,进行了全表扫描,这让索引失去了意义。

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

点赞
收藏
评论区
推荐文章
Wesley13 Wesley13
2年前
95%的人都不知道 MySQL还有索引管理与执行计划
1.1索引的介绍  索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。如果想按特定职员的姓来查找他或她,则与在表中搜索所有的行相比,索引有助于更快地获取信息。  索引的一个主要目的就是加快检索表中数据的方法,亦即能协助信息搜索者尽快的找到符合限制条件的记录ID的辅助数据结构。!fi
Stella981 Stella981
2年前
Neo4j学习笔记(2)——手动索引和模式索引
和关系数据库一样,Neo4j同样可以创建索引来加快查找速度。在关系数据库中创建索引需要索引字段和指向记录的指针,通过索引可以快速查找到表中的行。在Neo4j中,其索引是通过属性来创建,便于快速查找节点或者关系。手动索引先来说一下怎样创建手动索引。创建索引采用显示创建,就像添加节点一样添加索引项,一个索引项标识的是一个节点或
Wesley13 Wesley13
2年前
mysql面试题
MySQL面试索引相关1.什么是索引?索引是一种数据结构,可以帮助我们快速的进行数据的查找.1.索引是个什么样的数据结构呢?索引的数据结构和具体存储引擎的实现有关,在MySQL中使用较多的索引有Hash索引,B树索引等,而我们经常使用的InnoDB存储引擎的默认索引实现为:B树索引.
Wesley13 Wesley13
2年前
mysql之索引
一.索引:索引是表的目录,在查找内容之前可以先在目录中查找索引位置,以此快速定位查询数据。对于索引,会保存在额外的文件中1.1.创建一个索引:mysqlcreateindexix_classontb3(class_id);QueryOK,0rowsaffected(0.02sec)
Wesley13 Wesley13
2年前
MySQL 索引(3)
什么是索引?索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。比如想从字典中查询某一个字,我们可以通过偏旁、或者拼音来快速定位到要找的页码,这种方式也可以被理解为一种索引。Mysql常用的索引类型类型说明Normal(普通)普通索引,没任何限制。Unique(唯
Stella981 Stella981
2年前
SQL Server 查询优化器运行方式
一、结合实际,谈索引使用的误区理论的目的是应用。虽然我们刚才列出了何时应使用聚集索引或非聚集索引,但在实践中以上规则却很容易被忽视或不能根据实际情况进行综合分析。下面我们将根据在实践中遇到的实际问题来谈一下索引使用的误区,以便于大家掌握索引建立的方法。1、主键就是聚集索引这种想法笔者认为是极端错误的,是对聚集索引的一种浪费。虽然SQLS
Wesley13 Wesley13
2年前
MySQL的存储引擎InnoDB选择了B+ 树
     我们知道数据的存储和检索是两个很重要的功能,当我们的数据量大了,怎么能快速的检索数据呢,答案是使用索引,可索引具体的技术实现有很多,选择哪一种呢,我就以mysql为例记录下它为什么选择了B树作为索引的实现方式。1. 索引简介  索引是一种用于快速查询行的数据结构,就像一本书的目录就是一个索引,如果想在一本书中找
Easter79 Easter79
2年前
SQL Server 查询优化器运行方式
一、结合实际,谈索引使用的误区理论的目的是应用。虽然我们刚才列出了何时应使用聚集索引或非聚集索引,但在实践中以上规则却很容易被忽视或不能根据实际情况进行综合分析。下面我们将根据在实践中遇到的实际问题来谈一下索引使用的误区,以便于大家掌握索引建立的方法。1、主键就是聚集索引这种想法笔者认为是极端错误的,是对聚集索引的一种浪费。虽然SQLS
Wesley13 Wesley13
2年前
MySQL索引初探
一、什么是索引?帮助数据库系统实现高效获取数据的数据结构索引可以帮助我们快速地定位到数据而不需要每次搜索的时候都遍历数据库中的每一行。二、常见实现方式有哪些?常见索引模型有三种:哈希表、有序数组、搜索树1.哈希表(1)使用哈希表实现的索引称为哈希索引。!(https://os
京东云开发者 京东云开发者
4个月前
浅析MySQL代价模型:告别盲目使用EXPLAIN,提前预知索引优化策略 | 京东云技术团队
背景在MySQL中,当我们为表创建了一个或多个索引后,通常需要在索引定义完成后,根据具体的数据情况执行EXPLAIN命令,才能观察到数据库实际使用哪个索引、是否使用索引。这使得我们在添加新索引之前,无法提前预知数据库是否能使用期望的索引。更为糟糕的是,有时