搜索性能和数据完整性的最佳实践(或最佳引擎)

时间:2013-06-12 21:37:28

标签: mysql

这可能过于笼统或主观,但我需要帮助,而且我甚至不确定正确和简明的问题是什么。我在过去几天里做了很多谷歌搜索,试图理解这一点,我比以往更加困惑,采取何种方法。

在MySQL中,我为产品目录构建了一个数据库。我必须跟踪一些多对多关系,例如产品标签,产品类别,所以我决定在这些表中使用INNODB,以便我可以使用{{约束。这一切都很好,但是。 FOREIGN KEY不支持INNODB。我已经读过在FULLTEXT子句中使用LIKE '%WORD%'是不好的,因为当通配符添加搜索词时,不能使用索引。数据库可能会在某些时候有很多条目,我不希望搜索永远占用。

那么一个人怎么吃蛋糕呢?我需要选择其中一个:WHERE还是FULLTEXT?我应该制作一种只包含大多数搜索相关列的汇总FOREIGN KEY表,并在INNODB表上使用触发器来保持更新吗?不会 - 至少部分地 - 首先击败使用MYISAM约束的奖励:消除重复和多余的数据?搜索大型数据库的最佳模式是以最佳性能运行 - 至少在使用FOREIGN KEYINNODB时是什么?

如果有光明和有经验的人至少能指出我正确的方向,我将不胜感激。提前谢谢。

2 个答案:

答案 0 :(得分:5)

我去年做了一次网络研讨会演示Full Text Search Throwdown来比较不同的全文搜索工具,包括MyISAM FULLTEXT索引,MySQL 5.6中InnoDB FULLTEXT索引的新实现。您还可以在Slideshare上找到我的幻灯片:Full Text Search Throwdown

为了表现,Sphinx Search是明显的赢家。我咨询的大多数网站都使用InnoDB来存储他们的规范数据,并使用Sphinx Search来存储相同数据的辅助索引。然后,您将获得两全其美:InnoDB的数据完整性和Sphinx搜索的速度。

Sphinx Search的缺点是很难以递增的方式向给定的Sphinx Search索引添加更多内容。向索引添加单行所需的工作量与重新索引整个集合的工作量相同。这有几种解决方法。

InnoDB FTS相当新,它有一些奇怪的怪癖。您可能希望我的同事在Percona阅读深入的评论:

PS:不要使用MyISAM。 : - )

答案 1 :(得分:3)

不要将MySQL用于基于文本的搜索。它不是正确的工具。使用特殊解决方案,如Lucene 这是我1美分的意见 您可以在MySQL中使用文本搜索,但没有任何性能预期。