2012-02-03 89 views
2

我好奇地找出哪些人认为,我们有一个非常小的开发团队并没有真正的(硬核)数据库的专业知识现场。的MySQL索引搜索多列

我们是观察具有的“智能搜索”的要求一个新项目,这是什么意思是,他们已经指定暧昧的搜索,例如:(因交易需求的InnoDB内举行)

一个人记录

  • 姓(VARCHAR)
  • 姓氏(VARCHAR)
  • EmailAddress的(VARCHAR)
  • Lastlogin(日期时间 - 更新每个登录)
  • LastOrder(日期时间 - 当订单被接受更新)

他们希望能够在包括两个日期列范围内任一或多个字段进行搜索并部分完成了VARCHAR处理,例如:

  • 姓+ lastOrder
  • “史蒂夫”将返回与乞讨的所有名称史蒂夫小号UCH为“史蒂夫和史蒂芬”(样?)
  • 姓+ EmailAddress的+ LastLogin
  • Lastlogin BETWEEN 2011-01-01 2012-01-01与
  • Lastorder < 2012-01-01

我明白了其中的一些例子是相当具体,“应该”永远只返回一行,但它的要求,而不是精确的结构的例子。

我们正在决定如何最好地实现它,没有人能同意(像往常一样!),我很想听听其他人如何在功能上做到这一点,所以他们选择了该解决方案。

  1. 指数每列 - 不甚理想,大内存使用
  2. 复合索引 - 无法预知的顺序或列数搜索
  3. 创建一个MyISAM中的条目,并使用FULLINDEX例如“MyFirstName MyLastName [email protected]” - 缺点无法比较日期范围
  4. 使用索引服务,如lucene.net或类似(难以在我们的3个面向IIS服务器的Web上实现,并且类似问题#3)
  5. 查看保存数据的变化 - 缺点,需要索引和更多的内存/ CPU使用率没有真正的好处
  6. 笨重查询:

    SELECT 
    (Firstname LIKE “Steve%”) as fn_matched_data 
    (Lastlogin BETWEEN 2011-01-01 AND 2012-01-01) as ll_matched_data 
    FROM TABLE 
    WHERE Firstname LIKE “Steve%” OR Lastlogin BETWEEN 2011-01-01 AND 2012-01-01 
    

我理解存在冲突规范 - 想要搜索一切同时应用范围等等。我真的想告诉我们不是谷歌的业务,并降低他们对搜索要求的期望。

在此先感谢。

+0

一个专门的外部搜索解决方案,我beleive MySQL优化忽略不具有95%的唯一指标。创建索引时请小心。 – 2012-02-03 23:28:40

回答

1

听起来像是你应该考虑像SOLR

+0

谢谢,我可能已经暗示,但没有在问题中指定,我们有3台Windows 2008服务器运行IIS来承载项目。它是一个ASP.NET 4应用程序,所以这可能会涉及到添加额外设备的可能性。不过我要检查一下。 – Steve 2012-02-03 22:05:33

+1

Solr在Windows上运行就好了。实际上运行在很多平台上 - 我的理解是即使iPhone搜索也是基于solr的。例如:http://www.icuriousmedia.com/blog/how-to-install-apache-solr-on-windows-xp-1439.php – 2012-02-03 22:07:22