Когато COUNT(*)
той взема в брой индекси на колони, така че ще бъде най-добрият резултат. Mysql с MyISAM двигателят всъщност съхранява броя на редовете, той не брои всички редове всеки път, когато се опитате да преброите всички редове. (въз основа на колоната на първичния ключ)
Използването на PHP за броене на редове не е много умно, защото трябва да изпращате данни от mysql към php. Защо да го правите, когато можете да постигнете същото от страна на mysql?
Ако COUNT(*)
е бавен, трябва да изпълните EXPLAIN
на заявката и проверете дали индексите наистина се използват и къде трябва да бъдат добавени.
Следното не е най-бързото начин, но има случай, когато COUNT(*)
всъщност не пасва - когато започнете да групирате резултатите, можете да срещнете проблем, където COUNT
всъщност не отчита всички редове.
Решението е SQL_CALC_FOUND_ROWS
. Това обикновено се използва, когато избирате редове, но все пак трябва да знаете общия брой редове (например за пейджинг). Когато избирате редове с данни, просто добавете SQL_CALC_FOUND_ROWS
ключова дума след SELECT:
SELECT SQL_CALC_FOUND_ROWS [needed fields or *] FROM table LIMIT 20 OFFSET 0;
След като сте избрали необходимите редове, можете да получите броя с тази единична заявка:
SELECT FOUND_ROWS();
FOUND_ROWS()
трябва да се извика веднага след заявката за избор на данни.
В заключение, всичко всъщност се свежда до това колко записа имате и какво има в оператора WHERE. Наистина трябва да обърнете внимание на това как се използват индексите, когато има много редове (десетки хиляди, милиони и нагоре).