2012-04-10 13 views
1

ich die folgende Abfrage leite und wie ich es ändern, dauert es noch knapp 5 Sekunden zu laufen, was völlig inakzeptabel ist ...Mysql Tabelle oder Abfrage Optimierung

Die Abfrage:

SELECT cat1, cat2, cat3, PRid, title, genre, artist, author, actors, imageURL, 
lowprice, highprice, prodcatID, description 
from products 
where title like '%' AND imageURL <> '' AND cat1 = 'Clothing and accessories' 
order by userrating desc 
limit 500 

I habe versucht das "like%" herauszunehmen, das "imageURl <> ''" aber immer noch das selbe herausnehmend. Ich habe versucht, nur 1 colum zurückzugeben, immer noch das gleiche.

Ich habe Indizes für fast jede Spalte in der Tabelle, sicherlich alle Spalten in der Abfrage erwähnt.

Dies ist im Grunde für eine Kategorie Auflistung. Wenn ich eine Volltextsuche nach etwas in der Titelspalte mit einem Volltextindex durchführe, dauert es weniger als eine Sekunde.

Sollte ich einen weiteren Volltextindex zur Spalte cat1 hinzufügen und den Abfragewinkel auf "Match gegen" für diese Spalte ändern?

Erwarte ich zu viel?

Die Tabelle hat knapp 3 Millionen Zeilen.

+0

können Sie uns das Tabellenschema zeigen – amd

+0

3 Mil Row-Tabelle und Index auf fast jeder Spalte .. das ist einfach nicht gut. –

Antwort

1

Sie sagten, Sie hätten einen Index für jede Spalte. Haben Sie einen Index wie?

alter table products add index (cat1, userrating) 

Wenn Sie nicht, versuchen Sie es. Führen Sie diese Abfrage aus und lassen Sie mich wissen, ob sie schneller ausgeführt wird.

Auch ich nehme an, dass Sie tatsächlich eine Art Filter anstelle der % auf den Titel, Feld, richtig?

+1

Es ist immer noch nicht brillant, aber Schnitt mehr als halbiert - danke dafür! –

1

Sie sollten lieber die cat1 als eine ganze Zahl, dann eine Zeichenfolge in diesen 3 Millionen Zeilen. Sie müssen auch korrekt indizieren. Wenn die Indexierung aller Spalten nur verbessert würde, wäre dies eine Standardfunktion des Systems.

Abgesehen davon tut title LIKE '%' nichts. Ich nehme an, dass Sie es verwenden, um zu suchen, so wird es `title LIKE 'search%'

Verwenden Sie irgendeine Art von Framework, um das zu holen? Wenn Sie 500 Zeilen mit vielen Spalten erhalten, kann das System erschöpft sein, wenn Ihr Framework dies in einem großen Array speichert. Es kann wahrscheinlich nicht der Fall sein, aber:
Versuchen Sie, einen gewöhnlichen $query = mysql_query() und while($row = mysql_fetch_object($query)) zu laufen.

0

Ich schlage vor, einen Index mit den abgefragten Spalten hinzuzufügen: title, imageURL und cat1. Zweite Verbesserung: Verwenden Sie den SQL-Server-Cache, wird es tödlich die Geschwindigkeit verbessern. Letzte Verbesserung: Wenn Sie immer so fragen, ändern sich nur die Werte, dann verwenden Sie vorbereitete Anweisungen.

0

Nun, ich bin mir ziemlich sicher, dass eine % als erstes Zeichen in einer LIKE Klausel, gibt Ihnen eine vollständige Tabelle Scan für diese Spalte (in Ihrem Fall haben Sie nicht diese vollständige Tabelle Scan ausgeführt, weil Sie bereits einschränken Klauseln in der AND Klausel). Neben versuchen, einen Index auf cat1 Spalte hinzuzufügen. Versuchen Sie auch, andere Kriterien zu Ihrer Abfrage hinzuzufügen, um die Größe des Datasets zu reduzieren - Ihr Arbeitsdatensatz (die Anzahl der Zeilen, die Ihrer Abfrage entsprechen, ohne die LIMIT-Klausel) könnte ebenfalls zu groß sein.