Меня спросили, работает индекс или нет, когда мы используем ключевое слово IN
в MySQL
, как показано ниже:
//suppose col has index and the value is almost unique
SELECT * FROM yourtable WHERE col IN('xxx','yyy','zzz');
Чтобы получить точный результат, я делаю тест самостоятельно, я создал две таблицы, и индекс работает для одной таблицы, но не работает для другой таблицы, я не знаю почему. Надеюсь, кто-то поможет мне понять это. Спасибо вперед.
Первая таблица называется system_users
:
CREATE TABLE system_users(
id INT(8) NOT NULL AUTO_INCREMENT,
NAME CHAR(15),
gender CHAR(1),
age INT(2),
department CHAR(1),
email VARCHAR(20),
PRIMARY KEY (id)
) ENGINE=INNODB DEFAULT CHARSET=utf8;
CREATE INDEX name_index ON system_users(NAME);
INSERT INTO system_users(id,NAME,gender,age,department,email)
VALUES
(1,'euser_izpwhzzcz','1',37,'1','yvmk0oqm0lf@mail.com'),
(2,'muser_czepyfklv','1',20,'1','a9wq08gcllk@mail.com'),
(3,'tuser_mwrluajek','0',20,'1','o8jqqebi0bt@mail.com'),
(4,'duser_jzgpheafx','0',22,'2','hegehgsbfmg@mail.com'),
(5,'auser_iacjkekhg','0',36,'2','46drnrja29i@mail.com'),
(6,'euser_eikhwvwsi','1',31,'2','56amq6nayde@mail.com'),
(7,'muser_lblozikah','1',29,'3','qlbtvpzgrej@mail.com'),
(8,'cuser_xhsuuzzur','0',35,'3','klrr6kurylg@mail.com'),
(9,'vuser_iwmklbyzp','0',22,'3','ngdrlguhzrp@mail.com'),
(10,'buser_yfnffsfoc','0',37,'4','o1jvffj4ahu@mail.com');
Теперь, когда я использую EXPLAIN
для анализа ниже запроса sql, я обнаружил, что индекс работает
EXPLAIN SELECT * FROM system_users WHERE NAME IN('euser_eikhwvwsi','buser_yfnffsfoc');
Как мы видим, значение type
равно range
, в этом сценарии индекс работает, когда используется IN
![Index work when use IN](https://i.stack.imgur.com/a3sij.png)
Вторая таблица называется test
:
CREATE TABLE test(
id INT PRIMARY KEY AUTO_INCREMENT,
c1 VARCHAR(10),
c2 VARCHAR(10),
c3 VARCHAR(10),
c4 VARCHAR(10),
c5 VARCHAR(10)
) ENGINE=INNODB DEFAULT CHARSET=utf8;
CREATE INDEX c_index ON test(c1);
INSERT INTO test(c1,c2,c3,c4,c5) VALUES('a1','a2','a3','a4','a5');
INSERT INTO test(c1,c2,c3,c4,c5) VALUES('b1','b2','b3','b4','b5');
INSERT INTO test(c1,c2,c3,c4,c5) VALUES('c1','c2','c3','c4','c5');
INSERT INTO test(c1,c2,c3,c4,c5) VALUES('d1','d2','d3','d4','d5');
INSERT INTO test(c1,c2,c3,c4,c5) VALUES('e1','e2','e3','e4','e5');
INSERT INTO test(c1,c2,c3,c4,c5) VALUES('a1','b1','c1','d1','e1');
INSERT INTO test(c1,c2,c3,c4,c5) VALUES('b1','a2','b2','b4','b5');
INSERT INTO test(c1,c2,c3,c4,c5) VALUES('c1','a3','c3','d4','c5');
INSERT INTO test(c1,c2,c3,c4,c5) VALUES('d1','a4','d3','d4','d5');
INSERT INTO test(c1,c2,c3,c4,c5) VALUES('e1','a5','b5','e4','e5');
Теперь, когда я использую EXPLAIN
для анализа ниже sql, индекс, похоже, не работает, поскольку value
типа all
EXPLAIN SELECT * FROM test WHERE c1 IN('a1','b1');
![Index not work when use IN](https://i.stack.imgur.com/9sQs7.png)
Обе эти таблицы имеют обычные столбцы и данные, но при использовании IN
, почему type
одного - range
, а другого - all
?
PS: версия MySQL
на моей стороне - 5.0.67
, я запустил OPTIMIZE TABLE
для обеих таблиц и все еще получаю одинаковый результат.
Ниже приведены результаты при выполнении ANALYZE TABLE
![enter image description here](https://i.stack.imgur.com/k9aus.png)