Который является менее дорогим счетчиком запросов (id) или заказом по id - PullRequest
0 голосов
/ 27 марта 2011

Я хотел бы знать, какое из следующих действий будет выполняться быстрее в базе данных MySQL.Таблица будет содержать от 200 до 1000 записей.

  SELECT id 
    from TABLE 
order by id desc
   limit 1

или

SELECT count(id) 
  from TABLE

История в том, что таблица кэшируется.Таким образом, этот запрос должен выполняться каждый раз перед извлечением из кэша, чтобы определить, являются ли данные кэша недействительными, путем сравнения предыдущего значения.

Поэтому, если существует еще более дешевый запрос, пожалуйста, дайте мне знать.Спасибо.

Ответы [ 3 ]

2 голосов
/ 27 марта 2011

Если вы

  1. начинаете с 1
  2. , то никогда не бывает пробелов
  3. используйте движок InnoDB
  4. идентификатор не обнуляется

Тогда 2-й может работать [очень незначительно] быстрее из-за того, что не нужно вообще посещать данные таблицы (счет хранится в метаданных).

В противном случае,

  • если таблица не имеет индекса по идентификатору (вызывая SCAN), вторая будет быстрее

За исключением обоих вышеприведенных

  • первая будет быстрее


И если вы на самом деле хотели спросить SELECT .. LIMIT 1 против SELECT MAX(id).., то ответ на самом деле заключается в том, что они одинаковы для MySQL и большинства вменяемых СУБД, независимо от того, существует индекс или нет.
0 голосов
/ 27 марта 2011

Как уже указывалось в комментариях, ваша таблица настолько мала, что на самом деле не соответствует вашему решению. По этой причине следует использовать select count(id), поскольку оно выражает намерение и не требует дальнейшей обработки.

Теперь select count(id) поставляется с альтернативой select count(*). Эти два не являются синонимами. select count(*) будет подсчитывать количество строк и использовать кэшированное значение, если это возможно, когда select count(id) считает количество ненулевых значений существующего идентификатора столбца. Если для столбцов идентификаторов задано ненулевое значение, можно использовать количество кэшированных строк.

Выбор между count(*) и count(id) еще раз зависит от вашего намерения. В общем случае count(*) лучше описывает намерение.

Существует возможность count(1), которая на самом деле является синонимом count(*) при использовании mysql, но интерпретация может отличаться, если в конечном итоге использовать другую СУБД.

Производительность каждого типа счета также зависит от того, используете ли вы MyISAM или InnoDB. Количество строк кэшируется в первом, но не во втором, если я правильно понял.

В конце концов, вы должны полагаться на планы запросов и выполнение тестов и измерение их производительности, а не на эти общие проблемы.

0 голосов
/ 27 марта 2011

Я думаю, что первый запрос будет выполняться быстрее, так как запрос ограничен для выполнения только для одной строки, 200-1000 в этом случае может не иметь большого значения.

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