0

を使用してクエリを実行すると、LEFT JOIN20 秒かかります。2 つのクエリに分割すると、4 秒で実行されます。ただし、ご想像のとおり、これにより結果を特定の順序で表示することが非常に難しくなります。最初のクエリの何が問題なのですか? 2 つを 1 つに結合できますか?

Table1〜400,000行あり、Table2には〜200,000行あります。

Field3は の主キーでTable2あり、 で索引付けされていTable1ます。

クエリは約 10 万行を返します。

SELECT Table1.Field1, Table2.Field4
FROM
    Table1
    LEFT JOIN
        Table2 USING (Field3)
WHERE Table1.Field1 = 'Example'

書かれているとおりにクエリを実行すると、実行に平均 20 秒かかります。しかし、 なしでクエリを実行LEFT JOINし、そのデータを取得するために 2 番目のクエリを実行すると、合計で約 4 秒ですべてが実行されます。

SELECT Table1.Field1, Table1.Field3
FROM Table1
WHERE Table1.Field1 = 'Example'

//PHP
$first = true;
while ($row = mysql_fetch_assoc($query))
{
    if (!$first)
    {
        $field3Values .= ",";   
    }
    $field3Values .= "'" . mysql_real_escape_string($row['Field3']) . "'";  
    $first = false;
}

//Now run the 2nd query
SELECT Field4
FROM People
WHERE Field3 IN (" . $field3Values . ")

編集:要求どおりEXPLAIN、最初のクエリから: ここに画像の説明を入力

4

1 に答える 1

1

ジョンと私はチャットでこれを理解しました。クエリ オプティマイザーが の適切なインデックスを選択していなかったため、単一のクエリは低速でしたTable1。クエリに追加することで、フル テーブル スキャンを実行する代わりにFORCE INDEX (Field1)、インデックス onを使用して結果をフィルター処理しました。Table1.Field1なぜ 2 つのクエリ アプローチの方が実行速度が速かったのかは完全にはわかりませんが、何らかの理由でクエリ オプティマイザーが単一のクエリではなく最初のクエリでインデックスを使用していたのではないかと推測されます。

于 2013-03-14T21:33:02.710 に答える