mysql数据库索引面试题 mysql组合索引底层原理( 三 )
面试官:嗯 。那你简单说一下聚集索引和非聚集索引是什么意思
我:那我就由浅入深的简单说一下吧 。
聚集索引:首先所谓聚集的含义是索引与data数据是否相邻,就是我找到索引以后在它附近就可以找到想要的data数据这就是聚集索引 。
非聚集索引:非聚集索引就是我找到索引后,在它的附近找不到data数据 。
这里我们根据之前的图想一下,之前的图叶子节点下面紧挨着就是data数据,这里肯定是聚集索引啊,那么什么情况下是非聚集索引呢 。
在索引的字段是非主键的时候就是非聚集索引 。
这里我来举个例子,如果一个student表中有主键id,姓名name,年龄age,住址add 。这个时候我们给name字段建立一个索引,给add字段建立了一个索引,那么这个时候是不是有两个B+树的索引结构,那么意味着这两个索引结构的叶子节点都需要有data数据,那岂不是需要将name索引中的data数据复制一份出来给add索引 。
那假如有100个字段都建立了索引,岂不是data要复制100遍 。这个时候我就想了一个办法(这个办法不是我想的 。。。我快要想出来了,被别人提前答出来了)能不能只让一个索引的子节点有data数据,其他索引的子节点没有data数据而是放有data数据的索引的地址呢 。
这个时候就让哪个索引作为唯一拥有data数据的索引呢,这里很明显可以用主键嘛,因为主键正好是唯一的,其他字段都可以为多个,所以主键所建立的索引就是拥有data数据的聚集索引,而其他非主键字段建立的索引就是非聚集索引 。
MySQL索引优化
面试官:非常棒,看来小奇的文章真不错呀,接下来讲一讲MySQL语句怎么写可以提高性能呢
我:当然是建立索引啦,建立了索引犹如给书加上了目录,如鱼得水、如虎添翼、如 。。。
面试官:那索引是不是建立的越多越好呢
我:当然不是 。。。
面试官:为什么?
我:(因为一般面试官用这种口气问问题就是给你下套呢,答肯定不是就对了 。。。机智如我)
因为每一个索引就是给索引字段建立一个索引结构,假如现在插入一条数据,那么这条数据也需要将字段建立到索引结构当中,就需要调整索引结构了,如果建立了100个索引,那么插入1条数据需要调整100个索引结构(数据库:我去你 。的,瞎鸡 。搞),那么性能就可想而知了 。
但是不建立索引又不行,必须还得建立,那么应该怎么建立呢,就是把经常要用到的查询条件的字段建立一个联合索引,这样用一个索引树可以将多个字段建立了索引 。
面试官:嗯 。说到了联合索引,如果我建立的联合索引是A、B、C这三个字段,那么我查询的时候条件是A、B那么这个索引还有效果吗?
我:有效果 。
面试官:为什么呢?

文章插图
我:因为最左前缀原则,假如当我们给姓名、年龄、性别三个字段建立了索引,那么从左边先开始的字段才可以索引有效果 。

文章插图
面试官:那如果我查A和C呢?
我:那么只有A有索引效果,查询的字段从索引的最左边开始向右查找,如果中间断了,那么后面的索引字段就失去效果了 。
MySQL索引覆盖
面试官:嗯 。讲一下MySQL的索引覆盖是怎么回事吧
我:所谓索引覆盖就是用索引字段来覆盖要查询的字段 。
假如我们要查询两个字段,name和age,我们的sql语句为
select name,age from student where name=‘张三’ and age=20
假如我们这个时候只有name建立了索引,这个时候我们需要在索引中找到name等于张三的这些数据,并回表(就是从普通索引中找不全所要查询的所有字段,那么需要回表再去主键聚簇索引中寻找,因为聚簇索引中有全量的data数据) 。
这个时候我们可以看到我们需要查询的字段只有name,age两个字段,这个时候我们可以将name,age这两个字段做一个联合索引,这个时候我们直接通过联合索引就可以找到所要查询出的字段了 。
请注意如果是 select name,age,add from student where name=‘张三’ and age=20;这个时候由于刚刚的联合索引只有name,age两个字段,没有add字段,所以这种情况又要回表查询,这种情况就没有索引覆盖了 。
所以我们sql语句要尽可能的查询出少量的字段,就是用哪个字段就查询哪个字段,更要避免select * 的这种情况 。
推荐阅读
- 汉王考勤软件登录不上,提示“索引超出范围...” 汉王考勤机软件下载
- 关于使用pt-heartbeat监测MySQL主从复制延迟的方法
- 彻底搞懂时序数据库InfluxDB,在SpringBoot整合InfluxDB
- 听说你们的数据库并发 2 万就跪了?
- MySQL读写分离,写完读不到问题如何解决
- 要不要走索引?MySQL 的成本分析
- win10中mysql下载安装 mysql怎么下载
- C#如何连接SQL SERVER数据库
- 轻量美丽的搜索引擎——MeiliSearch
- Python 如何将数据存入数据库
