Pohitritev querija
 
blackmamba28. apr 2010 16:59:11Pridružen od:
4. mar 2008
307 objav
+163-101
#1Kako pohitriti poizvedbo?Showing rows 0 - 20 (21 total, Query took 1.5251 sec)

SELECT n.title, n.news_id, n.short, n.picture, n.youtube, n.audio, n.gallery_id, n.inserted
FROM news AS n
LEFT JOIN news2category AS n2c ON ( n2c.news_id = n.news_id )
WHERE n2c.category_id = '5'
AND n.inserted < NOW( )
ORDER BY n.priority DESC , n.inserted DESC
LIMIT 0 , 21
Index je nastavljen na fieldih: news_id, priotity, inserted

V povezovalni tabeli je vse indeksirano.

Novic je v bazi cca 30000

Zadevo upočasni ORDER BY, brez sortiranja dobim rezultat v 0.00x sekundah.

explain:


HELP :)
nazadnje urejal blackmamba 28. apr 2010 17:08:04
všeč(0)ni všeč(0)spam(0)
 
fatg28. apr 2010 17:25:23Pridružen od:
28. jan 2008
94 objav
+72-20
#2zakaj imaš LEFT JOIN? navaden join ne bi bil v redu? A je pogoj n.inserted < NOW() smiseln? Če nimaš insertov v prihodnosti, to odstrani.

MySQL uporabi samo 1 index na posamezno aktivno tabelo v queryju. EXPLAIN pokaže, da izbere PRIMARY index za tabelo news. Na tej tabeli ti izvajaš sledeče operacije: WHERE (polje inserted), ORDER (priority in inserted). Mogoče je torej boljši index inserted, kar lahko sforsiraš (išči FORCE INDEX), lahko pa probaš tudi forsirati index na priority (čeprav dvomim, da bo bolje).

Za tabelo news2category izbere index category_id, vendar to pomeni, da mora delati scan tabele za pogoj n2c.news_id = n.news_id, namesto da bi poiskal z indexom. Probaj spremeniti zadevo v navaden join in forsirati index news_id za tabelo n2c.

Tole je takole na hitro na pamet. Drugače pa 1.5 sekunde ni čas za sekiranje. :)
všeč(+5)ni všeč(0)spam(0)
 
blackmamba28. apr 2010 17:25:55Pridružen od:
4. mar 2008
307 objav
+163-101
#3FORCE INDEX(inserted, priority) je spravlo zadevo na 0.2 ~ 0.4 sekunde
všeč(+1)ni všeč(0)spam(0)
 
blackmamba28. apr 2010 17:41:20Pridružen od:
4. mar 2008
307 objav
+163-101
#4Še nisem videl tvojega posta, ko sem odkril FORCE INDEX in USE INDEX.

LEFT sem odstranil, ne opazim razlike.
NOW() je potreben, ker so novice napisane za v naprej.
Najbolje se obnese, če forcam(ali USE) index na priority. Sedaj se izvede v 0.1~0.2 sekunde !

Hvala za odgovor!
nazadnje urejal blackmamba 28. apr 2010 17:41:37
všeč(0)ni všeč(0)spam(0)
 
blackmamba28. apr 2010 18:06:06Pridružen od:
4. mar 2008
307 objav
+163-101
#5zmagovalni query: 0.06sSELECT n.title, n.news_id, n.short, n.picture, n.youtube, n.audio, n.gallery_id, n.inserted
FROM news AS n
FORCE INDEX ( priority )
JOIN news2category AS n2c
FORCE INDEX FOR JOIN (
news_id
) ON ( n2c.news_id = n.news_id )
WHERE n2c.category_id = '5'
AND n.inserted < NOW( )
ORDER BY n.priority DESC , n.inserted DESC
LIMIT 0 , 21
fatg, kapo dol :)
nazadnje urejal blackmamba 28. apr 2010 18:16:37
všeč(0)ni všeč(0)spam(0)
 
fatg28. apr 2010 19:56:54Pridružen od:
28. jan 2008
94 objav
+72-20
#6no, krasno :)
všeč(+2)ni všeč(0)spam(0)
 
blackmamba28. apr 2010 22:22:20Pridružen od:
4. mar 2008
307 objav
+163-101
#7Kadar imam LIMIT 0, 20
se izvede v 0.2 sekunde,
pri npr. LIMIT 450, 20
se pa izvaja 1.2 sekunde.

Se da še tu kaj pridobit?
nazadnje urejal blackmamba 28. apr 2010 22:28:40
všeč(0)ni všeč(0)spam(0)
 
fatg29. apr 2010 09:45:40Pridružen od:
28. jan 2008
94 objav
+72-20
#8mogoče boš še kaj profitiral s force index (inserted), na pamet pa težko kaj več svetujem. Čas se očitno izgublja pri sortiranju, zato morda namesto single indexa na priority ustvari kompoziten index na (priority, inserted) ali (inserted, priority) in potem forsiraj tega. Lahko probaš tudi s kompozitnim indexom (news_id, category_id) ali (category_id, news_id) na news2category tabeli.
všeč(+4)ni všeč(0)spam(0)
 
blackmamba2. maj 2010 18:27:52Pridružen od:
4. mar 2008
307 objav
+163-101
#9S kopozitnimi indexi mi žal ni uspelo, sem pa uredil cachiranje querijev tako da zdaj gre kot mora.
všeč(0)ni všeč(0)spam(0)
 
armandoxxx11. maj 2010 09:12:07Pridružen od:
4. maj 2010
7 objav
+1-20
#10ena varianta je tudi z uporabo STRAIGHT_JOIN

SELECT STRAIGHT_JOIN n.title, n.news_id, n.short, n.picture, n.youtube, n.audio, n.gallery_id, n.inserted
FROM news AS n
LEFT JOIN news2category AS n2c ON ( n2c.news_id = n.news_id )
WHERE n2c.category_id = '5'
AND n.inserted < NOW( )
ORDER BY n.priority DESC , n.inserted DESC
LIMIT 0 , 21

dej please sporoči kolk hitr bo query k me zanima ! Če sploh bo kej pohitril ;)

LP
Armando
nazadnje urejal armandoxxx 11. maj 2010 09:12:44
všeč(0)ni všeč(0)spam(0)
 
stran 1 od 2 |<<12>|