Przyspieszenie liczenia wierszy w MySQL

Załóżmy, że dla celów ilustracyjnych uruchomiono bibliotekę przy użyciu prostej tabeli „książek” MySQL z trzema kolumnami:

(identyfikator, tytuł, status)

ID jest kluczem podstawowymtytuł to tytuł książkistatus może być enumem opisującym aktualny stan książki (np. DOSTĘPNE, SPRAWDZONE, PRZETWARZANIE, BRAK)

Proste zapytanie o liczbę książek przypadających na każdy stan to:

SELECT status, COUNT(*) FROM books GROUP BY status

lub aby dowiedzieć się, ile książek jest dostępnych:

SELECT COUNT(*) FROM books WHERE status = "AVAILABLE"

Jednak po zwiększeniu liczby tabel do milionów wierszy wypełnienie tych zapytań zajmuje kilka sekund. Dodanie indeksu do kolumny „status” wydaje się nie mieć wpływu na moje doświadczenia.

Oprócz okresowego buforowania wyników lub jawnego aktualizowania informacji podsumowujących w osobnej tabeli za każdym razem, gdy książka zmienia stan (za pomocą wyzwalaczy lub innego mechanizmu), czy są jakieś techniki przyspieszenia tego rodzaju zapytań? Wygląda na to, że zapytania COUNT kończą się na każdym wierszu i (nie znając więcej szczegółów) jestem trochę zaskoczony, że te informacje nie mogą być w jakiś sposób określone na podstawie indeksu.

AKTUALIZACJA

Korzystając z przykładowej tabeli (z indeksowaną kolumną „status”) z 2 milionami wierszy, przetestowałem zapytanie GROUP BY. Używając silnika pamięci masowej InnoDB, zapytanie trwa od 3,0 do 3,2 sekundy na moim komputerze. Przy użyciu MyISAM zapytanie trwa od 0,9 do 1,1 sekundy. W żadnym przypadku nie było znaczącej różnicy między liczbą (*), liczbą (stan) lub liczbą (1).

MyISAM jest co prawda nieco szybszy, ale byłem ciekawy, czy istnieje sposób na uruchomienie równoważnego zapytaniadużo szybszy (np. 10-50 ms - wystarczająco szybki, aby można go było wywołać na każdym żądaniu strony internetowej o niskim natężeniu ruchu) bez mentalnego narzutu buforowania i wyzwalaczy. Wygląda na to, że odpowiedź brzmi: „nie ma możliwości szybkiego uruchomienia bezpośredniego zapytania”, czego się spodziewałem - chciałem tylko upewnić się, że nie brakuje mi łatwej alternatywy.

questionAnswers(5)

yourAnswerToTheQuestion