Technologie i narzędzia: język PHP 5, Java, JavaScript, Python, system Zend Framework, Django, biblioteka jQuery, Smarty, platforma Eclipse, MySQL, SVN, CVS, UML, Firefox.
WebProgramming - wszystko o serwisach internetowych
O serwisach internetowych.
[sql] Trik w MySQL
Tworząc stronicowanie listy (typu “Strona: 1 2 3 4 …”) musimy znać liczbę wszystkich rekordów, aby obliczyć liczbę wszystkich stron. W ostatnim artykule podałem przykład jak nie należy się do tego zabierać, ale jak to zrobić, aby było optymalnie?
Standardowo w takiej sytuacji tworzy się proste zapytanie korzystające z funkcji agregującej, zakładając więc, że poniższe zapytanie pobiera aktualną listę rekordów:
-
SELECT * FROM $table WHERE $where LIMIT 0, 20
interesujące nas zapytanie będzie wyglądało następująco (id to klucz główny):
-
SELECT COUNT(id) AS quantity FROM $table WHERE $where
Wydawałoby się, że innej możliwości nie posiadamy.. a jednak z pomocą przychodzi nam funkcjonalność dostępna w MySQL. Mam tutaj na myśli magiczne SQL_CALC_FOUND_ROWS, które należy dodać do zapytania pobierającego dane, czyli w naszym przypadku:
-
SELECT SQL_CALC_FOUND_ROWS * FROM $table WHERE $where LIMIT 0, 20
Dzięki temu MySQL automatycznie oblicza liczbę wszystkich rekordów spełniających warunek $where (bez klauzuli LIMIT). Dostęp do tej liczby uzyskujemy poprzez funkcje FOUND_ROWS():
-
SELECT FOUND_ROWS() AS quantity
Mimo, iż silnik MySQL i tak musi wykonać zapytanie obliczające liczbę wszystkich rekordów to w/w sposób jest trochę szybszy niż standardowy korzystający z funkcji agregującej - dzieje się tak ze względu na brak ponownego wysłania zapytania do MySQL.
Podsumowując: jeżeli ten sposób jest szybszy, czemu z niego nie skorzystać?
Więcej informacji na temat tej funkcjonalności jest dostępna na stronie MySQL.
Komentarze: 3 to “[sql] Trik w MySQL”
Napisz komentarz
Literówka, SQL_CALC_FOUND_ROWS tak nazywa się tak funkcja, warto dodać że po niej nie może znajdować się przecinek.
+
Dzięki poprawione, potwierdzam nie może być przecinka (czyli tak jak w przykładzie powyżej).
uzycie SQL_CALC_FOUND_ROWS nie jest optymalniejsze, jesli uwzgleniamy ten sposo to mysql robi skan calej tabeli, w wiekszosci przypadkow wyslanie i pobranie liczby rekordow za pomoca count’a jest szybsze
W sieci jest troche na ten temat, sam to sprawdzilem w praktyce i potwierdzilo sie to o czym pisze