在CodeIgniter框架开发中,搜索功能是很多项目的核心模块,当数据量增长到一定规模后,使用传统的LIKE模糊查询会导致查询效率急剧下降,这时候引入MySQL全文索引是提升搜索性能的有效方案。

MySQL全文索引基础说明
MySQL全文索引是一种基于分词技术的索引类型,主要用于文本字段的快速检索,它会对文本内容进行分词处理,建立词与记录的映射关系,查询时直接匹配分词结果,比LIKE全表扫描效率高很多。目前MySQL的InnoDB和MyISAM引擎都支持全文索引,不过InnoDB从MySQL5.6版本开始才支持全文索引,实际开发中建议优先使用InnoDB引擎。
全文索引支持的数据类型主要有CHAR、VARCHAR、TEXT,我们可以在创建表的时候添加全文索引,也可以给已有的表添加全文索引。
创建全文索引的SQL示例
假设我们有一个文章表article,包含id、title、content字段,需要给title和content创建联合全文索引,SQL语句如下:
-- 给已有表添加全文索引
ALTER TABLE article ADD FULLTEXT INDEX ft_idx_title_content (title, content);
-- 创建表时直接添加全文索引
CREATE TABLE article (
id INT PRIMARY KEY AUTO_INCREMENT,
title VARCHAR(200) NOT NULL,
content TEXT NOT NULL,
FULLTEXT INDEX ft_idx_title_content (title, content)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CodeIgniter中配置全文索引查询
CodeIgniter的数据库类提供了灵活的查询构造器,我们可以直接在模型中使用查询构造器拼接全文索引的查询语句,也可以使用原生的SQL查询方式。下面以文章搜索场景为例,讲解两种实现方式。
方式一:使用查询构造器拼接查询
在CodeIgniter的模型文件中,我们可以封装一个搜索方法,接收搜索关键词作为参数,使用where方法拼接MATCH AGAINST语句:
<?php
class Article_model extends CI_Model {
public function __construct() {
parent::__construct();
$this->load->database();
}
/**
* 使用全文索引搜索文章
* @param string $keyword 搜索关键词
* @param int $limit 每页条数
* @param int $offset 偏移量
* @return array 搜索结果
*/
public function search_by_fulltext($keyword, $limit = 10, $offset = 0) {
// 过滤特殊字符,避免SQL注入
$keyword = $this->db->escape_str($keyword);
// 拼接MATCH AGAINST查询语句
$this->db->select('id, title, content');
$this->db->from('article');
// MATCH后面跟全文索引包含的字段,AGAINST后面跟搜索关键词
$this->db->where("MATCH(title, content) AGAINST('{$keyword}' IN NATURAL LANGUAGE MODE)");
$this->db->limit($limit, $offset);
$query = $this->db->get();
return $query->result_array();
}
}
方式二:使用原生SQL查询
如果查询逻辑比较复杂,也可以直接使用query方法执行原生SQL:
<?php
class Article_model extends CI_Model {
public function search_by_fulltext_raw($keyword, $limit = 10, $offset = 0) {
$keyword = $this->db->escape_str($keyword);
$sql = "SELECT id, title, content
FROM article
WHERE MATCH(title, content) AGAINST('{$keyword}' IN BOOLEAN MODE)
LIMIT {$offset}, {$limit}";
$query = $this->db->query($sql);
return $query->result_array();
}
}
全文索引查询模式说明
MySQL的全文索引支持多种查询模式,在CodeIgniter中可以根据需求选择不同的模式:
- 自然语言模式(IN NATURAL LANGUAGE MODE):默认模式,会把搜索关键词当作自然语言短语,返回相关度评分,适合普通搜索场景。
- 布尔模式(IN BOOLEAN MODE):支持布尔操作符,比如
+表示必须包含,-表示必须不包含,*表示通配符,适合需要精确控制匹配规则的场景。 - 查询扩展模式(IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION):会先执行一次自然语言查询,再用查询结果中的关键词做第二次查询,适合搜索结果较少时扩展匹配范围。
布尔模式使用示例
比如我们需要搜索包含CodeIgniter且不包含ThinkPHP的文章,同时MySQL关键词可以模糊匹配,查询语句如下:
SELECT id, title, content
FROM article
WHERE MATCH(title, content) AGAINST('+CodeIgniter -ThinkPHP MySQL*' IN BOOLEAN MODE);
优化注意事项
在使用CodeIgniter结合MySQL全文索引优化搜索性能时,还需要注意以下几点:
- 全文索引的最小分词长度默认是4个字符,也就是说长度小于4的关键词不会被索引,也无法匹配到结果,可以通过修改MySQL配置文件中的
ft_min_word_len参数调整,修改后需要重建索引。 - 中文分词问题,MySQL默认的全文索引分词对中文支持不好,只会按字分词,如果需要更好的中文搜索效果,可以结合中文分词插件,或者在应用层先做中文分词再存储到对应字段。
- 不要在频繁更新的表上过度使用全文索引,因为每次更新文本字段都需要更新全文索引,会影响写入性能,建议根据业务场景平衡查询和写入的需求。
- 查询时尽量指定需要的字段,不要使用
SELECT *,减少数据传输和处理的开销。
性能对比参考
我们可以通过简单的测试对比LIKE查询和全文索引查询的性能差异,假设article表有10万条数据,搜索关键词为CodeIgniter开发:
| 查询方式 | 平均响应时间 | 扫描行数 |
|---|---|---|
| LIKE模糊查询 | 1200ms | 100000行(全表扫描) |
| 全文索引自然语言模式 | 35ms | 120行(索引匹配) |
| 全文索引布尔模式 | 28ms | 85行(索引匹配) |
从对比结果可以看出,全文索引的查询效率远高于传统的LIKE模糊查询,在CodeIgniter项目中合理应用可以大幅提升搜索功能的用户体验。
CodeIgniterMySQL全文索引搜索性能优化PHP开发修改时间:2026-07-06 04:00:29