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

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

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

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

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

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

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

感谢您提供专业知识。

所有列的复合索引是否会提供相同的搜索速度增益,就好像我已经为每列应用了单独的索引一样?

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