我在一台 Ubuntu 10.04 服务器上的 MySQL 数据库中有一个 MyISAM 表,该服务器具有 256mb RAM。最大数据包大小为 32mb。该表有 150,000 行。
该表有三列,其中两列是 TEXT 类型。我对这两列都创建了 FULLTEXT 索引;一个索引的基数等于表中的行数,另一个索引的基数只有表中行数的三分之一。
这是为什么?
低基数索引是否意味着 MATCH() AGAINST() 将错失命中?(似乎是这样。)如果是这样,我可以在某些地方增加内存限制来增加索引的基数吗?
答案1
如果您认为有问题,请使用实用程序myisam_ftdump
检查索引。基数取决于 TEXT 字段中有多少个不同的单词。
您没有指定字段的内容,因此答案不是唯一的。
另外,如果您尚未创建/etc/mystopwords
文件,MySQL 将使用其内置的停用词列表。此列表取决于排序规则,如果列的排序规则与默认排序规则不同,则可能会给出错误结果。
甚至查询的类型也可能产生奇怪的结果。
总之,除非您知道索引中缺少某些内容,否则基数就不是问题。
答案2
我可以增加内存限制来增加索引的基数吗
嗯?不。基数是数据中唯一值的数量除以表中值的总数量 - 更改可用内存量不会改变您的数据。
正如 AndrewQ 所说,使用停用词来更有选择地选择要索引的内容会对基数度量产生很大的影响 - 从而优化查询,然而 FULLTEXT 索引对于文本搜索来说是一个非常生硬的工具。
当然,这里没有太多的内存(我认为这是一个虚拟机),这会影响整体性能。