これはオンライン フォト ライブラリ用です。2 つのテーブルがあります。「写真検索」と「写真」。最初の「photoSearch」には、数列しかなく、「photoID」、「headline」、「caption」、「people」、「dateCaptured」、「keywords」など、写真の検索可能なすべてのデータが含まれています。(見出し、キャプション、人物、キーワード) に複数列の全文索引があります。2 番目のテーブル「photos」には、すべての写真データが含まれています。高さ、幅、著作権、キャプション、ID、日付など。どちらも 50 万行以上あり、見出しとキャプション フィールドは 2000 文字以上を返すことがあります。
これはクエリが現在どのように見えるかをおおよそ示しています:他の場所にありますが、近いです )
この特定のクエリはループ内でループされており、別の SQL ステートメントが実行されています...
SELECT photoID FROM photoSearch
WHERE MATCH (headline, caption, people, keywords)
AGAINST ('"&booleanSearchStr&"' IN BOOLEAN MODE)
AND dateCaptured BETWEEN '"&fromDate&"' AND '"&toDate&"';"
これは、上記のクエリの各行に対して実行される SQL ステートメントです。
SELECT photoID, setID, eventID, locationID, headline, caption, instructions, dateCaptured, dateUploaded, status, uploaderID, thumbH, thumbW, previewH, previewW, + more
FROM photos
LEFT JOIN events AS e USING (eventID)
LEFT JOIN location AS l USING (locationID)
WHERE photoID = " & photoID & ";"
テストしたところ、大きなテーブル「photos」ではなく、独自のテーブル「photoSearch」にフルテキスト インデックスを配置すると、速度がいくらか向上したように見えました。「photoSearch」テーブルは追加しませんでした。既に存在していました。これは私のアプリではありません。2 つのテーブルを結合して 2 番目のクエリを失うと、インデックス作成がすべて失われ、非常に長い時間がかかるため、結合をフルテキストで使用することはできません。これが一番手っ取り早い方法だったようです。フルテキストと結合の問題がなければ、これらの両方のクエリを既に組み合わせていたでしょう。
クエリ 1 の結果ごとにクエリ #2 を 1000 回実行するのではなく、これら 2 つのクエリを 1 つに結合して、プロセスをより効率的に実行することはできますか?