sql >> Databasteknik >  >> RDS >> Mysql

Mysql-prestanda på bord med 6 miljoner rader

Det du vill försäkra dig om är att frågan ENDAST kommer att använda indexet, så se till att indexet täcker alla fält du väljer. Dessutom, eftersom det är en intervallfråga inblandad, måste du ha venid först i indexet, eftersom det frågas som en konstant. Jag skulle därför skapa och indexera så här:

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

Med detta index finns all information som behövs för att slutföra frågan i indexet. Detta innebär att lagringsmotorn förhoppningsvis kan hämta informationen utan att faktiskt leta in i själva tabellen. Men MyISAM kanske inte kan göra detta, eftersom det inte lagrar data i indexens blad, så du kanske inte får den hastighetsökning du önskar. Om så är fallet, försök att skapa en kopia av tabellen och använd InnoDB-motorn på kopian. Upprepa samma steg där och se om du får en betydande hastighetsökning. InnoDB gör lagra fältvärdena i indexbladen och tillåt täckande index.

Nu ser du förhoppningsvis följande när du förklarar frågan:

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


  1. Importera hex/binär data till mysql

  2. Försöker utföra MINUS-operation i MySQL

  3. MySQL Preferred Engine – MyISAM eller InnoDB

  4. c3p0 hänger i väntan. Tillgänglig med viloläge