SQL Join
Beste PHP'ers,
Ik heb twee tabellen, één met uitspraken, de ander met auteurs. Nu wil ik zoeken op een bepaalde tekst (wat auteur of uitspraak kan zijn). De tabellen heb ik gekoppeld met de volgende query:
Nu is deze query erg traag (zo'n minuut), dit komt mede doordat de citaten tabel meer dan 10.000 records bevat. Hoe kan ik deze query sneller maken met hetzelfde resultaat?
Ik heb twee tabellen, één met uitspraken, de ander met auteurs. Nu wil ik zoeken op een bepaalde tekst (wat auteur of uitspraak kan zijn). De tabellen heb ik gekoppeld met de volgende query:
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
SELECT b.auteur,b.uitspraak,
MATCH(s.naam) AGAINST('zoekwoord') + MATCH(b.veld1,b.veld2,b.veld3,b.uitspraak) AGAINST('zoekwoord') AS score
FROM auteurs AS s
LEFT JOIN citaten AS b ON s.id = b.auteur
WHERE MATCH(s.naam) AGAINST('zoekwoord')
OR MATCH(b.veld1,b.veld2,b.veld3,b.uitspraak) AGAINST('zoekwoord')
ORDER BY score DESC
MATCH(s.naam) AGAINST('zoekwoord') + MATCH(b.veld1,b.veld2,b.veld3,b.uitspraak) AGAINST('zoekwoord') AS score
FROM auteurs AS s
LEFT JOIN citaten AS b ON s.id = b.auteur
WHERE MATCH(s.naam) AGAINST('zoekwoord')
OR MATCH(b.veld1,b.veld2,b.veld3,b.uitspraak) AGAINST('zoekwoord')
ORDER BY score DESC
Nu is deze query erg traag (zo'n minuut), dit komt mede doordat de citaten tabel meer dan 10.000 records bevat. Hoe kan ik deze query sneller maken met hetzelfde resultaat?
Gesponsorde koppelingen:
records minder maken
maar dan heb je weer niet het zelfde resultaat
maar dan heb je weer niet het zelfde resultaat
Nee volgens mij is de query niet efficiënt
Indexen maken. Kijken wat van de query het sloomst loopt en dat verbeteren...
Oh, ik denk overigs dat er niet zoveel aan te doen is. Vanwege die match...
Oh, ik denk overigs dat er niet zoveel aan te doen is. Vanwege die match...
Gewijzigd op 01/01/1970 01:00:00 door Karl Karl
Ik gebruik nu twee keer (bijna) dezelfde match, misschien is dat te vereenvoudigen?
Even profiler gebruiken, dan kan je zien waar de query's bottleneck zit.
Edit: Volgens mij loopt hij wel snel wanneer ik er een LIMIT 0,30 aan gooi zoals phpmyadmin doet.
Status Tijd
starting 0.000032
checking query cache for query 0.000091
checking permissions 0.000010
checking permissions 0.000010
Opening tables 0.000026
System lock 0.000013
Table lock 0.000041
init 0.000043
optimizing 0.000019
statistics 0.000024
preparing 0.000022
FULLTEXT initialization 0.000066
Creating tmp table 0.000051
executing 0.000010
Copying to tmp table 78.009749
Sorting result 0.000076
Sending data 0.003781
end 0.000024
removing tmp table 0.000056
end 0.000011
end 0.000009
query end 0.000010
storing result in query cache 0.000030
freeing items 0.000023
closing tables 0.000016
logging slow query 0.000009
logging slow query 0.000008
cleaning up 0.000010
Status Tijd
starting 0.000032
checking query cache for query 0.000091
checking permissions 0.000010
checking permissions 0.000010
Opening tables 0.000026
System lock 0.000013
Table lock 0.000041
init 0.000043
optimizing 0.000019
statistics 0.000024
preparing 0.000022
FULLTEXT initialization 0.000066
Creating tmp table 0.000051
executing 0.000010
Copying to tmp table 78.009749
Sorting result 0.000076
Sending data 0.003781
end 0.000024
removing tmp table 0.000056
end 0.000011
end 0.000009
query end 0.000010
storing result in query cache 0.000030
freeing items 0.000023
closing tables 0.000016
logging slow query 0.000009
logging slow query 0.000008
cleaning up 0.000010
Gewijzigd op 01/01/1970 01:00:00 door steen
Zie hierboven voor de resultaten,,, Het verplaatsen naar een tijdelijke tabel duurt het langst, is daar wat aan te doen behalve een LIMIT toevoegen?
*bump* iemand een oplossing om 't sneller te maken? De Order By zorgt voor de tmp tabel
*bump*
*bump*
Ga eens zoeken waar die sloom gaat.
Probeer eens zonder die OR.
Probeer eens zonder die OR.
heb je al es explain gedaan ipv hier te lopen bumpen :p
EXPLAIN:
1 SIMPLE s ALL NULL NULL NULL NULL 3660 Using temporary; Using filesort
1 SIMPLE b ALL NULL NULL NULL NULL 11166 Using where
1 SIMPLE s ALL NULL NULL NULL NULL 3660 Using temporary; Using filesort
1 SIMPLE b ALL NULL NULL NULL NULL 11166 Using where
EXPLAIN EXTENDED natuurlijk, want daar ben je niet veel mee nu..
leesvoer:
http://dev.mysql.com/doc/refman/5.1/en/using-explain.html
http://dev.mysql.com/doc/refman/5.1/en/query-speed.html
leesvoer:
http://dev.mysql.com/doc/refman/5.1/en/using-explain.html
http://dev.mysql.com/doc/refman/5.1/en/query-speed.html
EXPLAIN EXTENDED geeft exact hetzelfde resultaat bij deze query
EXPLAIN EXTENDED geeft exact hetzelfde resultaat bij deze query
EXPLAIN EXTENDED geeft exact hetzelfde resultaat bij deze query
EXPLAIN EXTENDED geeft exact hetzelfde resultaat bij deze query
Gelieve Niet Bumpen::
Twee of meer keer achter elkaar in een topic posten heet bumpen. Bumpen is pas na 24 uur toegestaan en kan een reden zijn voor de admins en moderators om een topic te sluiten. Gebruik indien nodig de
knop om je tekst aan te passen.
SanThe.
knop om je tekst aan te passen.SanThe.
Gewijzigd op 01/01/1970 01:00:00 door steen
al die matches en een OR is killing voor performance.
Gewijzigd op 01/01/1970 01:00:00 door John D



