| Še počasen query, če je limit velik | ||
|---|---|---|
|
blackmamba
13. okt 2010 08:13:26
Pridružen od: 4. mar 2008 559 objav 392 25 11 |
#1
Tale query z LIMIT 0, 21 se izvaja 0.001sekunde Explain: Isti query z LIMIT 6000, 21 se izvaja 0.6 sekunde. Če odstranim FORCE INDEX FOR JOIN(news_id) pa naredi query z LIMIT 6000,21 polovico hitreje, v 0.3s. Čeprav explain pokaže "Using temporary" Kako bi lahko pospešil izvajanje querijev z višjimi limiti? Kakšna ideja? |
|
|
fatg
13. okt 2010 11:48:25
Pridružen od: 28. jan 2008 94 objav 73 2 0 |
#2
Ne bo enostavno, po moje. Pri uporabi visokih vrednostih za LIMIT največ profitiraš z indeksom na ORDER BY polju, ker mora MySQL za zapise 6000 - 6021 najprej vedeti vrstni red vseh zapisov do vključno 6021, da lahko potem preskoči 6000 zapisov. Tole s preverjanjem LIMIT > COUNT/2 je samo ugibanje, ne moreš predvideti, kako se bo stvar obnesla, ko se bo število zapisov spreminjalo. In načeloma MySQL v večini primerov bolje izbere indeks, kot ti, zato bi jaz FORCE INDEX uporabil le, če bi bil res kje velik problem z determinističnim in konstantnim rezultatom (kar tvoj očitno ni, saj se bolje obnese brez njega). Kako dolgo se ti izvaja LIMIT 0, 21 brez FORCE INDEX? Če je to v znosnem rangu, odstrani to in pusti, da MySQL naredi, kar zna. Drugače pa spremeni pristop (kakšne vmesne predizračunane tabele? - ne poznam problema). |
|
|
blackmamba
13. okt 2010 12:02:08
Pridružen od: 4. mar 2008 559 objav 392 25 11 |
#3
fatg: brez forcanega indexa se LIMIT 0,21 izvaja 250x počasneje ~ 0.25 sekunde Sem probal odstraniti joinano tabelo 'url' pa se profitira le 0.05s |
|
|
fatg
13. okt 2010 12:58:57
Pridružen od: 28. jan 2008 94 objav 73 2 0 |
#4
Kolikokrat pa se realno izvajata LIMIT 0,21 in 6000,21? Serviraš to obiskovalcem, ali v backendu? Če imaš poizvedb za 6000,21 samo par sto na dan, potem ne izgubljaj več časa s tem. |
|
|
blackmamba
13. okt 2010 13:49:48
Pridružen od: 4. mar 2008 559 objav 392 25 11 |
#5
Pomojem te strani odpira samo kak google-bot in kak user, če 'zaide' pregloboko. Saj zadeva ni problematična, ampak me firbec matra kako najbolje(s hitrimi poizvedbami) narediti paging npr 30k kategoriziranih novic urejenih po datumu. še primeri različnih limitov s FORCE INDEX: brez FORCE INDEX: |
|
|
fatg
13. okt 2010 14:03:21
Pridružen od: 28. jan 2008 94 objav 73 2 0 |
#6
Jaz se ne bi sekiral zaradi teh časov. Važno, da so pogosti queryji hitri. Si pri meritvah upošteval query cache? Ena opcija za paging je predpripravljena flat tabela, kamor filaš podatke iz tega queryja, s tem da zavržeš določene specifične pogoje (categoryid), obdržiš pa preverbo na insertedat in action. V njej hraniš samo polja, nujna za prikaz na seznamih. Potem pa po njej za prikaz queryjaš po categoryid in ORDER BY insertedat. Sicer ohraniš ta glavni požrešni del (LIMIT), tako da je vprašanje, koliko pridobiš, se pa znebiš joinov pa še indekse imaš lahko prilagojene branju (torej recimo samo 1 sestavljen index na insertedat + categoryid). Čim manj indeksov, toliko bolje tudi za pisanje, pri branju pa MySQL itak uporabi samo 1 indeks na posamezni tabeli. Tabelo generiraš tako, da query v ozadju izvajaš npr. 1x na pet minut. Na ta način profitiraš še s query cacheom, ki se drugaže izprazni ob vsaki spremembi tabele (tukaj ti drži do naslednjega rebuilda). Če pa nimaš veliko podatkov, lahko "rezerviraš" npr. 100mb in narediš to tabelo MEMORY, tako da jo ima strežnik kar v ramu. Potreba po indeksih odpade, pa še queryji so super hitri. |
|
|
SpinX
13. okt 2010 14:13:13
Pridružen od: 17. mar 2007 2618 objav 1720 190 20 |
#7
fatg: ti več kot očitno obvladaš te zadeve:) Priporočaš kakšno knjigo na to temo ? Nekaj kar se bere lahko, ne nek reference s 500 stranmi :) Developer? Bi delal v kul podjetju ? http://dlabs.si/jobs
|
|
|
blackmamba
13. okt 2010 14:17:21
Pridružen od: 4. mar 2008 559 objav 392 25 11 |
#8
Da, query cache sem upošteval. Najlepša hvala za obširne odgovore in nasvete! Hvala in LP |
|
|
fatg
13. okt 2010 17:59:09
Pridružen od: 28. jan 2008 94 objav 73 2 0 |
#9
@SpinX: to znanje je bolj rezultat neprespanih noči, kupa člankov z neta in MySQL dokumentacije, kot knjig :D. Knjige sem prebral samo kakšne osnovne, je pa High Performance MySQL: Optimization, Backups, Replication, and More baje zelo solidna in je tudi na mojem spisku. :) blackmamba: se priporočam. :) |
|