Lekérdezés optimalizálás
Sziasztok!
Besegítek egy oldal fejlesztésébe/adminisztrálásába, és tegnap szólt a tulajdonos hogy a szolgáltató leállította az oldalt, mert túlságosan leterheli az adatbázisszerverüket. A lassan lefutott lekérdezések naplóját elküldték. A hibát egy olyan lekérdezés okozza a napló szerint , ami az oldalon található 10 legtöbbet letöltött letöltést adja vissza. Amihez 3 táblát használ
download: itt vannak a letöltések 789 rekord
download_category: letöltések kategórizálása 32 rekord
download_request: a felhasználó által inditott letöltéseket naplózza, ki, mikor, melyik fájlt töltötte le, ez a tábla már 100.000 feletti rekordszámmal bír.
Kérdésem az hogy az alábbi lekérdezést miként lehetne gyorsítani/optimalizálni hogy ne feküdjön ki a szerver tőle. Utolsó megoldásként megcsinálom úgy hogy ne kelljen belenyúlnia a request táblába, de hátha valakinek van jobb ötlete.Köszönöm
■ Besegítek egy oldal fejlesztésébe/adminisztrálásába, és tegnap szólt a tulajdonos hogy a szolgáltató leállította az oldalt, mert túlságosan leterheli az adatbázisszerverüket. A lassan lefutott lekérdezések naplóját elküldték. A hibát egy olyan lekérdezés okozza a napló szerint , ami az oldalon található 10 legtöbbet letöltött letöltést adja vissza. Amihez 3 táblát használ
download: itt vannak a letöltések 789 rekord
download_category: letöltések kategórizálása 32 rekord
download_request: a felhasználó által inditott letöltéseket naplózza, ki, mikor, melyik fájlt töltötte le, ez a tábla már 100.000 feletti rekordszámmal bír.
Kérdésem az hogy az alábbi lekérdezést miként lehetne gyorsítani/optimalizálni hogy ne feküdjön ki a szerver tőle. Utolsó megoldásként megcsinálom úgy hogy ne kelljen belenyúlnia a request táblába, de hátha valakinek van jobb ötlete.
SELECT d.*, COUNT(ds.download_request_download_id) AS statcnt
FROM download AS d
LEFT JOIN download_category AS dcs ON dcs.download_category_id = d.download_category
LEFT JOIN download_category AS dc ON dc.download_category_id = dcs.download_category_parent
LEFT JOIN download_requests AS ds ON d.download_id = ds.download_request_download_id
AND ds.download_request_datestamp >= 1214863200
WHERE dc.download_category_class IN (252,251,0)
AND dcs.download_category_class IN (252,251,0)
AND d.download_visible IN (252,251,0)
GROUP BY d.download_id
ORDER BY statcnt DESC LIMIT 0, 10;
Gyorstárazz!
Ekkora rekordszámnál nem fog túl gyorsan változni.
Schema
Extrém nagy esélyt látok arra, hogy valamilyen index hibádzik a dologban.
Ha MySQL-t használsz (ezt se írtad, bár a LIMIT-ből feltételezem hogy igen), akkor érdemes megvizsgálni hogy használ-e index-eket megfelelően a lekérdezés:
LEFT JOIN vs INNER JOIN
Kategóriák kellenek?
Pont fordítva tudom
Szóval nem hiszem hogy megérné átírni (ha egyáltalán át lehet) INNER JOIN-ra.
Lassulás
Okok
Filesort
Ez így van
számlálók használata
Képzeld el, hogy nagy mennyiségű adat esetén ez a lekérdezés mekkora terhelést okozhat! Ennek ellenére az indexeket érdemes átnézegetni, mert ilyen kevés adatmennyiségnél ennek a lekérdezésnek nem kellene gondot okoznia. A szolgáltatót pedig cseréljétek le ha szó nélkül állította le az oldalt, mert az nem szép dolog.
Számláló hozzáadása
Explain PDF
Memcache
Ja igen, és ahogy megmondták már: az oldal letöltésének 90%-a nem a HTML kód, hanem a járulékos dolgok. Azokra is illik gyúrni (gzip, cache headerek, stb).
Köszönöm