Должен ли я избегать COUNT все вместе в InnoDB? - PullRequest
5 голосов
/ 25 июля 2010

Сейчас я спорю, стоит ли использовать COUNT(id) или "считать" столбцы. Я слышал, что InnoDB COUNT работает очень медленно без предложения WHERE, потому что ему нужно заблокировать таблицу и выполнить полное сканирование индекса. Это то же самое поведение при использовании предложения WHERE?

Например, если у меня есть таблица с 1 миллионом записей. Выполнение COUNT без предложения WHERE потребует поиска 1 миллиона записей с использованием индекса. Будет ли запрос значительно быстрее, если при добавлении предложения WHERE число строк, соответствующих критериям, уменьшится с 1 миллиона до 500 000?

Рассмотрим страницу «Значки» на SO, добавит ли столбец в таблицу badges с именем count и увеличит его всякий раз, когда пользователь заработает этот конкретный значок, будет быстрее, чем SELECT COUNT(id) FROM user_badges WHERE user_id = 111?

Использование MyIASM не вариант, потому что мне нужны функции InnoDB для поддержания целостности данных.

Ответы [ 3 ]

5 голосов
/ 28 октября 2012

SELECT COUNT (*) FROM имя таблицы , похоже, выполняет полное сканирование таблицы.

SELECT COUNT (*) FROM имя таблицы.Быть достаточно быстрым, если доступный индекс НЕ НЕДЕЙСТВИТЕЛЕН, УНИКАЛЬЕН и фиксированной длины.Неуникальный индекс не очень помогает, если вообще.Индексы переменной длины (VARCHAR) кажутся медленнее, но это может быть только потому, что индекс физически больше.Целочисленные индексы UNIQUE NOT NULL можно посчитать быстро.Что имеет смысл.

MySQL действительно должен выполнить эту оптимизацию автоматически.

3 голосов
/ 25 июля 2010

Производительность COUNT() хорошая, если у вас есть индекс, который используется.

Если у вас миллион записей, а рассматриваемый столбец NON NULL, тогда COUNT() будет миллиондовольно легкоЕсли допустимы значения NULL, они не индексируются, поэтому количество записей легко определить, взглянув на размер индекса.

Если вы не укажете предложение WHERE, тогда худший случайбудет использоваться индекс первичного ключа.

Если вы укажете предложение WHERE, просто убедитесь, что столбцы столбцов проиндексированы.

1 голос
/ 25 июля 2010

Я бы не сказал, избегать, но это зависит от того, что вы пытаетесь сделать:

  • Если вам нужно только предоставить оценку, вы можете сделать SELECT MAX (id)Со стола.Это намного дешевле, поскольку ему просто нужно прочитать максимальное значение в индексе.

  • Если мы рассмотрим приведенный вами пример значков, InnoDB нужно только подсчитать количество значков, которыепользователь имеет (предполагая индекс на user_id).Я бы сказал, что в большинстве случаев это будет не более 10-20, и это совсем не вредно.

Это действительно зависит от ситуации.Вероятно, я бы сохранил счетчик количества значков, которые кто-то имеет в главной пользовательской таблице, в виде столбца (count_badges_awarded) просто потому, что каждый раз, когда отображается аватар, также и это число.Это избавляет меня от необходимости делать 2 запроса.

...