web-dev-qa-db-ja.com

5,000万行で実行されるmysqlクエリの最適化

以下のクエリのパフォーマンスを最適化するためのテクニック/アドバイスはありますか?

私のニーズによると、私の平均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

任意の助けいただければ幸いです。

3

Mysqlのオンラインドキュメントに役立つヒントがあります。

http://dev.mysql.com/doc/refman/5.7/en/optimization.html

James Greenが示唆したように、索引付けについて読むことは価値があります。

また、キーワード "EXPLAIN"を使用してクエリプランを調べ、潜在的なボトルネックを見つけることもできます。これにより、クエリで使用されているインデックスが強調表示されます。クエリプランが正しいことを確認するには、データベースのインデックス統計を更新し続ける必要があります。

これがお役に立てば幸いです。何か見つけたらお知らせください。

どうもありがとう、

サイモン。

3
Simon Bosley

クエリは最新のデータのみに基づいています。水平分割を試してみてください。 MySQL 5.1 でサポートされています。

別の方法は、「水平分割」を手動で維持することです。たとえば、「SystemEventsR_archive」というテーブルを作成し、毎日以下のようにいくつかのクエリを実行できます。

REPLACE INTO SystemEventsR_archive SELECT * FROM SystemEventsR;
DELETE FROM SystemEventsR WHERE timestamp < ( NOW() - INTERVAL 1 DAY );
1
user1931858