Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MySQL-Leistung in einer Tabelle mit 6 Millionen Zeilen

Was Sie sicherstellen möchten, ist, dass die Abfrage NUR den Index verwendet, also stellen Sie sicher, dass der Index alle Felder abdeckt, die Sie auswählen. Da es sich um eine Bereichsabfrage handelt, müssen Sie die venid zuerst im Index haben, da sie als Konstante abgefragt wird. Ich würde daher so erstellen und indizieren:

ALTER TABLE events ADD INDEX indexNameHere (venid, date, time);

Bei diesem Index befinden sich alle Informationen, die zum Abschließen der Abfrage erforderlich sind, im Index. Das bedeutet, dass die Speicher-Engine hoffentlich in der Lage ist, die Informationen abzurufen, ohne tatsächlich in der Tabelle selbst zu suchen. Allerdings ist MyISAM möglicherweise nicht in der Lage, dies zu tun, da es die Daten nicht in den Blättern der Indizes speichert, sodass Sie möglicherweise nicht die gewünschte Geschwindigkeitssteigerung erhalten. Versuchen Sie in diesem Fall, eine Kopie der Tabelle zu erstellen, und verwenden Sie die InnoDB-Engine für die Kopie. Wiederholen Sie dort die gleichen Schritte und sehen Sie, ob Sie eine signifikante Geschwindigkeitssteigerung erhalten. InnoDB tut es Feldwerte in den Indexblättern speichern und abdeckende Indizes zulassen.

Nun sehen Sie hoffentlich Folgendes, wenn Sie die Abfrage erläutern:

mysql> EXPLAIN SELECT date, time FROM events WHERE venid='47975' AND date>='2009-07-11' ORDER BY date;

id  select_type table  type  possible_keys        key       [..]  Extra
1   SIMPLE   events range date_idx, indexNameHere indexNameHere   Using index, Using where