加速MYSQL LIKE'%word%'语句

时间:2011-03-24 11:20:28

标签: mysql sql

当前查询:

SELECT * FROM 'fnx_sports' WHERE (Title LIKE '%base%' OR Title LIKE '%ball%')

上述查询大约需要0.0300秒

更快的查询:

SELECT * FROM 'fnx_sports' WHERE (Title LIKE 'base%' OR Title LIKE 'ball%')

上述查询大约需要0.0010秒

问题:

我需要第一个查询的结果,因为第二个(更快的)查询在开始时没有通配符(允许使用索引)。

我有哪些选择?

一个选项是有一个单独的表,其中包含Title字段中的所有关键字,但这不合适,因为我希望逐个字符地搜索,而不是逐个关键字搜索。

例如,以下查询也应该有效:

SELECT * FROM 'fnx_sports' WHERE (Title LIKE 'b%' OR Title LIKE 'b%' OR TitleReversed LIKE 'b%' OR TitleReversed LIKE 'b%')

我不确定这是否是最有效的方法。我不想在没有确认最佳方法的情况下修改我的表和代码结构。我很感激任何建议!

注意:不能使用全文,因为我的表格非常大,需要不断插入和选择,因此我使用INNODB代替MYISAM,这是使用全文搜索所必需的。< / p>

3 个答案:

答案 0 :(得分:2)

请查看LuceneSphinx

请参阅:

How much more performant is Postgres than MYSQL on fulltext search?

(特别是peufeu的答案)

答案 1 :(得分:1)

当您使用InnoDB并选择切换到外部搜索引擎(这是最好和最快的选项)时,像Lucene或Sphinx这里已经提到了一种不同的方法:

如果结果不需要立即显示在搜索中,您可以定期运行一个cronjob(例如每小时一次),将InnoDB表中的新行插入到一个单独的表'searchindex'中,该表是具有全文索引的MyISAM并且仅用于搜索。

答案 2 :(得分:0)

你是在寻找整个单词还是至少是单词的开头?

如果是这样你就可以将单词分成单独的表格,这样“Base Ball Mania”会在“Base”,Ball“和”Mania“表中有三条记录,可以对其进行索引和搜索。

显然,如果您正在搜索“球”并且有一个“棒球”条目,这将无效。