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

Chr*_*ane 3 mysql sqlite indexing database-design ruby-on-rails

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

因为一些第三方供应商做保持他们的数据排序,因为我不想重复券蔓延到我的数据库的一个相当糟糕的工作,我实现了跨越这些四列的唯一复合索引.这可以防止同一张优惠券不止一次插入我的数据库.

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

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

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

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

感谢您提供专业知识.

bpg*_*rgo 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
Run Code Online (Sandbox Code Playgroud)

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

select * from table_name where coupon_code = 1
select * from table_name where description = 1 and cupon_code = 2
Run Code Online (Sandbox Code Playgroud)

所以规则是这样的.如果有多个字段一起编入索引,则必须指定第一个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