2016-07-26 7 views
0

Ich habe eine Mysql-Tabelle, die 2 Millionen Zeilen hat. Die Größe beträgt 600 MB.Beschleunigung langsamer Zählung in einer 2 Millionen Zeilen Tabelle

Diese Abfrage dauert 2 Sekunden. Ich weiß nicht, wie ich es beschleunigen soll. Die Tabelle befindet sich bereits in einem Myisam-Format. Ich weiß nicht, ob ich die Grenze der Langsamkeit einer Auswahlzählung erreicht habe.

SELECT COUNT(video) FROM yvideos use index (PRIMARY) WHERE rate>='70' AND tags LIKE '%;car;%' 

Dank all

+0

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

Antwort

0

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.

Verwandte Themen