【问题标题】:Multi-column database indexes and query speed多列数据库索引和查询速度
【发布时间】: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


【解决方案1】:

将复合索引跨越所有 列提供相同的搜索 速度提高,就好像我应用了一个 每列的单独索引?

不。索引中列的顺序非常重要。假设您有这样的索引:create unique index index_name on table_name (headline, coupon_code, description,expiration_date) 在这种情况下,这些查询将使用索引

select * from table_name where headline = 1
select * from table_name where headline = 1 and cupon_code = 2

这些查询不会使用唯一索引:

select * from table_name where coupon_code = 1
select * from table_name where description = 1 and cupon_code = 2

所以规则是这样的。当您有多个字段一起索引时,您必须指定第一个 k 字段才能使用索引。

因此,如果您希望能够搜索任何这些字段之一,那么您应该在每个字段上分别创建索引 (除了组合唯一索引)

另外,请小心使用 LIKE 运算符。

这将使用索引SELECT * FROM tbl_name WHERE key_col LIKE 'Patrick%'; 这不会SELECT * FROM tbl_name WHERE key_col LIKE '%Patrick%';

索引使用http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html 多列索引http://dev.mysql.com/doc/refman/5.0/en/multiple-column-indexes.html

【讨论】:

  • 这正是我需要知道的。非常感谢您的清晰解释和参考。我需要稍微阅读一下这些东西。谢谢!
  • @chrisallenlane,这正是我需要得到的反馈。谢谢!
猜你喜欢
  • 2015-06-14
  • 1970-01-01
  • 2012-08-08
  • 2012-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-15
  • 2016-08-28
相关资源
最近更新 更多