2012-08-14 96 views
1

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

我想为我的网站,在该领域name寻求,我用FULLTEXT指数但缺点不接受少于四个字符的关键字搜索引擎,所以我决定将其删除,并把INDEX KEY在球场上name并使用以下要求:

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

的问题是,这个应用程序不使用索引键的字段名称, 但这一要求:

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

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

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

+0

为什么你不使用MATCH()...对您的全文搜索进行反击? https://dev.mysql.com/doc/refman/5.5/en/fulltext-search.html#function_match – kommradHomer 2012-08-14 08:28:00

回答

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可能会开始使用索引。

希望是有道理的。

+0

谢谢你的一切,我想我理解你说的话,我想我必须将全文索引改为接受少于四个字符的请求并修改被阻止的单词列表。你怎么看? – user1597331 2012-08-14 09:26:11

+0

对不起,真的很忙,所以现在只回复。这些类型的问题只有成功的策略没有正确或错误的答案。我建议你现在尝试不同的方法,然后进行监测和评估,如果你以后需要改变策略的话。 – Namphibian 2012-08-15 16:48:15