Ja, es optimiert werden kann.
Erstens Sie einen Scan mit LIKE
tun, weil MySQL keinen Index mit variabler linkem Teil verwenden kann (es ist möglich, ';car;%'
, aber nicht für '%;car;%'
).
Zweitens verwendet MySQL (in den meisten Fällen) nicht mehr als einen Index für eine SELECT
. Wenn Sie also zwei separate Indizes für rate
und tags
haben, wird nur eine verwendet.
Also mit diesen Dingen zu beschäftigen ich Ratschläge: 1. Verwenden Sie einen Volltextindex für tags
Spalte 2. mit INNER JOIN
eine Abfrage mit zwei separaten Abfragen und „Klebstoff“ zur Folge ersetzen (entspricht WHERE ... AND ...
in diesem Fall) .
Also am Ende:
SELECT t1.* FROM
(SELECT * FROM yvideos WHERE rate >= 60) t1
INNER JOIN
(SELECT * FROM yvideos WHERE MATCH (tags) AGAINST ('+car +russia -usa' IN BOOLEAN MODE)) t2
USING (id);
Live example on SQLFiddle.
Führen Sie EXPLAIN
für diese Abfrage und einen Blick auf einen Plan. Jetzt gibt es keinen vollständigen Scan, alle Filterungen werden mit Indizes durchgeführt.
Für weitere Informationen über boolesche Volltextsuchen können Sie a documetation lesen.
BTW, Volltextindizes werden jetzt sowohl in InnoDB als auch in MyISAM unterstützt, sodass Sie sich für eine Engine entscheiden können.
Wird 'Rate' als numerischer Wert gespeichert? Sie könnten WHERE Rate> = 70 anstelle von WHERE Rate> = '70' versuchen, weil der numerische Vergleich schneller sein sollte. – trevor