Tale query z LIMIT 0, 21 se izvaja 0.001sekunde
SELECT n.news_id, n.title, n.news_id, n.short, n.picture, n.youtube, n.audio, n.gallery_id, n.inserted, u.url
FROM news AS n
JOIN news2category AS n2c
FORCE INDEX FOR JOIN (
news_id
) ON n2c.news_id = n.news_id
JOIN url AS u ON n.news_id = u.action_id
WHERE n2c.category_id =2
AND u.action = 'viewNews'
AND n.inserted < NOW( )
ORDER BY n.inserted DESC
LIMIT 0 , 21
Explain:
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE n index PRIMARY inserted 8 NULL 21 Using where
1 SIMPLE u ref action_id action_id 5 baza.n.news_id 1 Using where
1 SIMPLE n2c ref news_id news_id 5 baza.n.news_id 1 Using where
Isti query z LIMIT 6000, 21 se izvaja 0.6 sekunde.
Explain:
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE n ALL PRIMARY NULL NULL NULL 19182 Using where; Using filesort
1 SIMPLE u ref action_id action_id 5 baza.n.news_id 1 Using where
1 SIMPLE n2c ref news_id news_id 5 baza.n.news_id 1 Using where
Č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"
Explain:
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE n2c ref news_id,category_id category_id 5 const 5360 Using where; Using temporary; Using filesort
1 SIMPLE n eq_ref PRIMARY PRIMARY 4 baza.n2c.news_id 1 Using where
1 SIMPLE u ref action_id action_id 5 baza.n.news_id 1 Using where
Kako bi lahko pospešil izvajanje querijev z višjimi limiti?
Ena ideja je, da bi preverjal LIMIT > COUNT/2 potem nebi forcal indexa - news_id ampak verjetno to ni najboljše.
Kakšna ideja?