2016-05-12 5 views
1

私は仮想通貨システムを構築しています。リアルマネーに位置するため、データの正確な保持は非常に重要な目標です。ユーザーウォレットが固定金額(「金額」)を持たないように通貨を構築しています。むしろ、それらはそのウォレットとの間のすべてのトランザクションのネットです。ビットコインのようなものです。インデックスはMySQLの集計ルックアップ速度をどのように改善しますか?

したがって、私がウォレットの金額を計算している場合、私のMySQLクエリは次のようになります。

SELECT (
    SELECT IFNULL(SUM(`tx`.`amount`), 0) 
    FROM `transactions` AS `tx` 
    WHERE `tx`.`to_wallet_id` = 5 
) - (
    SELECT IFNULL(SUM(`tx`.`amount`), 0) 
    FROM `transactions` AS `tx` 
    WHERE `tx`.`from_wallet_id` = 5 
) AS `net` 

このクエリは、向かってすべてのトランザクションため財布からのすべてのトランザクション減算財布をSUM()の集計データを使用してnet値を構築します。最終的な値は、ウォレットに現在含まれている金額を表します。

簡潔に言えば、私はを知りたいのですが、これらのクエリが非常に速く、可能な限りスケーリングできるようにテーブルを最適化する方法を知りたいと思います。

私は[from_wallet_id, amount][to_wallet_id, amount]というインデックスを付けるべきですが、私は非常に不確実です。

答えて

1

私は、次の操作を実行することをお勧め:

  • フィールドがNULL可能でない量を確認します。デフォルト値として0を設定します。
  • あなたの考えに基づいてインデックスを作成してください([from_wallet_id, amount]および[to_wallet_id, amount])。 atでは、インデックスから必要なすべてのデータを取得するクエリを実行できます。

    • ディバイド2一部のトランザクションテーブル:IN_TRANSACTIONと
    • out_transactionは別のテーブルと更新に集計値を保持し、それが解決しない場合は

    は、次のオプションを考えることができますその変更後。

関連する問題