Почему count (*) медленный, когда объяснение знает ответ? - PullRequest
0 голосов
/ 14 февраля 2020

Я использую MySQL InnoDB. Таблица содержит 10 миллионов записей . Я пытаюсь выполнить приведенный ниже запрос, и он занимает слишком много времени.

SELECT COUNT(*) FROM abc_test WHERE id = ? AND parent_id IS NULL AND user_status IN (?,?,?,?);

Может кто-нибудь помочь, пожалуйста? Ниже приведены подробности того же самого.

  1. Облако: AWS
  2. База данных: MySQL RDS (r3.2xlarge)
  3. Версия: 5.6. 34

Структура таблицы (всего 50 столбцов)

  • id int (11)
  • parent_id int (11)
  • user_status tinyint (4)
  • дата-время создания
  • дата-время изменения

1 Ответ

1 голос
/ 14 февраля 2020

Это частично объясняется в документации по объяснению :

  • строк (JSON имя: строки)

Столбец строк указывает число строк, MySQL считает, что его необходимо проверить для выполнения запроса.

Для таблиц InnoDB это число является приблизительным и не всегда может быть точным.

Я считаю, что причина в том, что explain берет значение из столбца INFORMATION_SCHEMA.TABLES.TABLE_ROWS. Документация дополнительно подчеркивает:

TABLE_ROWS

Количество строк. Некоторые механизмы хранения, такие как MyISAM, хранят точное количество. Для других механизмов хранения, таких как InnoDB, это значение является приблизительным и может отличаться от фактического значения на целых 40-50%. В таких случаях используйте SELECT COUNT (*) для получения точного подсчета.

Другими словами, когда вы используете SELECT COUNT(*), MySQL генерирует один и тот же план запроса независимо от механизма хранения. Если вы знаете, что использовать INFORMATION_SCHEMA.TABLES безопасно, то вы можете использовать это значение - либо потому, что вы не используете InnoDB, либо потому, что приблизительное значение достаточно хорошее.

...