0

私は12のテーブルから2つのテーブルを持っており、これらの2つのテーブルには数百万のレコードがあり、これらのテーブルからデータを取得すると、はるかに時間がかかります。インデックス作成について聞いたことがありますが、ここで使用できる適切なアプローチではないと思います。毎回、レコードの2〜3列ではなく、レコード全体をフェッチする必要があるためです。インデックスも適用しましたが、レコード全体を取得したため、インデックスを使用しない場合よりも実行時間が長くなりました。

それで、ここで使用できる正しいアプローチは何でしょうか?

4

2 に答える 2

1

私は自分の議論をOracleに基づいていますが、同様の原則がおそらく他のRDBMSにも当てはまります。使用したシステムで質問にタグを付けてください。

インデックス付けの場合、列数はほとんど関係ありません。さらに重要なのは行数です。しかし、私はあなたがそれらのすべてまたはほとんどすべても必要としていると思います。この場合、インデックス作成は、実行する作業の量を減らすことなく、プロセスに別のステップを追加するだけなので、役に立ちません。

つまり、あなたがしているように見えるのは、大規模なテーブルスキャンです。これらは通常、キャッシュされません。これは、基本的に、そこに格納されている他のすべての有用なデータからキャッシュ全体をフラッシュするためです。したがって、この種のデータを選択するたびに、ディスクからスクラッチする必要があり、おそらくそれを有線で送信する必要があります。これには時間がかかるはずです。

あなたが説明していることから、おそらく最良のアプローチは、データをアプリケーションのできるだけ近くにキャッシュすることによって、ディスクの読み取りとネットワークトラフィックを削減することです。おそらくアプリケーションの一部として、アプリケーションのマシンにキャッシュを設定してみてください。データを一度読み取り、キャッシュに入れて、後で読み取ります。インメモリデータベースを使用すると、SQLベースのアクセスパスを維持できます。

おそらく、誰かがキャッシュを使用しようとする前に、バックグラウンドでキャッシュを埋めようとします。

もちろん、これはかなりのメモリを消費するので、これが実行可能かどうかを判断する必要があります。

2番目のアプローチは、キャ​​ッシュ設定を調整して、データベースがそれらのテーブルをメモリにキャッシュするようにすることです。ただし、これはデータベース全体のパフォーマンスに影響を与え、プラスの方法ではないことに注意してください。

3番目のオプションは、処理ロジックをデータベースに移動することです。ディスクI/Oの量​​を減らすことはできませんが、少なくともネットワークをループから外すことができます(これが問題の一部であると想定しています)

于 2012-08-18T06:20:14.003 に答える
0

あなたが物事を試すことができるいくつかの方法があります:-

  1. データベースのクエリキャッシュサイズを有効化/増加します。
  2. アプリケーションレベルでmemcachedを使用すると、パフォーマンスが向上します(確かに)。
  3. クエリを微調整して最高のパフォーマンスを実現し、最高のインデックスを構成します。

それが役に立てば幸い。3つすべてをMySQLデータベース(django(python)アプリケーション)でテストしましたが、良好な結果が得られました。

于 2012-08-18T06:05:42.887 に答える