1

我有一个包含超过五百万条记录的大型数据库,这个数据库有三个字段(ID、名称、文本),该字段ID有一个主键,该字段name有一个FULLTEXT索引。

我想为我的网站创建一个在字段中搜索的搜索引擎name,我使用FULLTEXT索引但缺点是不接受少于四个字符的关键字,所以我决定删除它并INDEX KEY在字段上放一个name并使用以下内容要求:

EXPLAIN SELECT * FROM table WHERE locate ('search', name) > 0;

问题是这个应用程序没有使用索引 KEY 字段名称,但是这个请求:

EXPLAIN SELECT name FROM table WHERE locate ('search', name) > 0;

使用INDEX KEY,不知道为什么当我选择所有字段时 MYSQL 不使用索引。

在您看来如何解决这个问题,如果可能的话,一个更好的选择。

4

1 回答 1

1

您可以在 mysql 配置中设置全文索引的最小字符数。我现在不在我的电脑上找一个例子,但是这个页面可能会对你有所帮助:http: //dev.mysql.com/doc/refman/5.1/en/fulltext-fine-tuning.html

更新:

回到我的电脑。所以关于mysql为什么会在SELECT name FROM table WHERE locate ('search', name) > 0;语句上使用索引就很简单了。当您在名称字段上创建索引时,索引包含实际名称字段,即名称字段的值,因此当您仅选择名称字段时,mysql 可以进行搜索并从索引中检索所需的所有数据。因此,在这种情况下,mysql 必须执行一项操作来检索与索引中的搜索值匹配的数据并返回它们。

然而SELECT name FROM table WHERE locate ('search', name) > 0;,也需要其他数据字段。由于只有名称字段的值存储在索引中,mysql 将不得不读取索引然后读取表来检索其他字段。所以在这种情况下,mysql必须匹配索引中的值,然后在表上找到值,然后返回它们。这意味着 mysql 必须执行 2 次操作,与之前的场景相比,这是两倍的工作量。

由于 500 万行仍然非常小,因此 mysql 循环遍历表并检索行可能更快。当您添加更多行时,一旦循环遍历表的成本高于读取索引然后查找表上的值的成本,mysql 可能会开始使用索引。

希望这是有道理的。

于 2012-08-14T08:32:39.090 回答