Ich habe eine Abfrage, die in der MySQL-Konsole sehr schnell läuft, aber sehr langsam ist, wenn ich sie mit Rails Active Record ausführe. Dies ist die Abfrage, die gegen eine Tabelle mit 7 Millionen Datensätzen läuft:
select broker_id,count(abserror),avg(abserror) from fc_estimates where ( fpe > '2000-05-28') and ( fpe < '2003-06-30') group by broker_id order by broker_id;
Das dauert 3 Minuten.
Dann führe ich diese Abfrage in Rails Active Record aus:
stats = Estimate. select([ "broker_id", "count(abserror) as abserror_count", "avg(abserror) as abserror_avg" ]). where( :fpe => ((fpe-1098).to_date..(fpe+30).to_date)) group("broker_id"). order("broker_id")
die folgendes SQL generiert (Ausgabe von to_sql)
SELECT broker_id, count(abserror) as abserror_count, avg(abserror) as abserror_avg FROM fc_estimates
WHERE (fc_estimates
.fpe
BETWEEN '2000-05-28' AND '2003-06-30') GROUP BY broker_id ORDER BY broker_id
und dauert 1 Stunde und 40 Minuten, um ausgeführt zu werden. Es gibt 250 Datensätze zurück.
Ich benutze Windows 7, MySQL 5.1, Ruby 1.8.7, ActiveRecord 3.04, mysql2 gem 0.2.6
Es handelt sich um InnoDB-Tabellen und ich habe die innodb_buffer_pool_size auf 480M erhöht (was bei anderen Abfragen geholfen hat). Eine Sache, die ich beobachte, ist, dass der MySQL-Speicherverbrauch auf etwa 500M ansteigt und dann eine Menge Festplattenaktivität (Seitenaustausch) stattfindet. Das erklärt etwas.
Aber warum erhalte ich immer noch so schlechte Leistung, wenn die gleiche Abfrage in der MySQL-Konsole nur 3 Minuten dauert? Danke für alle Ideen oder jemanden, der eine ähnliche Situation erlebt hat.
UPDATE 2011-02-24
Ich habe auf MySQL 5.5 aktualisiert. Jetzt läuft meine Abfrage in der Konsole in etwa 1min40sek. Und mit ActiveRecords dauert es etwa 40 Minuten.