Почему при большом количестве строк поиск по условию LIKE быстрее, чем поиск по INT?
Есть следующая таблица:
CREATE TABLE `names` (
`name` VARCHAR(200) NOT NULL,
`nameHash` INT(10) UNSIGNED NOT NULL,
`code` INT(10) UNSIGNED NOT NULL,
UNIQUE INDEX `name` (`name`) USING BTREE,
INDEX `nameHash` (`nameHash`) USING BTREE
)
В таблице есть ~ 700 000 записей, из которых ~600 000 - подходящих для одного имени, и остальные для прочих. Когда я запустил следующие запросы, то я не совсем понял почему произошло увеличение времени выполнения для сравнения по хэшу при большом количестве совпадений и наличии сортировки. Хотелось бы узнать причину и объяснения процесса потому, что так глубоко MySql ещё не освоил и не до конца понимаю из-за чего такое время выполнения при наличии ключей.
Запросы и их скорости с количеством найденных строк:
#Найденные строки: 816
SELECT count(*) FROM names WHERE name LIKE '%somename123%' ORDER BY code ASC;
#1 row in set (0.83 sec), 0.83, 0.82, 0.83
SELECT count(*) FROM names WHERE nameHash = 469694341 ORDER BY code ASC;
#1 row in set (0.00 sec), 0.00, 0.00, 0.00 sec
#Найденные строки: 7 133
SELECT count(*) FROM names WHERE name LIKE '%somename%' ORDER BY code ASC;
#1 row in set (0.98 sec), 0.89, 0.82, 0.82 sec
SELECT count(*) FROM names WHERE nameHash = 2698784949 ORDER BY code ASC;
#1 row in set (0.04 sec), 0.02, 0.01, 0.02 sec
#Найденные строки: 669 764
SELECT count(*) FROM names WHERE name LIKE '%so.na%' ORDER BY code ASC;
#1 row in set (0.44 sec), 0.55, 0.43, 0.43 sec
SELECT count(*) FROM names WHERE nameHash = 3893229146 ORDER BY code ASC;
#1 row in set (4.98 sec), 4.92, 5.10, 5.12 sec
Скорости без сортировки:
#Найденные строки: 816
SELECT count(*) FROM names WHERE name LIKE '%somename123%';
#1 row in set (0.65 sec), 0.64, 0.64, 0.64
SELECT count(*) FROM names WHERE nameHash = 469694341;
#1 row in set (0.00 sec), 0.00, 0.00, 0.00 sec
#Найденные строки: 7 133
SELECT count(*) FROM names WHERE name LIKE '%somename%';
#1 row in set (0.65 sec), 0.64, 0.64, 0.63
SELECT count(*) FROM names WHERE nameHash = 2698784949;
#1 row in set (0.01 sec), 0.00, 0.00, 0.01 sec
#Найденные строки: 669 764
SELECT count(*) FROM names WHERE name LIKE '%so.na%';
#1 row in set (0.26 sec), 0.25, 0.25, 0.25 sec
SELECT count(*) FROM names WHERE nameHash = 3893229146;
#1 row in set (0.28 sec), 0.15, 0.15, 0.14 sec
Запросы с explain:
EXPLAIN SELECT count(*) FROM names WHERE nameHash = 3893229146 ORDER BY code ASC;
+----+-------------+-------+------------+------+---------------+------------+---------+-------+--------+----------+-------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+------------+------+---------------+------------+---------+-------+--------+----------+-------+
| 1 | SIMPLE | names | NULL | ref | nameHash | nameHash | 4 | const | 246635 | 100.00 | NULL |
+----+-------------+-------+------------+------+---------------+------------+---------+-------+--------+----------+-------+
1 row in set, 1 warning (0.01 sec)
EXPLAIN SELECT count(*) FROM names WHERE name LIKE '%so.na%' ORDER BY code ASC;
+----+-------------+-------+------------+------+---------------+------+---------+------+--------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+------------+------+---------------+------+---------+------+--------+----------+-------------+
| 1 | SIMPLE | names | NULL | ALL | NULL | NULL | NULL | NULL | 493271 | 11.11 | Using where |
+----+-------------+-------+------------+------+---------------+------+---------+------+--------+----------+-------------+
1 row in set, 1 warning (0.00 sec)