每天資訊mysql 中!=(不等於) 到底走不走索引?實測記錄

菜單

mysql 中!=(不等於) 到底走不走索引?實測記錄

mysql 中!=(不等於) 到底走不走索引?實測記錄

很多人疑惑!= 到底走不走索引, 這裡可以肯定的說該操作是可以走索引的,但實際情況中都為啥都不走索引呢? 首先我們要知道走索引與資料量和資料趨勢(cardinality)有很大的關係,如果表本身就上百條記錄,那走索引和表掃描區別不大,甚至在存在書籤跳轉情況下還不如表掃描更有效率,這個時候可能是不走索引的,另外 !=操作後獲取的結果集在總結果集中佔據的比例也是關鍵因素,如果返回的結果集過大(大於20%),那麼可能也不會走索引,而是選擇更有效率的表掃描了

我們來看看個例子:

CREATE TABLE `b` (

`id` int(11) NOT NULL AUTO_INCREMENT,

`age` bigint(20) DEFAULT 50,

`name` varchar(50) DEFAULT NULL,

PRIMARY KEY (`id`),

KEY `name` (`name`)

) ENGINE=InnoDB

insert into b (name) values(‘a’),(‘b’),(‘c’),(‘d’),(‘e’),(‘f’),(‘g’),(‘h’),(‘i’);

——多次執行

insert into b (name)

select ‘k’ from b ;

select name, count(*)

from b

group by name

mysql 中!=(不等於) 到底走不走索引?實測記錄

explain

select * From b where name !=‘k’;

mysql 中!=(不等於) 到底走不走索引?實測記錄

explain

select * From b where name !=‘a’;

mysql 中!=(不等於) 到底走不走索引?實測記錄

很明顯 我們從統計中看到 K的數值很大,所以我們!='k'的資料集才8條,在總資料中佔比很小,可以很好的走索引,而如果將k替換成 a,則不會走索引,變成了全表掃描。