以下のクエリのパフォーマンスを最適化するためのテクニック/アドバイスはありますか?
私のニーズによると、私の平均dbサイズは約30ミルになります。 1日あたりの行数が1秒に1つ減るため、大きな違いが生まれます。
私のDBエンジンはinnoDBで、1 GBのRAMを搭載した1コアCPUを使用しています。
エクゼク時間:7,5秒(5,5 mil。行)
SELECT vpn_group, username, from_interface_addr_ip
FROM SystemEventsR
WHERE (timestamp > ( NOW( ) - INTERVAL 10 MINUTE ) AND
SysLogTagflag=1 AND
username !='')
GROUP BY username
エクゼク時間:88,4秒(5,7ミリオン行)
SELECT syslogtagid, DeviceReportedTime, class, definition, SystemEventsR.SysLogTag,
COUNT(id) AS Records,
explanation, action
FROM SystemEventsR,oa_syslogtags
WHERE (SystemEventsR.SysLogTag = oa_syslogtags.syslogtag AND
flagid = 1 AND DATE(timestamp) = DATE(NOW()))
GROUP BY SystemEventsR.SysLogTag
ORDER BY Records DESC
任意の助けいただければ幸いです。
Mysqlのオンラインドキュメントに役立つヒントがあります。
http://dev.mysql.com/doc/refman/5.7/en/optimization.html
James Greenが示唆したように、索引付けについて読むことは価値があります。
また、キーワード "EXPLAIN"を使用してクエリプランを調べ、潜在的なボトルネックを見つけることもできます。これにより、クエリで使用されているインデックスが強調表示されます。クエリプランが正しいことを確認するには、データベースのインデックス統計を更新し続ける必要があります。
これがお役に立てば幸いです。何か見つけたらお知らせください。
どうもありがとう、
サイモン。
クエリは最新のデータのみに基づいています。水平分割を試してみてください。 MySQL 5.1 でサポートされています。
別の方法は、「水平分割」を手動で維持することです。たとえば、「SystemEventsR_archive」というテーブルを作成し、毎日以下のようにいくつかのクエリを実行できます。
REPLACE INTO SystemEventsR_archive SELECT * FROM SystemEventsR;
DELETE FROM SystemEventsR WHERE timestamp < ( NOW() - INTERVAL 1 DAY );