使用 MyISAM 和存储过程在 InnoDB 上进行全文搜索
找到一种快速有效的方法来对 InnoDB 表执行全文搜索可以是一个挑战。虽然 Sphinx 等工具提供了解决方案,但本文探讨了使用 MyISAM 和存储过程的纯 MySQL 方法。
挑战
一个在以下位置搜索多个字符串的简单查询由于性能缓慢和限制,使用 LIKE 语句的行可能会出现问题。
SELECT ... WHERE row LIKE '%some%' OR row LIKE '%search%' OR row LIKE '%string%'
解决方案
建议的解决方案涉及创建一个 MyISAM 全文表,该表将索引回 InnoDB 表。这允许对需要搜索的特定列(例如主题)建立索引。
数据库结构
InnoDB 表是为主要数据定义的,例如用户和线程。
create table users (...) engine=innodb; create table forums (...) engine=innodb; create table threads ( ... subject varchar(255) not null, -- column we want to search ... ) engine=innodb;
MyISAM 全文表(例如,threads_ft)提供搜索index.
create table threads_ft ( ... subject varchar(255) not null, fulltext (subject), -- fulltext index on subject ... ) engine=myisam;
存储过程
存储过程(例如,ft_search_threads)接受搜索项作为输入,并使用 MyISAM 全文索引执行搜索。然后它将结果与 InnoDB 表连接起来以检索必要的数据。
create procedure ft_search_threads ( in p_search varchar(255) ) begin ... select t.*, ... from threads_ft tft ... match(tft.subject) against (p_search in boolean mode) ... order by rank desc ... end;
示例用法
可以从 PHP 应用程序或命令行工具:
call ft_search_threads('+innodb +clustered +index');
此示例返回线程表中与搜索匹配的前 100 个结果术语“innodb 聚集索引”。
通过利用这种方法,您可以在 InnoDB 表上实现类似全文的搜索功能,而不会影响性能。它涉及创建一个专用的 MyISAM 表用于索引和编写一个存储过程来执行搜索和数据检索。
以上是如何使用MyISAM和存储过程对InnoDB表进行高效的全文搜索?的详细内容。更多信息请关注PHP中文网其他相关文章!