15

Web サイトの検索機能を作成しようとしていますが、次のクエリを使用して、MySQL 一時テーブルを使用してデータ入力を処理するアプローチを決定しました。

CREATE TEMPORARY TABLE `patternmatch`
  (`pattern` VARCHAR(".strlen($queryLengthHere)."))

INSERT INTO `patternmatch` VALUES ".$someValues

$someValuesレイアウトを含むデータのセット、('some', 'search', 'query')または基本的にユーザーが検索したものはどこにありますか。images次に、テーブル内のデータに基づいてメイン テーブルを次のpatternmatchように検索します。

SELECT images.* FROM images JOIN patternmatch ON (images.name LIKE patternmatch.pattern)

次に、各結果が入力とどの程度一致しているかに基づいてヒューリスティックまたはスコアリング システムを適用し、そのヒューリスティックなどによって結果を表示します。

私が疑問に思っているのは、一時テーブルの作成に必要なオーバーヘッドはどれくらいですか? それらはセッション内にのみ存在し、セッションが終了するとすぐに削除されることは理解していますが、1 秒あたり数十万回の検索がある場合、どのようなパフォーマンスの問題が発生する可能性がありますか? 検索機能を実装するより良い方法はありますか?

4

3 に答える 3

1

あなたが与えるコードから、tmpテーブルは必要ないと思いますし、FULLTEXT検索も必要ありません。しかし... tmp テーブルのパフォーマンスについて:

tmp テーブルの作成/クリーンアップはトランザクション ログに書き込まれないため、OS が関連する I/O を実行するのは比較的迅速です。一時テーブルが小さくて寿命が短く、OS で使用できるバッファがたくさんある場合、ディスクは実際には触れられません。とにかくそうなると思うなら、SSDドライブを手に入れて、RAMを増やしてください。

しかし、 1 秒間に数十万回の検索が行われていると現実的に考えている場合は、大規模なエンジニアリング プロジェクトが手元にあることになります。なぜそうしないのですか:

select images.* from images where name in ('some', 'search', 'query')

?

于 2013-09-28T04:33:48.027 に答える