Параллельные запросы к составному индексу с упорядочением по идентификатору резко замедляются - PullRequest
0 голосов
/ 07 мая 2018

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

| 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 ]

0 голосов
/ 07 мая 2018

Я не эксперт по MySQL и не могу выполнить подробный анализ, но я думаю, что, поскольку вы предоставляете значения для UNIQUE KEY в предложении WHERE, механизм может пойти и получить строка непосредственно с помощью индекса.

Однако, когда вы запрашиваете у него ORDER BY столбец id, который является PRIMARY KEY, который изменяет путь доступа. Движок теперь догадывается, что, поскольку он имеет индекс на id, а вы хотите упорядочить по id, лучше выбрать эти данные в порядке PK, что позволит избежать сортировки. В этом случае, однако, это приводит к более медленному результату, так как он должен сравнивать каждую строку с критериями (сканирование таблицы).

Обратите внимание, что это всего лишь гипотеза. Вам нужно EXPLAIN оба заявления, чтобы увидеть, что происходит.

0 голосов
/ 07 мая 2018

Попробуйте добавить нужные столбцы (выберите имя столбца, ..) вместо * или обратитесь к нему.

Почему мой SQL Server ORDER BY работает медленно, несмотря на индексированный упорядоченный столбец?

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