数据库索引怎么用,MySQL数据库索引用法详细介绍
关于 MySQL 索引,对于研发同学,尤其是后端研发同学,一定不会陌生。我们工作中经常会用到 MySQL 数据库,就肯定会经常用到性能优化方面的设计和考量,常常用涉及到 MySQL 索引。但是关于 MySQL 索引,你真的用对了么?
接下来,我会通过一个自己工作中真实遇到一个 MySQL 查询应用问题为背景,来逐步剖析分析,见招拆招,以科学理论为依据,分析探究,希望能带大家一起明确索引应用原则,最终将问题探究清楚。
主要原则:问题驱动;
主要流程:应用现象-问题分析-疑点跟进-层层探究-结论明晰。
那接下来,让我们利用约 15min 的时间,让自由的思路飞一会儿吧!
问题介绍
我们存在这样一张数据表(cities),记录了城市 code 和名称一些基本数据。
有一天,我在执行如下 SQL 的时候(一个是指定了字段 id,另一个未指定查询字段,而是利用了 *),发现两种情况下查询执行结果竟然不一样!
Case1:select id from cities limit 1;
查询结果:
id:2
Case2:select * from cities limit 1;
查询结果:
这个问题成功的引起了我的注意,那就继续搞起吧!
问题分析
按照之前的工作经验告诉我,遇事不要慌,先 explain 解释执行看看吧。
Case1:explain select id from cities limit 1;
执行结果:
Case2:explain select * from cities limit 1;
执行结果:
经过上面的执行计划查看,发现 Case1 中的 SQL 应用到了一个名为'uniq_city_code'的索引,而第二个走了全表扫描查询。
问题初步结论:也就是说两个 SQL 由于查询字段的不同,导致 MySQL 在具体执行时候选取了不同的索引策略,从而导致了查询结果的不同。
疑点跟进
其实经过上面的分析,其实还存在几个疑问点:
为什么 Case1 查询中并没有出现 city_code 字段,却会使用其索引?
为什么 Case2 查询就不会使用 uniq_city_code 的索引?
可能细心的同学也发现了,还有就是 Case2 查询计划中 Extra 字段为 Using index,说明满足了索引覆盖(索引中包含了所有满足查询条件的数据,无需从表中查询),可是 uniq_city_code 这个索引中并没有 id 这个字段,为何能以覆盖索引的方式执行?
带着上面的一脸疑问,我们先来一起回顾下 MySQL 引擎索引的实现方式吧。
如图所示,为 Innodb、以及参考对比的 MyISAM 引擎的索引实现图例。
1、InnoDB 聚簇索引和辅助索引(非聚簇索引)的对比图示
同时便于大家理解,我标记黄线、红线分别代表两种引擎方式的数据查询路径,大家可以参照图例,体会对比一下。
InnoDB 按聚簇索引的形式存储数据,所以它的数据布局有着很大的不同。
本文地址:百科问答频道 https://www.neebe.cn/wenda/936639.html,易企推百科一个免费的知识分享平台,本站部分文章来网络分享,本着互联网分享的精神,如有涉及到您的权益,请联系我们删除,谢谢!