4 messages in com.mysql.lists.mysql-deRe: Fragen zur Optimierung einer Abfage| From | Sent On | Attachments |
|---|---|---|
| Andreas Lange | 10 Dec 2004 02:42 | |
| Sebastian Mendel | 10 Dec 2004 08:31 | |
| Andreas Lange | 13 Dec 2004 05:48 | |
| Sebastian Mendel | 13 Dec 2004 06:46 |
| Subject: | Re: Fragen zur Optimierung einer Abfage![]() |
|---|---|
| From: | Sebastian Mendel (lis...@sebastianmendel.de) |
| Date: | 12/10/2004 08:31:10 AM |
| List: | com.mysql.lists.mysql-de |
Andreas Lange wrote:
Hi,
Ich möchte eine Tabelle mit Schlagworten ausstatten, über die ich bequem Datensätze selektieren kann, die entsprechende Schlagworte enthalten. Damit das ganze auch bei grossen Datenmengen gut funktioniert habe ich diverse Ansätze auf Ihre Geschwindigkeit geprüft und mittels EXPLAIN die Abfrage geprüft. Dabei ist mir etwas seltsames aufgefallen.
Struktur: CREATE TABLE `data` ( `id` int(11) NOT NULL auto_increment, `description` text NOT NULL, `keywords` text NOT NULL, `created` timestamp(14) NOT NULL default '00000000000000', PRIMARY KEY (`id`), KEY `created` (`created`), FULLTEXT KEY `keywords` (`keywords`) ) TYPE=MyISAM
60000 Testdatensätze wurden erstellt.
Variante 1 mit FULLTEXT Index:
------------------------------ EXPLAIN SELECT * FROM `data` WHERE MATCH (keywords) AGAINST ('+politik +sport' IN BOOLEAN MODE) ORDER BY created DESC LIMIT 50 , 50
Using where; Using filesort
Variante 2 mit LIKE: EXPLAIN SELECT * FROM `data` WHERE keywords LIKE "%politik%" AND keywords LIKE "%sport%" ORDER BY created DESC LIMIT 50 , 50 Using where
Witzigerweise ist die LIKE Variante auch noch schneller als die MATCH AGAINST, wenn bei beiden Abfragen das LIMIT und ORDER BY weggelassen wird und dann entsprechend beide Abfage kein filesort mehr benutzen.
weil MySQL nur einen Index verwenden kann ... entweder den Volltext-Index oder den `created`-Index
Kennt jemand dises Verhalten und hat einen Tipp zur Optimierung? Gibt es ein anderes Verfahren um Datensätze via Keywords zu selektieren (AND und OR sollen möglich sein)?
Eine Abfragezeit > 1 sec halte ich aber für inakzeptabel. Deswegen der ganze Aufwand ;-).
Wie schnell sind sie denn jetzt? Welche MySQL-Version?
Ich bin für jeden Hinweis dankbar.
Also wenn ich die Volltext-Suche verwenden würde dann würde ich die auch gleich auf den richtigen Text anwenden und nicht auf die Schlagworte.
Wenn ich Schlagworte verwenden würde dann mit einer Extra-Tabelle
Schlagwort id | wort
--------- 1 | politik 2 | sport
text_schlagwort text_id | schlagwort_id
----------------------- 1 | 1 1 | 2 2 | 1
-- Sebastian Mendel
www.sebastianmendel.de www.warzonez.de www.tekkno4u.de www.nofetish.com www.sf.net/projects/phpdatetime www.sf.net/projects/phptimesheet




