多列数据库索引和查询速度

时间:2011-06-09 15:36:56

标签: mysql ruby-on-rails database-design indexing sqlite

我正在部署一个Rails应用程序,该应用程序将来自各种第三方提供商的优惠券数据聚合到一个可搜索的数据库中。每个优惠券在四个字段中进行搜索:标题,优惠券代码,说明和到期日期。

因为这些第三方提供商中的某些提供商在保持数据排序方面做得相当糟糕,并且因为我不希望重复的优惠券进入我的数据库,所以我在这四个列中实现了一个独特的复合索引。这样可以防止同一张优惠券被多次插入我的数据库。

鉴于我正在搜索这些列(暂时通过简单的WHERE column LIKE %whatever%匹配),我希望这些列能够通过索引它们来获得速度增益。

所以这是我的问题:所有列的复合索引是否会提供相同的搜索速度增益,就好像我已经将单个索引应用于每个列一样?或者它只保证行之间的唯一性?

在某种程度上使问题更复杂的是我正在开发Rails,所以我的问题既适用于SQLite3和MySQL(以及我们将来可能移植到的任何内容),而不是一个特定的RDBMS。

我的猜测是索引加速搜索各个列,但我真的没有足够的“幕后”数据库专业知识来对这个判断充满信心。

感谢您提供专业知识。

1 个答案:

答案 0 :(得分:5)

  

将所有的复合索引   列提供相同的搜索   速度提升就像我申请了一样   每列的个别索引?

不。索引中列的顺序非常重要。让我们假设您有这样的索引: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