ホームページ >データベース >mysql チュートリアル >InnoDB テーブルは外部ツールなしで全文検索機能を利用できますか?
InnoDB は全文検索のような機能を利用できますか?
複数の検索文字列を検索する場合、複数の LIKE 演算子を使用した単純なクエリは非効率になる可能性があります。 Sphinx などの外部ツールを利用せずに InnoDB テーブルでこの問題を解決するには、MyISAM フルテキスト テーブルを採用して 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, -- Desired search field 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) -- Composite clustered PK index ) ENGINE=INNODB;
次に、 MyISAM を使用した全文検索テーブル:
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), -- Fulltext index on subject PRIMARY KEY (forum_id, thread_id) -- Composite non-clustered index ) ENGINE=MYISAM;
検索ストアド プロシージャ
最後に、全文検索用のストアド プロシージャを作成します:
DROP PROCEDURE IF EXISTS ft_search_threads; 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; CALL ft_search_threads('+innodb +clustered +index');
これらの変更により、外部ツールに頼ることなく、InnoDB テーブルにフルテキストのような検索機能を効果的に実装できます。解決策。
以上がInnoDB テーブルは外部ツールなしで全文検索機能を利用できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。