phpbar.de logo

Mailinglisten-Archive

Optimierungen

Optimierungen

Heiko Schubert mysql_(at)_lists.phpcenter.de
Sat, 24 Mar 2001 12:48:29 GMT


(sorry, gestern hatte ich mit einem falschen Absender geschrieben - 
hoffentlich kommt die E-Mail nicht doppelt)

Hallo Mitleser,

ich arbeite an einem MySQL / PHP-Projekt, in welchem ich nach bestimmten 
Artikeln im Titel und in der Beschreibung (bis zu 1000 Zeichen) suchen 
lasse. Gelegentlich gibt es eine sehr große Ergebnismenge, so daß ich 
diese auf 5 Artikel pro Seite reduziere (LIMIT 0,5 ... LIMIT x,5). Nun 
möchte ich natürlich auch die Anzahl der Treffer anzeigen. Bisher habe 
ich das wie folgt gelöst:

SELECT count(artikel.art_id) FROM ...  WHERE ... ;

 bestimmt mir die Anzahl der Treffer. Ist die Anzahl der Treffer > 0, dann 
gibt es eine zweite Abfrage, welche mir meine gewünschten Attribute 
liefert:

SELECT ... LIMIT 0,5;
(für die erste Seite).

Nun meine Frage: 

Kann man das evtl. auf eine Anfrage reduzieren? 

Der Grund: Die Volltext-Suche im Inhalt dauert bei bestimmten Wörtern 
schon gelegentlich recht lange (1000 Treffer kommen schon mal vor). Evtl. 
kann ich ja die Antwortzeiten reduzieren ... die Beschränkung auf eine 
SQL-Abfrage wäre immerhin schon einmal etwas. Mit der Stopwortliste werde 
ich mich auch noch beschäftigen. Hat da jemand eine, die auf den 
deutschen Sprachraum zugeschnitten ist?

Weiterhin handelt es sich bei der Volltextsuche um einen einfachen JOIN, 
der auch mal über 5 Tabellen geht.

SELECT 
DISTINCT inhalt.art_id
titel_deutsch2.titel2
preis.preis_vk
preis.preis_evk1
preis.preis_evk2
FROM artikel, inhalt, titel_deutsch2, preis
WHERE MATCH inhalt.inhalt AGAINST ('$qtext')
AND titel_deutsch2.art_id = inhalt.art_id
AND artikel.art_id = inhalt.art_id
AND preis.art_id = inhalt.art_id
...
ORDER BY MATCH inhalt.inhalt AGAINST ('$qtext') DESC
<gekürzt>

Macht es Sinn erst einmal die Volltextsuche zu starten 

SELECT 
DISTINCT inhalt.art_id
FROM inhalt
WHERE MATCH inhalt.inhalt AGAINST ('$qtext')

und anschließend mit deren Ergebnismenge weiter zu arbeiten und diese 
weiter zu reduzieren? Als Ergebnismenge werden ausschließlich INT 
geliefert. Man könnte die ja in HEAP-tables zwischenspeichern ... nur 
macht das bei 1000 Treffern überhaupt noch Sinn (Speicher!)?

Bye,
	Heiko

---
*** Weitere Infos zur Mailingliste und MySQL unter http://www.4t2.com/mysql 



php::bar PHP Wiki   -   Listenarchive