0

1,100 万行を超える大きな MySql テーブルがあります。これは単なる巨大なデータ セットであり、私のタスクは特定のルールに基づいてデータセットを分析できるようにすることです。

各行は特定の に属しcategoryます。200 万の異なるカテゴリがあります。カテゴリのすべての行を取得し、それに対して操作を実行したいと考えています。

そのため、現在、次のことを行っています。

  1. 表から個別のカテゴリを選択します。
  2. 各カテゴリ: テーブルからフィールドを選択します WHERE category=category

列にインデックスが作成されていcategoryますが、実行に非常に時間がかかりますStep 2。これは主に膨大なデータセットによるものです。

別の方法として、GROUP BY 句を使用することもできますが、このような巨大なデータセットに対する GROUP BY はコストがかかる可能性があるため、特にデータセットの一部に対して分析を数回実行することを考えると、それほど高速になるかどうかはわかりません。ソートされたテーブルを永続的に保証する方法が役立ちます。

したがって、別の方法として、テーブルのみが事前に並べ替えられている場合、クエリを高速化できますcategory。これで、テーブルを行ごとに読み取り、同じ操作をはるかに高速に実行できるようになりました。これは、1 つの行のすべての行がcategory連続してフェッチされるためです。

データセット (MySql テーブル) は固定されているため、更新、削除、挿入操作は実行されません。によるデフォルトのソート順を維持する方法を確保できるようにしたいと考えていますcategory。行のデフォルトのソート順を確実にするためのトリックを誰でも提案できますか。

おそらく、すべての行を読み取って新しいテーブルに書き直すか、この順序を保証する新しい主キーを追加しますか?

4

2 に答える 2

0

カテゴリ列にインデックスが付けられていても

副次索引による索引付け? その場合、次のパフォーマンスの問題が発生する可能性があります。

  • InnoDB テーブルは常にクラスター化されており、クラスター化されたテーブルのセカンダリ インデックスでは、ダブル ルックアップが必要になる場合があります (この記事の「クラスター化の欠点」を参照してください)。
  • インデックス付きの行はあちこちに散らばっている可能性があります(インデックスはクラスタリング係数が悪い可能性があります-リンクはOracle用ですが、原則は同じです)。その場合、インデックスが実際に使用され、行の小さなサブセットのみが実際に選択されている場合でも、インデックスレンジスキャン ( など) によって多くのテーブル ページが読み込まれる可能性があります。WHERE category = whateverこれにより、範囲スキャンのパフォーマンスが損なわれる可能性があります。

セカンダリ インデックスの代わりに、InnoDB テーブルでクラスタリング キーとしても機能する自然主キーの使用を検討してください。などのプライマリ/クラスタリング キー{category, no}は、同じカテゴリの行を物理的に近づけて保持し、両方のクエリ (特に 2 番目のクエリ) を最大限に効率化します。

OTOH、セカンダリ インデックスを維持したい場合は、クエリするすべてのフィールドをカバーすることを検討してください。そうすれば、プライマリ B ツリーにまったく触れる必要がなくなります。

于 2013-01-13T16:39:09.890 に答える
0

次のようなことを行うことで、インデックス作成に関係なく、これを 1 つのステップで実行できます (疑似コード):

Declare @LastCategory int = Null
Declare @Category int

For Each Row In
Select
  @Category = Category,
  ...
From
  Table
Order By 
  Category

  If @LastCategory Is Null Or @LastCategory != @Category
    Do any "New Category Steps"
    Set @LastCategory = @Category
  End
  Process Row

End For

カテゴリのインデックスを使用すると、これは問題なく実行されると思います。パフォーマンスの問題は、各行を処理するときに何をしているかにかかっている可能性があります。

例を次に示します: http://sqlfiddle.com/#!2/e53c98/1

于 2013-01-13T16:40:36.570 に答える