2016-11-30 1 views
0
# Query_time: 0.007476 Lock_time: 0.000012 Rows_sent: 4 Rows_examined: 13463 
SELECT id,name FROM items 
WHERE items_approved = 1 AND item_name LIKE '%apple%' 
ORDER BY RAND() LIMIT 4; 

ich, dass ich viele langsame Abfragen in meiner mysql-slow.log habe nur bemerkt so fange ich sie eins nach dem anderen ...meine MYSQL Verbesserung abfragt

Beginnen wir mit dieser einfach zu optimieren query:

aber die Tabelle enthält 15K Artikel, so brauche ich einen besseren Weg, um 4 zufällige Elemente zu erhalten. Die Items-Tabelle hat zwei Indizes: ein Volltext auf Name und eine primäre auf ID

in meinem E-Commerce, das Ziel ist im Grunde zu zeigen 4 zufällige Elemente, die das Wort "rot" im Namen für jede Kategorie haben (ungefähr 15 Kategorien), wenn ein Benutzer eine Seite besucht.

was ist ein besserer Ansatz dazu?

UPDATE

my.cnf wird wie dieses

log_slow_queries = /var/log/mysql/mysql-slow.log 
long_query_time = 2 
log-queries-not-using-indexes 
+0

Haben Sie welche? Indizes definiert? – BenM

+0

Weniger als 1 Sekunde ist in Ordnung. Wahrscheinlich haben Sie Ihre slow_queries auf 0 gesetzt. Versuchen Sie, sie auf eine vernünftigere Zahl zu erhöhen, damit Sie echte langsame Abfragen verfolgen können. – aynber

+1

Weniger als 1 Sekunde ist in Ordnung? Was für eine Logik ist das? – BenM

Antwort

0
SELECT id,name FROM items 
WHERE items_approved = 1 
    AND item_name LIKE '%red%' -- '% %' doesnt use index, change to FULL TEXT SEARCH 
ORDER BY RAND() 
LIMIT 4; 

prüfen MySQL Index TIPS

Wenn Sie Volltextindex haben sollte, so etwas wie versuchen:

SELECT id,name FROM items 
WHERE items_approved = 1 
    AND MATCH(item_name) 
    AGAINST('red' IN BOOLEAN MODE) 
ORDER BY RAND() 
LIMIT 4;