【问题标题】:MySQL indexing for searching multiple columns用于搜索多列的 MySQL 索引
【发布时间】:2012-02-03 21:55:56
【问题描述】:

我很想知道人们的想法,我们的开发团队非常小,现场没有真正的(核心)数据库专业知识。

我们正在确定一个需要“智能搜索”的新项目,这意味着他们指定了模糊搜索,例如:

个人记录(因交易需求而保存在 innodb 中)

  • 名字(varchar)
  • 姓氏(varchar)
  • 电子邮件地址 (varchar)
  • 上次登录(日期时间 - 每次登录时更新)
  • LastOrder(日期时间 - 接受订单时更新)

他们希望能够搜索任何或多个字段,包括日期列的范围和 varchars 的部分完成,例如:

  • 名字 + lastOrder
  • “Steve”将返回所有与 Steve 一起乞求的名字,例如“Steve and Steven”(比如?)
  • 姓氏 + 电子邮件地址 + 上次登录
  • 上次登录时间介于 2011-01-01 和 2012-01-01 之间
  • 最后订单

我知道其中一些示例相当具体,“应该”总是只返回一行,但这是一个要求而不是确切结构的示例。

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

  1. 索引每一列 - 不是很理想,而且内存使用量很大
  2. 复合索引 - 无法预测要搜索的列的顺序或数量
  3. 在 MyISAM 中创建一个条目并使用 FULLINDEX,例如“MyFirstName MyLastName me@mycompany.com” – 缺点无法比较日期范围
  4. 使用诸如 lucene.net 或类似的索引服务(在我们的 3 个面向 Web 的 IIS 服务器上难以实施,并且与 #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
    

我知道存在相互冲突的规范——希望将所有内容作为一个整体搜索,同时应用范围等。我真的想告诉企业我们不是谷歌,并降低他们对搜索要求的期望。

提前致谢。

【问题讨论】:

  • 我相信 mySQL 优化器会忽略不具有 95% 唯一性的索引。创建索引时要小心。

标签: c# asp.net mysql full-text-search


【解决方案1】:

听起来您应该考虑使用专门的外部搜索解决方案,例如 SOLR

【讨论】:

  • 谢谢,我可能已经暗示但没有在问题中指定,我们有 3 台运行 IIS 的 Windows 2008 服务器将托管该项目。它是一个 ASP.NET 4 应用程序,因此虽然这可能涉及添加额外设备。不过我要去看看。
  • Solr 在 Windows 上运行得很好。实际上可以在很多平台上运行——我的理解是,即使是 iPhone 搜索也是由 solr 驱动的。例如:icuriousmedia.com/blog/…
猜你喜欢
  • 1970-01-01
  • 2017-07-27
  • 2015-07-24
  • 2019-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-24
  • 2016-09-12
相关资源
最近更新 更多