【发布时间】:2011-09-11 20:03:37
【问题描述】:
我正在部署一个 Rails 应用程序,它将来自各种第三方提供商的优惠券数据聚合到一个可搜索的数据库中。针对每张优惠券在四个字段中进行搜索:标题、优惠券代码、说明和到期日期。
因为其中一些第三方提供商在保持数据排序方面做得相当糟糕,而且我不希望重复的优惠券潜入我的数据库,所以我在这四列中实现了一个唯一的复合索引。这可以防止同一张优惠券被多次插入我的数据库。
鉴于我正在搜索这些列(暂时通过简单的WHERE column LIKE %whatever% 匹配),我希望这些列能够分别从索引它们获得的速度增益中受益。
所以这是我的问题:跨 所有 列的复合索引是否会提供与我对 每个 列应用单个索引相同的搜索速度增益?还是只保证行间的唯一性?
使问题有些复杂的是我正在 Rails 中开发,所以我的问题与 SQLite3 和 MySQL(以及我们将来可能移植到的任何东西)有关,而不是一个特定的 RDBMS。
我的猜测是索引将加快搜索各个列的速度,但我真的没有足够的“幕后”数据库专业知识来对这个判断充满信心。
感谢您提供专业知识。
【问题讨论】:
-
WHERE column LIKE %whatever%不能从不使用索引;WHERE column LIKE whatever%可以。 -
@Johan:哎哟!我没有想到这一点,尽管这确实是有道理的。这让我有动力尽快切换到更好的搜索机制(可能是 Thinking Sphinx)。感谢您指出这一点。
-
在切换到 Sphinx 或 Lucene 之前,我建议考虑 MySQL 全文搜索选项。可能正是你需要的。 dev.mysql.com/doc/refman/5.0/en/fulltext-search.html
-
@bpgergo:是的,我现在不致力于任何特定的解决方案,所以我也会详细阅读全文选项。再次感谢!
标签: mysql ruby-on-rails database-design indexing sqlite