Of ja, eigenlijk heeft het niet echt strikt iets met het fulltext verhaal te maken maar goed.
Gaat over de zoekfunctie van een forum, heb deze query:
Query is heftig ingekort, hoop irrelevante dingen zijn weggelaten (join met forums table, ophalen lastpost, dat soort spul).
Oh, database waar het om gaat bevat 274.000 posts en 25.000 topics. Posts zijn opgesplitst in een tabel met alleen postid en de text en een tabel met overige gegevens (poster, tijd, ip, topic, etc). Op de posttext en de titels zitten MySQL fulltext indices.
Topics:
Data 1.849 KB
Index 1.725 KB
total 3.574 KB
Posts_text:
Data 95.961 KB
Index 102.919 KB
Overhead 588 Byte
Effective 198.879 KB
total 198.880 KB
3MB en 200MB dus.
Bovenstaande query is uit te voeren in iets van een tiende seconde is dus wel acceptabel. Dit is dus het geval als er ALLEEN op de post text wordt gezocht.
Heel ander beeld krijgen we als we gaan zoeken op het topic_title:
Door de opbouw van het search script ziet de query er bijna exact hetzelfde uit. Probleem is alleen dat deze query 8 seconde(!) duurt! Niet fun dus. Ik gok dat er eerst een full join op de posts table wordt gedaan en daarna gaat MySQL pas kijken welke rows er nou eigenlijk interessant zijn.
Als ik een select doe als:
Dan duurt de query maar een tiende seconde.
Probleem is dat ik ze natuurlijk wil combineren, dus iets als:
Alleen krijg je dan dus queries die een seconde of 8 duren. Dit moet toch sneller kunnen?? Heb alleen geen flauw idee hoe
Any thoughts?
Gaat over de zoekfunctie van een forum, heb deze query:
code:
1
2
3
4
5
6
7
8
9
10
| SELECT
p.post_id
FROM
posts_text pt
LEFT JOIN posts p ON pt.post_id = p.post_id
LEFT JOIN topics t ON p.topic_id = t.topic_id
WHERE
MATCH (pt.post_text) AGAINST ('test')
GROUP BY t.topic_id
ORDER BY p.post_time desc |
Query is heftig ingekort, hoop irrelevante dingen zijn weggelaten (join met forums table, ophalen lastpost, dat soort spul).
Oh, database waar het om gaat bevat 274.000 posts en 25.000 topics. Posts zijn opgesplitst in een tabel met alleen postid en de text en een tabel met overige gegevens (poster, tijd, ip, topic, etc). Op de posttext en de titels zitten MySQL fulltext indices.
Topics:
Data 1.849 KB
Index 1.725 KB
total 3.574 KB
Posts_text:
Data 95.961 KB
Index 102.919 KB
Overhead 588 Byte
Effective 198.879 KB
total 198.880 KB
3MB en 200MB dus.
Bovenstaande query is uit te voeren in iets van een tiende seconde is dus wel acceptabel. Dit is dus het geval als er ALLEEN op de post text wordt gezocht.
Heel ander beeld krijgen we als we gaan zoeken op het topic_title:
code:
1
2
3
4
5
6
7
8
9
10
| SELECT
p.post_id
FROM
posts_text pt
LEFT JOIN posts p ON pt.post_id = p.post_id
LEFT JOIN topics t ON p.topic_id = t.topic_id
WHERE
MATCH (t.topic_title) AGAINST ('test')
GROUP BY t.topic_id
ORDER BY p.post_time desc |
Door de opbouw van het search script ziet de query er bijna exact hetzelfde uit. Probleem is alleen dat deze query 8 seconde(!) duurt! Niet fun dus. Ik gok dat er eerst een full join op de posts table wordt gedaan en daarna gaat MySQL pas kijken welke rows er nou eigenlijk interessant zijn.
Als ik een select doe als:
code:
1
2
3
4
5
6
7
8
9
10
11
| SELECT
p.post_id
FROM
topics t
LEFT JOIN posts p ON t.topic_id = p.topic_id
LEFT JOIN posts_text pt ON p.post_id = pt.post_id
WHERE
MATCH (t.topic_title) AGAINST ('test')
GROUP BY t.topic_id
ORDER BY p.post_time desc
LIMIT 200 |
Dan duurt de query maar een tiende seconde.
Probleem is dat ik ze natuurlijk wil combineren, dus iets als:
code:
1
2
3
| MATCH (pt.post_text) AGAINST ('test')
OR
MATCH (t.topic_title) AGAINST ('test') |
Alleen krijg je dan dus queries die een seconde of 8 duren. Dit moet toch sneller kunnen?? Heb alleen geen flauw idee hoe
Any thoughts?
edit:
[ /code] vergeten
[ /code] vergeten