博客 / Linux/ lnmp安装MySQL中文索引插件mysqlcft提升wordpress搜索性能

lnmp安装MySQL中文索引插件mysqlcft提升wordpress搜索性能

lnmp安装MySQL中文索引插件mysqlcft提升wordpress搜索性能

背景与问题

随着 WordPress 网站数据量增长,搜索功能可能成为性能瓶颈。尤其是在使用 SELECT ... WHERE ... LIKE '%...%' 这类模糊查询时,MySQL 无法有效利用索引,需要进行全表扫描,导致数据库负载过高,影响服务器整体性能。

MySQL 在高并发连接、数据库记录数较多的情况下,SELECT ... WHERE ... LIKE '%...%' 的全文搜索方式不仅效率差,而且以通配符 % 和 _ 开头作查询时,使用不到索引,需要全表扫描,对数据库的压力也很大。MySQL 针对这一问题提供了一种全文索引解决方案,这不仅仅提高了性能和效率(因为 MySQL 对这些字段做了索引来优化搜索),而且实现了更高质量的搜索。但是,至今为止,MySQL 对中文全文索引无法正确支持。

对于中文内容的 WordPress 站点,一个可行的优化方案是使用第三方中文全文索引插件,例如 mysqlcft,来替代默认的 LIKE 搜索。

安装与配置 mysqlcft 中文全文索引插件

以下操作基于 LNMP 环境(如军哥 LNMP 一键安装包),MySQL 版本为 5.5.x。请注意,插件兼容性可能因 MySQL 版本而异,建议在测试环境先行验证。

1. 环境确认

MySQL 需为动态编译安装,以便加载动态链接库(.so 文件)。使用 LNMP 一键包安装的 MySQL 通常满足此条件。

2. 修改 MySQL 配置

编辑 MySQL 配置文件 my.cnf(通常位于 /etc/my.cnf/usr/local/mysql/etc/my.cnf),在 [mysqld] 配置段中添加以下参数:

ft_min_word_len = 1

此参数设置全文索引的最小词长度为 1 字节,以适应中文分词特点。修改后,重启 MySQL 服务使配置生效:

/etc/init.d/mysql restart
# 或
systemctl restart mysqld

3. 下载并安装 mysqlcft 插件

由于原 Google Code 项目已归档,您可能需要从其他可靠的镜像源或代码仓库获取插件。请根据您的系统架构(32位或64位)下载对应的版本。

下载后解压,得到 mysqlcft.so 文件。

4. 放置插件文件

登录 MySQL 控制台,查看插件目录:

mysql -uroot -p
SHOW VARIABLES LIKE 'plugin_dir';

将解压得到的 mysqlcft.so 文件复制到上述查询显示的插件目录中,例如:

cp mysqlcft.so /usr/local/mysql/lib/plugin/

确保文件权限允许 MySQL 进程读取。

5. 加载插件

再次登录 MySQL 控制台,执行以下命令安装插件:

INSTALL PLUGIN mysqlcft SONAME 'mysqlcft.so';

检查插件是否安装成功:

SHOW PLUGINS;

在列表中应能看到 mysqlcft 插件,且状态为 ACTIVE

注意: 如需卸载插件,请先删除所有使用该插件创建的全文索引,然后执行:UNINSTALL PLUGIN mysqlcft;

为 WordPress 数据表创建中文全文索引

安装插件后,即可为 WordPress 的核心数据表创建全文索引,以优化文章内容、标题、评论等字段的搜索。

创建全文索引命令

  • 单列全文索引:
    ALTER IGNORE TABLE `数据库名`.`表名` ADD FULLTEXT INDEX `索引名` (`字段名`) WITH PARSER mysqlcft;
  • 多列联合全文索引:
    ALTER IGNORE TABLE `数据库名`.`表名` ADD FULLTEXT INDEX `索引名` (`字段名1`, `字段名2`) WITH PARSER mysqlcft;

WordPress 核心表索引创建示例

请将以下命令中的 数据库名 替换为您的实际 WordPress 数据库名。操作前建议对数据库进行备份。

  1. 为文章表(wp_posts)创建标题和内容的联合索引:
    ALTER IGNORE TABLE `数据库名`.`wp_posts` ADD FULLTEXT INDEX `post_fulltext_idx` (`post_title`, `post_content`) WITH PARSER mysqlcft;
    此操作可能耗时较长,取决于数据量大小。

  2. 为文章元数据表(wp_postmeta)的 meta_value 字段创建索引:
    ALTER IGNORE TABLE `数据库名`.`wp_postmeta` ADD FULLTEXT INDEX `meta_fulltext_idx` (`meta_value`) WITH PARSER mysqlcft;

  3. 为评论表(wp_comments)的评论内容创建索引:
    ALTER IGNORE TABLE `数据库名`.`wp_comments` ADD FULLTEXT INDEX `comment_fulltext_idx` (`comment_content`) WITH PARSER mysqlcft;

扩展:重建索引
如果索引损坏,可以使用以下命令修复:
REPAIR TABLE `数据库名`.`表名` QUICK;

索引管理与查询

查看索引

查看指定表的索引信息:

SHOW INDEX FROM `数据库名`.`表名`;
-- 或
SHOW KEYS FROM `数据库名`.`表名`;

删除索引

DROP INDEX `索引名` ON `数据库名`.`表名`;
-- 或
ALTER TABLE `数据库名`.`表名` DROP INDEX `索引名`;

使用全文索引进行查询

创建索引后,标准的 MySQL 全文搜索查询语法即可生效。例如:

SELECT * FROM wp_posts WHERE MATCH(post_title, post_content) AGAINST('搜索关键词' IN BOOLEAN MODE);

关键点: 要让 WordPress 核心搜索功能使用新建的全文索引,通常需要修改主题文件或使用专门的搜索插件(如 Relevanssi)来替换默认的 LIKE 查询。直接修改 WordPress 核心文件不是推荐做法,因为升级会导致修改丢失。

总结与注意事项

  1. 兼容性: mysqlcft 是一个较老的插件,可能不兼容 MySQL 5.7 及以上版本。对于新版 MySQL,建议优先考虑内置的 ngram 全文解析器或专业的第三方搜索引擎(如 Elasticsearch、Sphinx)。
  2. 测试: 在生产环境应用前,务必在测试环境充分验证插件的稳定性和搜索效果。
  3. 替代方案: 如果 mysqlcft 无法满足需求,可以考虑其他方案,例如配置 Sphinx 或 Elasticsearch 作为 WordPress 的外部搜索引擎,配合相应的 WordPress 插件实现高性能搜索。
  4. 监控: 创建全文索引后,观察服务器负载和搜索响应时间,以评估优化效果。

通过为 WordPress 数据库表添加中文全文索引,可以显著提升搜索查询的效率,降低数据库 CPU 负载,从而改善网站的整体性能表现。

  1. 大神, 请接受我的膜拜, 感觉这篇文章会解决我百万数据库,查询要10秒的原因

发表评论

您的邮箱不会公开。必填项已用 * 标注。