mysql not in和索引_MySQL Index--NOT IN和不等于两类操作无法走索引?

文章通过实例分析了MySQL中NOT IN和<>操作在特定情况下是否可以利用索引。通过创建带有索引的测试表并插入数据,展示了在不同查询条件下,NOT IN和<>都能够使用索引并实现高效执行。结论指出,虽然在某些场景下,这两类操作可能不选择使用索引,但并不意味着它们完全不能利用索引。
摘要由CSDN通过智能技术生成

经常被问,NOT IN和<>操作就无法走索引?

真想只有一个:具体问题具体分析,没有前提的问题都是耍流氓。

准备测试数据:## 删除测试表

DROP TABLE IF EXISTS tb2001;

## 创建测试表

CREATE TABLE `tb2001` (

`id` int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,

`c1` int(11) DEFAULT NULL,

`c2` int(11) DEFAULT NULL,

INDEX idx_c1(c1)

) ENGINE = InnoDB CHARSET = utf8;

## 插入测试数据(10万左右)

## 如果information_schema.columns数据较少,可以重复多次

INSERT INTO tb2001 (c1,c2)

SELECT 1,1 from information_schema.columns;

INSERT INTO tb2001 (c1,c2)

SELECT 2,2 from information_schema.columns

limit 10;

INSERT INTO tb2001 (c1,c2)

SELECT 3,3 from information_schema.columns

limit 10;

表中tb2001上C1列上有索引,全表数据10万条,但c1<>1的数据仅为20条。

查询c1不为1的10条数据,NOT IN 方式执行计划为:desc select * from tb2001 where c1 not in(1) limit 10 \G

*************************** 1. row ***************************

id: 1

select_type: SIMPLE

table: tb2001

partitions: NULL

type: rangepossible_keys: idx_c1

key: idx_c1

key_len: 5

ref: NULL

rows: 11

filtered: 100.00

Extra: Using index condition

查询c1不为1的10条数据,<>方式执行计划为:desc select * from tb2001 where c1 <> 1 limit 10 \G

*************************** 1. row ***************************

id: 1

select_type: SIMPLE

table: tb2001

partitions: NULL

type: rangepossible_keys: idx_c1

key: idx_c1

key_len: 5

ref: NULL

rows: 11

filtered: 100.00

Extra: Using index condition

从上面两个例子可以看出,NOT INT和<>操作都可以走索引,且执行性能极佳。

俗话说苍蝇不叮无缝的丹,因为在很多场景下,NOT IN或<>两类操作使用二级索引的成本远超于全表扫描的成本,查询优化器按照成本选择"最优执行计划",导致查询不走二级索引。但不能因此就彻底判断NOT IN或<>两类操作不能走索引。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值