COUNT(x)
проверяет x
на наличие NOT NULL
перед подсчетом строки.
COUNT(*)
- это обычный шаблон для подсчета строк.
Итак ...
SELECT COUNT(evt_id), transaction_t is just `SELECT FIND_IN_SET(17, '8,12,17,90');`ype
FROM trans_tbl GROUP BY transaction_type;
решил сделать сканирование таблицы, затем отсортировать и сгруппировать.
SELECT COUNT(*), transaction_type
FROM trans_tbl GROUP BY transaction_type;
увидел INDEX(transaction_type)
и сказал: "Хорошо, я могу просто отсканировать этот индекс без необходимости сортировки".Примечание: он все еще должен сканировать, чтобы считать.Но INDEX
меньше таблицы, поэтому это можно сделать быстрее.Это также называется «покрывающим» индексом, поскольку все столбцы, необходимые в SELECT
, находятся в том, что один INDEX
.
COUNT(1)
может обрабатываться так же, как COUNT(*)
, я не знаю.
INDEX(transaction_type)
по сути идентично INDEX(transaction_type, evt_id)
.Это потому, что PRIMARY KEY
незаметно прикреплен к любому вторичному ключу в InnoDB.
Я не знаю, почему INDEX(transaction_type, evt_id)
не использовался.Итог: используйте COUNT(*)
.
Почему бы не 0 секунд?Подсчеты нигде не сохраняются.В любом случае, могут быть другие запросы, изменяющие количество при запуске SELECT
.Улучшение произошло благодаря сканированию 126M строк с двумя столбцами вместо 126M строк с несколькими столбцами.