mysql数据库面试相关问题

本文探讨了数据库索引的优化与失效情况,包括最左匹配原则、覆盖索引、排序查询和字段操作对索引的影响。通过案例分析,解释了为何在某些条件下全表扫描可能优于使用索引,并强调了正确使用索引以提高查询效率的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
索引失效一般是不满足最左匹配原则
联合索引中c有序仅在b确定的情况下,d有序仅在c确定的情况下。

范围查找导致索引失效
select * from t1 where b>1

这里因为查找所有字段(*),且b>1的条件覆盖到表中大部分数据。如果走bcd索引的话,那么需要回表很多次,效率不如全表扫描(mysql底层会做判断),导致索引失效。

覆盖索引
select b from t1 where b>1;
select b,c,d from t1 where b>1;
select b,c,d,a from t1 where b>1;

因为bcd联合索引中存在abcd字段,走索引查询,不会回表。这就叫覆盖索引(不需要取e字段,需要查询的字段在索引中已经存在,不需要回表,就叫覆盖索引)。

select b from t1;

索引查找,因为同样只需要b字段,联合索引bcd一页容纳abcd字段的数量,比一页容纳abcde字段的数量多,效率更高,所以会走索引。

order by为什么导致索引失效

在这里插入图片描述

select * from t1 order by b,c,d;

如果走bcd索引,那么需要的时间是遍历bcd索引叶子节点的时间+所有节点回表的时间。
如果走全表扫描,那么是遍历主键索引全部叶子节点的时间+数据在内存中排序的时间。
而数据在内存中排序的时间远小于所有节点回表的时间,所以会走全表扫描。

对字段进行操作导致索引失效

a是int类型,e是varchar类型

select * from a = 1;//走索引
select * from e = '1';//走索引
select * from a = '1';//走索引
select * from e = 1;//不走索引

因为mysql的字符会自动转换从数字,'11’会转换成11,但是像‘a’,‘Q’,‘11w’等均转换为0,所以select * from a = '1’相当于select * from a = 1,而select * from e = 1,会把所有数据的e字段转换成数字,然后比较是否是1。
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值