Ако mysql трябва да преброи 11 милиона реда, наистина няма много начин да се ускори простото преброяване. Поне да не го накарам на скорост под 1 секунда. Трябва да преосмислите как преброявате. Няколко идеи:
-
Добавете поле за автоматично увеличение към таблицата. Изглежда, че не бихте изтрили от таблицата, така че можете да използвате проста математика, за да намерите броя на записите. Изберете минималния номер на автоматично увеличение за първоначалната по-ранна дата и максималния за последната дата и извадете едното от другото, за да получите броя на записите. Например:
SELECT min(incr_id) min_id FROM record_updates WHERE date_updated BETWEEN '2009-10-11 15:33:22' AND '2009-10-12 23:59:59'; SELECT max(incr_id) max_id FROM record_updates WHERE date_updated > DATE_SUB(NOW(), INTERVAL 2 DAY);`
-
Създайте друга таблица, обобщаваща броя на записите за всеки ден. След това можете да потърсите тази таблица за общия брой записи. Ще има само 365 записа за всяка година. Ако трябва да преминете към по-фини времена, потърсете обобщената таблица за пълни дни и текущата таблица само за броя на записите за началния и крайния ден. След това ги добавете заедно.
Ако данните не се променят, което изглежда не е така, обобщените таблици ще бъдат лесни за поддържане и актуализиране. Те значително ще ускорят нещата.