mariadb数据库索引失效情况

最近看了一篇博客,研究索引失效情况,但是实际测试有一些不太一样的地方

数据库版本

我使用的是mariadb,mysql的一个分支版本,具体版本为mysql Ver 15.1 Distrib 10.5.10-MariaDB, for debian-linux-gnu (x86_64) using readline 5.2

建库脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14

CREATE TABLE `f` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(120) DEFAULT NULL,
`c_id` int(11) DEFAULT NULL,
`phone` char(11) DEFAULT NULL,
`qq` varchar(20) DEFAULT NULL,
`gender` varchar(12) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `name_c_id_phone` (`name`,`c_id`,`phone`),
KEY `c_id` (`c_id`),
KEY `gender` (`gender`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8

!= 操作符

博客 第6点 写到 != 操作符永远不会使用到索引

然而实际测试之后并非如此

C9FA60E8-21F7-460C-B63C-28B77CAB199C.png

mysql

再使用mysql做测试,版本mysql Ver 14.14 Distrib 5.7.34, for Linux (x86_64) using EditLine wrapper

7ED4BF54-89D6-42C6-86A9-8DB8052D0DD4.png

这次就和文章说法一致了

组合索引,不使用第一列,索引失效

文章中使用了以下sql

1
2
select * from f where c_id=1

explain 之后的结果确实和文章中所说相同,但是如果对查询列表做下修改

可以看出,尽管违背了最左匹配原则,但是还是使用了索引。

原因就在于查询列表的列都在这个索引里存着,没有相应的回表操作,相比起数据量大的全表扫描,还是索引代价更低。所以还是会使用索引


mariadb数据库索引失效情况
http://blog.inkroom.cn/2021/05/27/2Z9HJBH.html
作者
inkbox
发布于
2021年5月27日
许可协议