предел vs существует vs количество(*) vs количество(идентификатор) в MySQL


Я просто хочу знать, какой из них самый быстрый.

Что я пытаюсь сделать, так это просто проверить, существуют ли данные в таблице. Я использовал "ОГРАНИЧЕНИЕ" большую часть времени, но, по вашему мнению, или если у вас есть основания, какой из них быстрее всего проверяет наличие данных.

Пример:

Предел 1:

SELECT ID 
       FROM TABLE 
       WHERE ID=1 LIMIT 1;

Существует:

SELECT EXISTS(
              SELECT * 
              FROM TABLE 
              WHERE ID=1);

Считать(*):

SELECT (*) 
FROM TABLE;

Количество (идентификатор):

SELECT (ID) 
FROM TABLE;" 

Дополнительно: Я использование InnoDB.

Author: Echusen, 2013-11-15

2 answers

Предел всегда самый быстрый, потому что он повторяет одну строку таблицы.

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

Count повторит всю таблицу и подсчитает результат. Когда вы используете count(), по умолчанию mysql подсчитывает первичный ключ таблицы. Я провел несколько тестов count(id), count(), count(поле) и count(1) в большой таблице, нет большого разница. На мой взгляд, "count" всегда будет пытаться подсчитать индекс, если только поле, которое вы подсчитываете, не является индексом, но многие люди говорили, что мы должны использовать count(id), а не использовать count(*).

В небольшой таблице все четыре способа работают нормально. Но если вы присоединитесь к какому-нибудь большому столу, подсчет займет очень, очень много времени.

Таким образом, в целом, используется время количество(*)> количество(идентификатор)>> существует> ограничение

 13
Author: user2208436, 2013-11-15 10:20:50

Я думаю, что все они в порядке; за исключением того, что я бы удалил предложения WHERE ID = 1. Если вы когда-нибудь очистите свою таблицу и начнете вставлять заново, то ID 1 не будет существовать. Просто LIMIT 1 сделает свое дело. Лично я не одобряю варианты exists и count(*). Я бы предпочел count(ID) тогда, поскольку у вас обычно есть индекс на ID, поэтому я ожидал бы, что он будет работать довольно быстро. Чтобы быть уверенным, вам придется рассчитать их (на действительно большом столе) - я ожидаю, что они выйдут примерно такими exists, limit 1, count(id), count(*) от самого быстрого к самому медленному. (Я сомневаюсь в exists, хотя - если он действительно оценивает весь SELECT *, это может оказаться хуже всего).

 0
Author: CompuChip, 2013-11-15 09:34:25