mysql全文索引用于 MATCH() AGAINST 但不用于 =

Posted

技术标签:

【中文标题】mysql全文索引用于 MATCH() AGAINST 但不用于 =【英文标题】:mysql fulltext index is used for MATCH() AGAINST but not for = 【发布时间】:2011-07-03 11:04:19 【问题描述】:

我的表 xm_c 是这样创建的:

创建表`xm_c`( `category_id` char(16) NOT NULL default '', `label` char(64) NOT NULL default '', `flags` smallint(5) 无符号默认 NULL, `d0` 日期默认 NULL, `d1` 日期默认 NULL, `ct` int(6) 无符号默认 NULL, `t_update` 时间戳 NOT NULL 默认 CURRENT_TIMESTAMP 更新 CURRENT_TIMESTAMP, 主键(`category_id`), **全文键`标签`(`标签`)** ) 引擎=MyISAM 默认字符集=latin1 DELAY_KEY_WRITE=1;

以下查询中未使用 FULLTEXT 索引:select * from xm_c where label = 'TomCruise';

这里使用的地方:select * from xm_c where MATCH(label) AGAINST('TomCruise');


mysql> 解释 select * from xm_c where MATCH(label) AGAINST('TomCruise'); > 编号 |选择类型 |表|类型 |可能的键 |关键 | key_len |参考 |行 |额外的 **1 |简单 | xm_c |全文 |标签 |标签 | 0 | | 1 |使用哪里** mysql> 解释 select * from xm_c where label = 'TomCruise'; > 身份证 |选择类型 |表|类型 |可能的键 |关键 | key_len |参考 |行 |额外的 **1 |简单 | xm_c |全部 |标签 |空 |空 |空 | 5673360 |使用哪里**

有人能解释一下吗?不应该在两个查询中都使用 INDEX 吗? 使用 FULLTEXT INDICES 有语法限制吗?

【问题讨论】:

【参考方案1】:

全文索引只能用于MATCH() ... AGAINST 操作。 = 运算符非常不同,与 fts 无关,它只是不能使用这种类型的索引。有关 fts 的更多信息,请访问manual。

马用马蹄铁,汽车用轮胎。两者都可以将您从 A 带到 B。

【讨论】:

感谢您的回答。据我了解,为一列或一组列创建索引以实现更快的搜索。那么是否应该将相应列的索引用于涉及该列的任何搜索? 不,因为全文索引将文本拆分为单词,这意味着匹配一个单词(被视为文本的一部分),而不是匹配实际文本以检查它是否相等(如在整个文本中)...您的整个文本和单词相同的情况只是一个极端情况,计划是普遍制定的

以上是关于mysql全文索引用于 MATCH() AGAINST 但不用于 =的主要内容,如果未能解决你的问题,请参考以下文章

MYSQL模糊查询优化(使用全文索引进行左右模糊查询) match() against ()的简单使用以及介绍

MySQL之索引

mysql 全文索引限制

MySQL全文索引 FULLTEXT索引和like的区别

查询中使用全文索引

Mysql利用match...against进行全文检索