InnoDB での全文検索: 代替アプローチ
全文検索は MyISAM テーブルでネイティブにサポートされていますが、InnoDB ユーザーは次のような問題に直面する可能性があります。同様の機能を実装しようとする場合の制限。この課題に対処するために、MyISAM フルテキスト テーブルを利用して InnoDB データベースにインデックスを作成するという興味深いソリューションが登場しました。
InnoDB テーブルの作成
最初のステップこれには、必要な InnoDB テーブルの確立が含まれます。これらのテーブルは、コア データ リポジトリとして機能します。たとえば、次のスキーマを考えてみましょう。
CREATE TABLE users (...) ENGINE=InnoDB; CREATE TABLE forums (...) ENGINE=InnoDB; CREATE TABLE threads ( forum_id SMALLINT UNSIGNED NOT NULL, thread_id INT UNSIGNED NOT NULL DEFAULT 0, user_id INT UNSIGNED NOT NULL, subject VARCHAR(255) NOT NULL, created_date DATETIME NOT NULL, next_reply_id INT UNSIGNED NOT NULL DEFAULT 0, view_count INT UNSIGNED NOT NULL DEFAULT 0, PRIMARY KEY (forum_id, thread_id) ) ENGINE=InnoDB;
フルテキスト テーブルの確立
次に、フルテキスト インデックス作成専用の MyISAM テーブルを作成します。このテーブルは、指定された InnoDB テーブル フィールドのインデックス付けを容易にします。
CREATE TABLE threads_ft ( forum_id SMALLINT UNSIGNED NOT NULL, thread_id INT UNSIGNED NOT NULL DEFAULT 0, subject VARCHAR(255) NOT NULL, FULLTEXT (subject), PRIMARY KEY (forum_id, thread_id) ) ENGINE=MyISAM;
テーブル データの保守
InnoDB テーブルと MyISAM テーブル間の同期を確保するには、更新メソッドを実装します。全文テーブル。これは、トリガーまたは夜間のバッチ プロセスを通じて実現できます。
検索用のストアド プロシージャ
全文のような検索機能を容易にするには、MySQL 内にストアド プロシージャを作成します。 。このプロシージャは、MyISAM テーブルをクエリし、指定された検索語に基づいて結果をフィルタリングし、最も関連性の高い一致を返します。
DELIMITER # CREATE PROCEDURE ft_search_threads ( IN p_search VARCHAR(255) ) BEGIN SELECT t.*, f.title AS forum_title, u.username, MATCH(tft.subject) AGAINST (p_search IN BOOLEAN MODE) AS rank FROM threads_ft tft INNER JOIN threads t ON tft.forum_id = t.forum_id AND tft.thread_id = t.thread_id INNER JOIN forums f ON t.forum_id = f.forum_id INNER JOIN users u ON t.user_id = u.user_id WHERE MATCH(tft.subject) AGAINST (p_search IN BOOLEAN MODE) ORDER BY rank DESC LIMIT 100; END;
このストアド プロシージャを呼び出して検索語を指定すると、ユーザーは関連する結果を取得できます。
このアプローチは、InnoDB テーブル内にフルテキストのような検索機能を実装するための実行可能な代替手段を提供し、InnoDB と MyISAM の両方の長所を活用します。エンジン。
以上がインデックス作成に MyISAM を使用して InnoDB テーブルに全文検索を実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。