像';%一样加速MYSQLword%';陈述

像';%一样加速MYSQLword%';陈述,mysql,sql,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秒 问题: 我需要修改第一个查询的结果,因为第二个(更快的)查询在开始时没有通配符(这允许使用索引)

当前查询:

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秒

问题:

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

我有什么选择

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

例如,以下查询也应起作用:

SELECT * FROM 'fnx_sports' WHERE (Title LIKE 'b%' OR Title LIKE 'b%' OR TitleReversed LIKE 'b%' OR TitleReversed LIKE 'b%')
我不确定这是不是最有效的方法。我不想在不确定最佳方法的情况下修改我的表和代码结构。谢谢你的建议


注意:无法使用全文,因为我有一个表,它变得非常大,需要不断地插入和选择,因此我使用INNODB而不是MYISAM,这是使用全文搜索所必需的。

可能需要查看和选择

见:


(尤其是佩夫的回答)

你总是在搜索整个单词还是至少是单词的开头

如果是这样的话,你可以把这些单词分成一个单独的表格,这样“棒球狂热症”在表格“棒球”、“棒球”和“狂热症”中就有三条记录,可以对它们进行索引和搜索


显然,如果您正在搜索“ball”,并且有一个“Basketball”条目,那么这将不起作用。

当您使用InnoDB时,已经提到了切换到Lucene或Sphinx等外部搜索引擎(这是最好、最快的选项)的选项。在这里结束一个不同的方法:


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

是时候查看了。它确实有一些限制。。(不包括短词等)您可能需要调查全文搜索。请参阅无法使用全文搜索,因为我有一个非常大的表,需要不断插入和选择,因此我使用INNODB而不是使用全文搜索所需的MYISAM。然后,您唯一的选择是使用外部搜索引擎,如Sphinx或Apache Lucene。我将使用他现在的查询速度较慢,但我还将研究已经提到的这个外部搜索引擎。谢谢。我将对此进行研究。是的,这对我所需要的不起作用。否则我将基于关键字进行搜索,但我将基于字符串中包含的字符进行搜索。是否会运行特定的搜索更常见的情况是,这可以缓存?或者搜索太笼统?这是一个聪明的想法,但我认为这不适合我的情况。不过,谢谢。