Jeśli chcesz skorzystać z LIMIT
poprawy wydajności, potrzebujesz
- zrozumieć dane, które pobierasz
- poprawne indeksowanie poprawnej sekwencji kolumn
- wziąć odpowiedzialność za refaktoryzację zapytania
- używając
LIMIT
wcześniejJOIN
Zasady te mogą przejść długą drogę, jeśli potrafisz je zharmonizować.
Nauczyłem się tych koncepcji, oglądając ten film na YouTube (uważnie słuchaj przez francuski akcent)
Użyłem tych koncepcji, aby odpowiedzieć na bardzo trudne pytanie StackOverflow dotyczące uzyskiwania 40 najlepszych artykułów z niektórych tabel: 12 maja 2011 r .: Pobieranie pojedynczego wiersza z tabeli łączenia .
W mojej odpowiedzi na to pytanie (16 maja 2011 r.) Napisałem następujące zapytanie i dokładnie je przetestowałem:
SELECT
AAA.author_id,
AAA.date_created,
IFNULL(BBB.title,'<NO_TITLE>') title,
IFNULL(CCC.filename,'<NO-IMAGE>') filename,
IFNULL(CCC.date_added,'<NO-IMAGE-DATE>') image_date
FROM
(
SELECT
AA.id,
AA.date_added,
BB.author_id,
BB.date_created
FROM
(
SELECT
A.id,IFNULL(MAX(B.date_added),'1900-01-01 00:00:00') date_added
FROM (SELECT id FROM articles ORDER BY date_created DESC LIMIT 40) A
LEFT JOIN article_images B ON A.id = B.article_id
GROUP BY A.id
) AA
INNER JOIN articles BB USING (id)
) AAA
LEFT JOIN article_contents BBB ON AAA.id=BBB.article_id
LEFT JOIN article_images CCC
ON (AAA.id=CCC.article_id AND AAA.date_added=CCC.date_added)
ORDER BY AAA.date_created DESC;
Proszę zwrócić uwagę na wiersz w zapytaniu za pomocą LIMIT
FROM (SELECT id FROM articles ORDER BY date_created DESC LIMIT 40) A
To podzapytanie jest zakopane na trzech poziomach. To pozwoliło mi pobrać ostatnie 40 artykułów LIMIT
. Następnie wykonałem niezbędne połączenia.
ZDOBYTA WIEDZA
- Wykonywanie
LIMIT
wewnętrznych podkwerend nie zawsze może być odpowiedzią ze względu na liczność indeksów, zawartość danych i rozmiar zestawu wyników z LIMIT
. Jeśli masz wszystkie „kaczki z rzędu” (pamiętaj o czterech zasadach dotyczących zapytania), możesz uzyskać zaskakująco dobre wyniki.
- Spraw, aby Twoje zapytania były maksymalnie uproszczone,
LIMIT
zbierając tylko klucze.
LIMIT
poprawiają wydajność: Optymalizacja zapytań LIMIT