【问题标题】:SQL use a two column index or two single indexes ( x = ? and y > ?)SQL 使用两列索引或两个单索引(x = ? 和 y > ?)
【发布时间】:2015-10-27 04:33:28
【问题描述】:

这个问题可能看起来与之前发布的问题非常相似,但略有不同。 当您的查询始终包含两列时,我知道为两列创建索引是一个好习惯,但对于这种情况,查询就像检查一列,然后从第二列中查找大于给定值的所有记录,例如

SELECT * FROM Data WHERE User_Id = 'Johndoe' AND Last_Query > 1001 

那么我应该仍然对两个列使用单个索引(在上面的示例中为User_idLast_Query)还是应该为每列创建不同的索引?

【问题讨论】:

  • 有时您根本不应该使用索引。很大程度上取决于表的大小和数据的类型。
  • 应该在这个上使用索引,这将是一个包含多对多关系的大表,因此对于给定点的每个用户都需要查看为他发布的任何新问题@vol7ron
  • 一个 User_Id 索引就足够了,因为您正在应用 where 'User_Id'(已使用索引)AND Last_Query > 1001(未使用索引)
  • 您是否会单独按任一字段进行搜索?该查询是否需要高效?
  • MySQL 还是 MS SQL Server?不要标记未涉及的产品,尤其是涉及产品可能表现不同的区域时。

标签: mysql sql sql-server


【解决方案1】:

多列索引旨在处理这种情况。当索引中的第一列具有已知值(在您的示例中为 User_Id = 'Johndoe')时,具有该值的所有行都按索引中的第二列排序(在您的示例中为 Last_Query)。这允许有效地寻找第二列的范围开始的位置。

通常,当索引列的任何前缀具有“=”过滤器,然后在下一个索引列上具有范围过滤器(> 或

WHERE col1=a AND col2=b ... AND colN=c AND colN+1 > d

【讨论】:

    猜你喜欢
    • 2013-11-05
    • 2011-01-21
    • 1970-01-01
    • 1970-01-01
    • 2013-01-04
    • 2011-08-31
    • 2018-06-22
    • 2011-04-13
    • 1970-01-01
    相关资源
    最近更新 更多