1

2つのテーブルがあります。1つは300万行、もう1つは200,000行です。小さい方の特定の行のすべての値が大きい方の行に存在するかどうかを確認したいのですが、存在しない場合は、それらを認識できるようにマークを付けます。それらにいくつかの作業を行います。

これまでに試した、

1)SELECT EXISTS(SELECT 1 FROM table_bigger WHERE some_condition in table_smaller);

2)$something = SELECT somthing FROM 'table_smaller'

次に、PHP$somethingの「」を使用して、より大きなテーブルにが存在するかどうかを確認しますselect count(*) from bigger_table where something="$something";

どちらの方法も、完了するまでに少なくとも1日かかります。このようなテーブルを比較する必要があり、結果が得られて再び作業を開始するのを待つ必要があります。このように比較するための最良の方法と最速の方法は何でしょうか。

どんな助けでも感謝します。

4

1 に答える 1

0

テーブルを直接比較することもできますが、これを行うと、両方のテーブルの完全なテーブル スキャンが発生します。テーブルのスキャンにかかる時間を最小限に抑えるために、比較する特定の列にインデックスがあることを確認してください。

以下のクエリには、存在しない行が含まれます。(これを Redis にキャッシュしますか?) PHP で必要な処理を行い、結果に基づいて必要なクエリ/手順を構築します。

table_small に一致する値を持たない table_large から行を取得する

SELECT field_large FROM table_large WHERE field_large NOT IN (SELECT field_small FROM table_small)

結果の値は 2 と 3 になります。

上記の例のテーブル構造の例

CREATE TABLE IF NOT EXISTS `table_large` (
    `field_large` int(1) unsigned NOT NULL AUTO_INCREMENT,
    PRIMARY KEY (`field_large`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=4 ;

CREATE TABLE IF NOT EXISTS `table_small` (
    `field_small` int(1) unsigned NOT NULL AUTO_INCREMENT,
    PRIMARY KEY (`field_small`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ;

INSERT INTO `table_large` (`field_large`) VALUES (1), (2), (3);
INSERT INTO `table_small` (`field_small`) VALUES (1);
于 2012-11-15T04:37:46.940 に答える