我需要在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
搜索是好的,但在我的情况下我不需要太多的逻辑。 / p>
Another example我已经看到用IN (...)
子句连接单词虽然有500米的关键字但查询只会非常长。
任何想法该怎么办?
现在,文本被保存为text
字段,而InnoDB中的varchar(50)
字样为utf8_unicode_ci
,我听说InnoDB很慢,所以我可以使用MyISAM或任何其他。我使用MySQL 5.5虽然如果有帮助我可以更新到5.6。
答案 0 :(得分:2)
LIKE
比较基本上只是支持通配符的相等测试。它们不是通用的关键字搜索引擎。
WHERE foo LIKE '%a b%'
会在foo字段中找到任何包含文字文本a b
的记录,他们不会分别查找a
或b
,{ {1}}是一个单一的单词"并且完整地搜索该词。
如果你想搜索多个"单词"使用a b
,你必须做
LIKE
很快变得丑陋,效率极低 - WHERE foo LIKE '%a%' OR foo LIKE '%b%' OR etc...
搜索无法使用索引。
您最好切换到fulltext搜索系统,在那里您可以更简单地使用
%...
答案 1 :(得分:0)
当你开始进入数百万条记录时,InnoDB会变得相当慢。这主要是由于它在访问表时锁定行的方式。
我会使用MyIsam,因此您可以进行FULLTEXT搜索。也许是这样的事情:
select word from words where match(text) against(word)
我不确定效率,但你真的不需要使用你所说的逻辑,我不认为。
编辑:
我的代码确实需要有多个传递才能工作,因为第二个参数确实需要是所有单词。我想你可以在SQL中使用FOR循环来填充它,但我必须考虑代码才能这样做。可能光标或存储过程可以解决问题。
我同意另一个答案,你需要使用FULLTEXT搜索。