索引是目录的意思吗,索引是什么概念有什么作用

首页 > 教育 > 作者:YD1662024-05-12 00:36:05

原因很简单,索引B 树中行数据按照索引值排序,只能根据前缀进行比较。如果要按照后缀搜索也希望走索引的话,并且永远只是按照后缀搜索的话,可以把数据反过来存,用的时候再倒过来。

第二,条件涉及函数操作无法走索引。比如搜索条件用到了LENGTH函数,肯定无法走索引:

EXPLAIN SELECT * FROM person WHERE LENGTH(NAME)=7

索引是目录的意思吗,索引是什么概念有什么作用(9)

同样的原因,索引保存的是索引列的原始值,而不是经过函数计算后的值。如果需要针对函数调用走数据库索引的话,只能保存一份函数变换后的值,然后重新针对这个计算列做索引。

第三,联合索引只能匹配左边的列。也就是说,虽然对name和score建了联合索引,但是仅按照score列搜索无法走索引:

EXPLAIN SELECT * FROM person WHERE SCORE>45678

索引是目录的意思吗,索引是什么概念有什么作用(10)

原因也很简单,在联合索引的情况下,数据是按照索引第一列排序,第一列数据相同时才会按照第二列排序。也就是说,如果我们想使用联合索引中尽可能多的列,查询条件中的各个列必须是联合索引中从最左边开始连续的列。如果我们仅仅按照第二列搜索,肯定无法走索引。尝试把搜索条件加入name列,可以看到走了name_score索引:

EXPLAIN SELECT * FROM person WHERE SCORE>45678 AND NAME LIKE 'NAME45%'

索引是目录的意思吗,索引是什么概念有什么作用(11)

需要注意的是,因为有查询优化器,所以name作为WHERE子句的第几个条件并不是很重要。

现在回到最开始的两个问题。

数据库基于成本决定是否走索引

通过前面的案例,我们可以看到,查询数据可以直接在聚簇索引上进行全表扫描,也可以走二级索引扫描后到聚簇索引回表。看到这里,你不禁要问了,MySQL到底是怎么确定走哪种方案的呢。

其实,MySQL在查询数据之前,会先对可能的方案做执行计划,然后依据成本决定走哪个执行计划。

这里的成本,包括IO成本和CPU成本:

基于此,我们分析下全表扫描的成本。

全表扫描,就是把聚簇索引中的记录依次和给定的搜索条件做比较,把符合搜索条件的记录加入结果集的过程。那么,要计算全表扫描的代价需要两个信息:

那么,MySQL是实时统计这些信息的吗?其实并不是,MySQL维护了表的统计信息,可以使用下面的命令查看:

SHOW TABLE STATUS LIKE 'person'

输出如下:

索引是目录的意思吗,索引是什么概念有什么作用(12)

上一页1234下一页

栏目热文

文档排行

本站推荐

Copyright © 2018 - 2021 www.yd166.com., All Rights Reserved.