voor een site die ik aan het maken ben, heb ik een lekker vettige zoekfunctie. De site bestaat uit "scenes", welke vergelijkbaar zijn met youtube filmpjes/forum topics qua idee. Met de zoekfunctie kan je in de scenes zoeken (scene_title, scene_description, scene_author), maar ook in de tags en de comments (alles optioneel).
Nu begin ik te merken dat met het met comments best traag gaat. de query ziet er dan zo uit:
Deze query duurt +-14 seconden(!!) (17k scenes, 40k comments)
Het gekke is dat de subquery zelf maar 0.01 seconde kost (oid), dus het probleem zit hem in het cross-checken van die tabellen. Van wat ik gelezen heb op het internet is het beter om joins te gebruiken hiervoor.
Nu denk ik dat deze best omgeschreven kunnen worden naar joins, maar ik kom er maar niet uit.
Omdat ik resultaten wil op een "of/of" basis, moet ik kijken naar full joins? (meen ik te begrijpen)
Voor dit geval heb ik veel geprutst, en uiteindelijk kwam dit eruit:
Maar die werkt niet helemaal goed, want in plaats van 273 resultaten krijg ik er maar 15 terug
Daarbij zit ik met een boel subqueries en criteria te prutsen, dus ik krijg het al helemaal niet voor elkaar om een query als deze om te schrijven naar joins:
kan iemand hier mij helpen met het omschrijven/optimalizeren van deze query?
Nu begin ik te merken dat met het met comments best traag gaat. de query ziet er dan zo uit:
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| SELECT * FROM pbox_scenes WHERE scene_group != 0 AND MATCH (scene_description) AGAINST ('test') OR scene_id IN ( SELECT comment_scene_id FROM pbox_comments WHERE comment_alive=1 AND MATCH ( comment_content ) AGAINST ( 'test' ) ) ORDER BY scene_datetime DESC LIMIT 0,30 |
Deze query duurt +-14 seconden(!!) (17k scenes, 40k comments)
Het gekke is dat de subquery zelf maar 0.01 seconde kost (oid), dus het probleem zit hem in het cross-checken van die tabellen. Van wat ik gelezen heb op het internet is het beter om joins te gebruiken hiervoor.
Nu denk ik dat deze best omgeschreven kunnen worden naar joins, maar ik kom er maar niet uit.
Omdat ik resultaten wil op een "of/of" basis, moet ik kijken naar full joins? (meen ik te begrijpen)
Voor dit geval heb ik veel geprutst, en uiteindelijk kwam dit eruit:
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
| SELECT * FROM ( SELECT * FROM pbox_scenes WHERE MATCH ( scene_description ) AGAINST ( 'test' ) ) full JOIN ( SELECT distinct comment_scene_id FROM pbox_comments WHERE MATCH ( comment_content ) AGAINST ( 'test' ) ) as comments on scene_id=comments.comment_scene_id |
Maar die werkt niet helemaal goed, want in plaats van 273 resultaten krijg ik er maar 15 terug
Daarbij zit ik met een boel subqueries en criteria te prutsen, dus ik krijg het al helemaal niet voor elkaar om een query als deze om te schrijven naar joins:
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
| SELECT * FROM pbox_scenes WHERE scene_group != 0 AND ( MATCH (scene_title) AGAINST ('test') OR MATCH (scene_description) AGAINST ('test') OR scene_id IN ( SELECT comment_scene_id FROM pbox_comments WHERE comment_alive=1 AND MATCH (comment_content) AGAINST ('test') ) OR scene_id IN ( SELECT tag_scene_id FROM pbox_scene_tags WHERE MATCH (tag_name) AGAINST ('test') ) ) ORDER BY scene_datetime DESC LIMIT 0,30 |
kan iemand hier mij helpen met het omschrijven/optimalizeren van deze query?
IF IF = THEN THEN THEN = ELSE ELSE ELSE = IF;