ホームページ >バックエンド開発 >PHPチュートリアル >200 万レベルのデータ テーブル、結合クエリに関する問題
200 万レベルのデータ テーブル、結合クエリ問題
2 つのデータ テーブル A と B。
テーブル A と B には 2 つのフィールドがあります: EXP_CODE ,CODE;
次に、EXP_CODE フィールドが 'R8_002_XZ に等しく、EXP_CODE とは異なるレコードを検索します。次のステートメントを使用します。 2 つのテーブル EXP_CODE が数万件記録されている場合、コンピュータは基本的にフリーズします。ましてや数百万件に達した場合はなおさらです。改善方法を教えてください。
select * from a where EXP_CODE= 'R8_002_XZ ' and code not in (select code from b)
------解決策---- - ---------------
EXP_CODE= 'R8_002_XZ ' の a から * を選択し、含まれていないコード (b からコードを選択)
== = ================================================= ==
select * from a left join b on a.code=b.code
where a.EXP_CODE= 'R8_002_XZ ' and b.code is null
また会いましょうコードにインデックスはありますか? ない場合は、exp_code に
も作成します。
------解決策-----
2階の正しい解決策ですが、数百万のレコードを対象としています。データベースはまだ遅いので、limit を使用して制限できます。
------解決策---------
select * from a where exp_code= 'r8_002_xz ' およびコードが存在しません(select code from b where exp_code!= 'r8_002_xz ')
上記の構文にはいくつかの問題がある可能性がありますが、論理関係は正しいはずです。
要件: バージョン> 4.1、サブクエリをサポートします。
------解決策---------
これがご希望ですか
から * を選択してくださいa.code=b.code および a.EXP_CODE=b.EXP_CODE
で b を左結合します。ここで、a.EXP_CODE= 'R8_002 ' および b.code は null
------解決策----------------------
ネストされた選択は効率が低いため、内部結合を使用してみてください、代わりに結合を残します
------解決策-----
上記は間違っています。
select * from a where exp_code= 'r8_002_xz ' and code not in(select code from b where exp_code!= 'r8_002_xz ');
または
select * from a where exp_code= 'r8_002_xz ' and not in存在します (exp_code!= 'r8_002_xz ' および a.code=b.code からコードを選択します);
------解決策------
コード a の左結合 b から * を選択します。 =b.code および a.EXP_CODE=b.EXP_CODE および b.code は null
a にはあるが b には存在しないレコードを検索し、b の構造に従ってそれらを追加するだけで済みます。 !
お疲れ様です、私たちも一緒です!
------解決策-----ははは...遭遇しました。 ..