如果ak
是一个单词,那么 FULLTEXT 索引将起作用(如果您调整最小单词长度,请参见下文)。
因此,使用 FULLTEXT 索引搜索“ak”将与此匹配:
- “这就是那个。”
- 'AK'
- 'AK。任何。'
- '任何。啊。
但是,它与此不匹配:
必须有单词边界才能匹配。
FULLTEXT 搜索的默认最小字长为 4 个字符。因此,您仍然无法对 'ak' 进行 FULLTEXT 搜索,因为它太短了。您可以降低最小字长设置,但最终会得到 'the'、'and' 和所有其他三个或更短的字母单词,您不想弄乱 FULLTEXT 索引。
使用 LIKE 搜索可能是您唯一可行的选择。当您使用前导通配符 ( '%ak'
) 时,MySQL 无法利用索引来定位记录。它必须扫描所有行。不过,如果您有覆盖索引,它将使用索引进行扫描。
因此,对于您的查询:
SELECT synonym_group FROM synonym WHERE name LIKE '%ak%'
如果你有一个多列、覆盖、索引 on (name, synonym_group)
,它实际上仍然会使用索引来回答查询,但不是传统意义上的。MySQL会扫描索引,一般比扫描实际表数据(表扫描)要快。另外,理想的系统有足够的 RAM 来将所有索引存储在 RAM 中,因此它只是扫描内存而不是磁盘。
因此,使用覆盖索引,行的大小将不起作用。
如果没有覆盖索引,行的大小会影响扫描速度,因为磁盘必须移动得更远。
如果您最终进行了表扫描,您将希望对表进行碎片整理,并且最好具有固定长度的行(CHAR 而不是 VARCHAR)。