Индекс MySQL работает в одной таблице и не работает в другой таблице при использовании IN - PullRequest
0 голосов
/ 24 апреля 2019

Меня спросили, работает индекс или нет, когда мы используем ключевое слово 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


Вторая таблица называется 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

Обе эти таблицы имеют обычные столбцы и данные, но при использовании IN, почему type одного - range, а другого - all?

PS: версия MySQL на моей стороне - 5.0.67, я запустил OPTIMIZE TABLE для обеих таблиц и все еще получаю одинаковый результат.

Ниже приведены результаты при выполнении ANALYZE TABLE

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...