sql >> データベース >  >> RDS >> Mysql

MySQLSUMクエリは非常に遅い

    (はい、別のを追加します 答え。正当化:根本的な問題に別の方法で対処します。)

    根本的な問題は、SUM(amount)などのさまざまな統計情報から派生する「トランザクション」テーブルが増え続けていることです。 。このパフォーマンスは、テーブルが大きくなるにつれて悪化するだけです。

    この回答の基礎は、「履歴」と「現在」の2つの方法でデータを確認することです。 Transactions 歴史です。新しいテーブルはCurrentになります 各ユーザーの合計。しかし、私はそれを行うための複数の方法を見ています。答えを得るために773K行を追加しないように、それぞれに何らかの形式の小計が含まれます。

    • 従来の銀行の方法...毎晩、その日のTransactionsを集計します それらをCurrentに追加します 。
    • マテリアライズドビューの方法...行がTransactionsに追加されるたび 、Currentをインクリメントします 。
    • ハイブリッド:毎日の小計を「要約テーブル」に保持します。これらの小計を合計して、SUMを取得します 昨夜まで。

    要約表に関する私のブログでの詳細な議論

    バンキングまたはハイブリッド方式の最新の残高は少し注意が必要です:

    1. 昨夜の金額を取得する
    2. 日中に発生したトランザクションを追加します。

    どのアプローチもたくさん ユーザーの773K行すべてをスキャンするよりも高速ですが、コードはより複雑になります。



    1. PostgreSQLのシリアル疑似データ型の概要

    2. PostgreSQLの「エラー:各INTERSECTクエリには同じ数の列が必要」を修正しました

    3. MySQLの結果文字列から変数または事前定義されたCONSTANTの値をPHPで出力します

    4. AWSRDSMySql-「公開」を設定した後にアクセスを許可する方法