2015-09-14 191 views
5

我需要在English dictionary(大约275,000个关键字)中搜索文本(大约500个字长)来检测非英语单词,现在我正在使用的查询并未真正优化需要10秒以上来执行(有一个words表和texts表):搜索多个关键字的文本

SELECT word FROM words WHERE 'The quick brown fox jumps over the lazy dog' LIKE CONCAT('%', word, '%');

上心从here

我已经将word字段设置为索引,并查看了将文本存储在数据库中或将其直接放入查询中的人员的一些示例。

其他例子显示人们使用FULLTEXT搜索,尽管有300k字我不认为FULLTEXT将工作,我想用逻辑+brown +lazy -apple搜索是好的,但在我的情况下,我不需要太多的逻辑。

Another example我见过的是用IN (...)子句拼接单词,尽管有500m的关键字查询会非常长。

任何想法该怎么办?

眼下文本保存为text场和InnoDB的话为varchar(50)utf8_unicode_ci编码,我听说InnoDB的速度很慢,所以我可以使用MyISAM或任何其他。我使用MySQL 5.5,但如果有帮助,我可以更新到5.6。

+0

是否需要用mysql来完成? – baao

+0

这是一个PHP/MySQL网站 – Kenzier

回答

2

LIKE比较基本上只是通配符可用的相等性测试。它们不是一个通用的关键字搜索引擎。

WHERE foo LIKE '%a b%'会发现,包含文字文本a b在FOO场任何位置的任何记录,他们不找ab分开,a b是一款单“字”,这个词被搜索的全部。

如果你想搜索多个“单词”使用LIKE,你所要做的

WHERE foo LIKE '%a%' OR foo LIKE '%b%' OR etc... 

从而迅速得到丑陋,效率极低 - %...搜索不能使用索引。

你会更好,切换到fulltext搜索系统,而不是,您可以在那里当你开始进入了数百万条记录的简单得多

WHERE MATCH(foo) AGAINST ('a b') 
+0

谢谢马克,MATCH AGAINST的问题是我需要275k的OR语句,这将使一个非常长的查询。你的意思是我应该做'匹配(文本)反对(单词)'哪里'词是MySQL的领域? – Kenzier

+0

没有。它匹配('field1,field2,...)'('你的文本')'。该文本可以是一个词,或一个bajillion词。 –

+0

哦,我看到了,参数混淆了。然而,查询仍然非常长,如果存储在文件中需要50MB,并且需要我先检索所有关键字并将它们连接起来。这会是一个问题吗? – Kenzier

0

的InnoDB会变得非常慢。这主要是由于访问表时如何锁定行。

我会使用MyIsam,因此您可以进行FULLTEXT搜索。也许像这样:

select word from words where match(text) against(word) 

我不确定效率,但你真的不需要使用你所说的逻辑,我不认为。

编辑:

我的代码确实需要有一个以上的传递工作,作为第二个参数真正需要的所有的话。我猜想你可以在SQL内部使用FOR循环来填充它,但我必须考虑代码才能完成此操作。可能是一个游标或存储过程可以做到这一点。

但我同意其他答案,您需要使用FULLTEXT搜索。