当前查询:
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>
答案 0 :(得分:2)
答案 1 :(得分:1)
当您使用InnoDB并选择切换到外部搜索引擎(这是最好和最快的选项)时,像Lucene或Sphinx这里已经提到了一种不同的方法:
如果结果不需要立即显示在搜索中,您可以定期运行一个cronjob(例如每小时一次),将InnoDB表中的新行插入到一个单独的表'searchindex'中,该表是具有全文索引的MyISAM并且仅用于搜索。
答案 2 :(得分:0)
你是在寻找整个单词还是至少是单词的开头?
如果是这样你就可以将单词分成单独的表格,这样“Base Ball Mania”会在“Base”,Ball“和”Mania“表中有三条记录,可以对其进行索引和搜索。
显然,如果您正在搜索“球”并且有一个“棒球”条目,这将无效。