我正在为我的网站的消息部分构建搜索功能,并且拥有一个超过9,000,000行的消息数据库,以及发件人,主题和消息字段的索引.我希望在我的查询中使用LIKE mysql子句,例如(ex)
SELECT发件人,主题,消息FROM Messages WHERE消息LIKE’%EXAMPLE_QUERY%’;
检索结果.遗憾的是,当存在前导通配符时,MySQL不使用索引,这对于搜索查询可能出现在消息中的任何位置(这是通配符的工作原理,不是吗?).查询非常非常慢,我也不能使用全文索引,因为烦人的50%规则(我只能负担得起这么多).无论如何(或者甚至是任何替代方案)使用like和两个通配符来优化查询?任何帮助表示赞赏.
解决方法:
您应该使用全文索引(您说不能),自己设计全文搜索或从MySQL卸载搜索并使用Sphinx / Lucene.对于Lucene,您可以使用Zend Framework中的Zend_Search_Lucene实现或使用Solr.
MySQL中的普通索引是B树,如果不知道字符串的开头就不能使用它们(当你在开头有通配符时就是这种情况)
另一种选择是使用参考表自己实现搜索.在单词中拆分文本并创建包含word,record_id的表.然后在搜索中,您将用单词拆分查询并搜索参考表中的每个单词.通过这种方式,你不会将自己限制在整个文本的开头,而只限于给定单词的开头(无论如何你将匹配其余的单词)