1

例:

テーブル 1 には 10 万件のレコードがあり、一意のインデックスを持つ varchar フィールドがあります。テーブル 2 には 100 万件のレコードがあり、多対 1 の関係で table1_id フィールドを介してテーブル 1 に関連付けられ、3 つの varchar フィールドがあり、そのうちの 1 つだけが一意です。問題のエンジンは InnoDB であるため、フルテキスト インデックスはありません。

議論のために、これらのテーブルがそれぞれ最大で 100 万レコードと 1000 万レコードに増加すると仮定します。

フォームに検索語を入力すると、使用可能な 4 つの (合計) varchar フィールドすべてで両方のテーブルを LIKE で検索し、Table1 のレコードのみを返すようにしたいので、ここでは table1.id でグループ化しています。私が疑問に思っているのは、検索する必要があるフィールドが 1 つしかなく、その 1 つのフィールドが一意であり、取得した ID を table1.id IN ({IDS }) クエリ、またはそれらを完全に結合して、データベースへのラウンドトリップを行わずにその場で検索する方が良いでしょうか?

つまり、結合を行う場合、MySQL は検索語に従って結合するのか、それとも最初に結合して後で検索するのか? つまり、1 つのクエリで両方のテーブルに対して結合と LIKE を実行した場合、最初にそれらを結合してから、一致するレコードを探しますか、それとも一致することがわかったレコードのみを結合しますか?

編集: 2 つのサンプル テーブルを作成し、いくつかのデータを偽造しました。このクエリの例は、すべてのフィールドに対する結合および LIKE 検索です。デモ目的で LIKE '%q%' を使用しましたが、実際には q は何でもかまいません。MySQL によると、偽の 100k/1mil レコードの実際の検索には 0.03 秒かかりました。ここに説明があります:http://bit.ly/PsFBxK

これは、1 つの一意のフィールドhttp://bit.ly/S06Hugで table2 だけを検索する Explain クエリです。これが実際に発生するのに、0.0135 秒かかったと MySQL は言います。

4

0 に答える 0