Параллельные запросы к составному индексу с упорядочением по идентификатору резко замедляются

У меня есть таблица, определенная следующим образом:

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

Другие вопросы по тегам