Параллельные запросы к составному индексу с упорядочением по идентификатору резко замедляются
У меня есть таблица, определенная следующим образом:
| book | CREATE TABLE `book` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`provider_id` int(10) unsigned DEFAULT '0',
`source_id` varchar(64) COLLATE utf8_unicode_ci DEFAULT NULL,
`title` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
`description` longtext COLLATE utf8_unicode_ci,
PRIMARY KEY (`id`),
UNIQUE KEY `provider` (`provider_id`,`source_id`),
KEY `idx_source_id` (`source_id`),
) ENGINE=InnoDB AUTO_INCREMENT=1605425 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci |
когда есть приблизительно 10 одновременных чтений со следующим sql:
SELECT * FROM `book` WHERE (provider_id = '1' AND source_id = '1037122800') ORDER BY `book`.`id` ASC LIMIT 1
это становится медленным, это занимает около 100 мс.
Однако, если я изменил его на
SELECT * FROM `book` WHERE (provider_id = '1' AND source_id = '221630001') LIMIT 1
тогда это нормально, это занимает несколько мс.
Я не понимаю, почему добавление порядка по идентификатору делает запрос намного медленнее? может ли кто-нибудь изгнать?
2 ответа
Попробуйте добавить нужные столбцы (Выберите имя столбца,..) вместо * или См. Это.
Почему мой SQL Server ORDER BY работает медленно, несмотря на индексацию упорядоченного столбца?
Я не эксперт по MySQL и не могу провести подробный анализ, но я думаю, что вы предоставляете значения для UNIQUE KEY
в WHERE
предложение, движок может пойти и получить эту строку напрямую, используя индекс.
Однако, когда вы просите это ORDER BY
id
столбец, который является PRIMARY KEY
, который меняет путь доступа. Двигатель теперь догадывается, что, так как он имеет индекс на id
и вы хотите заказать по id
лучше получить эти данные в порядке PK, что позволит избежать сортировки. В этом случае, однако, это приводит к более медленному результату, так как он должен сравнивать каждую строку с критериями (сканирование таблицы).
Обратите внимание, что это всего лишь предположение. Вам нужно будет EXPLAIN
оба заявления, чтобы увидеть, что происходит.