1

私はデータセット間の結合を含むプロジェクトに取り組んでおり、任意のデータセット間の任意の結合のプレビューを許可する必要があります。これはクレイジーですが、それが楽しい理由です。これは使用面であるため、結合を指定すると、最大10行の結果をすばやく表示したいと思います。

私は、少なくともいくつかの結果行を取得するが、結合が高速でサンプリングに費用がかからないようにサンプルを十分に小さく保つように、さまざまなテーブルをサブサンプリングするさまざまな方法に基づいて実験を行ってきました。

これが私が嗅覚テストに合格した方法です。私はそれらについていくつか知りたいです:

  1. これらはどのタイプの結合またはデータセットで失敗しますか?
  2. これらのデータセットをどのように識別できますか?
  3. これらの両方が同じことで悪い場合、どのようにそれらを改善することができますか?
  4. ここに入れていない、より良いサンプリングの種類はありますか?

制限付きで副選択します。

1つのデータセットのランダムなサンプルを取得して、全体のサイズを縮小します。

SELECT col1, col2 FROM table1 JOIN
  (SELECT col1, col2 FROM table2 LIMIT #) AS sample2 
    on table1.col1 = sample2.col1
  LIMIT 10;

私はこれが好きです。なぜなら、それは簡単で、将来、どのテーブルからサンプルを取得するかについて賢くなる可能性があるからです。table1.col1がsample2.col1と等しくならない部分を選択して、結果が返されないようにすることもできます。

col1の等しい値を見つけて、それらをサンプリングします

より複雑なマルチクエリアプローチ。ここでは、結合する列を個別に選択し、結果を比較して共通の値を見つけてから、結果を共通の値に制限するサブ選択を実行します。

SELECT DISTINCT col1 FROM table1;
SELECT DISTINCT col1 FROM table2;
commonVals = intersection of above results
SELECT col1, col2 FROM table1 JOIN 
  (SELECT col1, col2 FROM table2 WHERE col1 IN(commonVals) LIMIT #) as sample2
    on table1.col1 = sample2.col1 
  LIMIT 10;

これにより、table2の優れたサンプルが得られますが、selectdistinctクエリは結合よりもコストがかかる可能性があります。個別の計算にかかる時間について何か知っていれば、この方法の方が速いかどうかを判断する方法があると思いますが、現時点では、データセットに関する知識はそれほど多くありません。

参加時に制限を叩く

これは最も簡単で、私が傾いているものです。

SELECT col1, col1 FROM table1 join table2 on table1.col1 = table2.col1 LIMIT #

結合が適切であると仮定すると、これは常にデータを返し、少なくとも大規模なケースでは高速に実行されます。

4

1 に答える 1

0

最初のアプローチの問題は、最初のテーブルの行が 2 番目のテーブルに一致しない可能性があることです。内部結合は照合を行うだけでなく、フィルタリングも行うことに注意してください。

2 番目の方法は、結合に使用されるすべての列にインデックスがある場合に機能します。次に、次のようなことを行うことで、一致する ID のリストを取得できます。

where id in (select id from table1) and id in (select id from table2) . . .

これにより初期コードが取り除かれ、かなり高速になるはずです。

3 番目の方法は、データベースの機能を最も直接的に使用する方法です。結果セットのサイズに応じて最適化する MySQL の機能に依存することになります。これは、少なくとも理論的にはそうです。

結合で使用される列のインデックスと組み合わせて、3 番目のアプローチを強くお勧めします。これには、クエリへの最小限の変更が必要です (limit句を追加するだけです)。これにより、データベースは、必要に応じて追加の最適化を行うことができます。より一般的な一連のクエリで機能します。

于 2013-02-22T21:16:44.530 に答える