1

如果我有一张桌子:

用户

  • user_id,INT,主键,
  • user_email_confirmed, TINYINT, (0 或 1),
  • user_email

和查询:

 SELECT user_email FROM users WHERE user_id = 1 AND user_email_confirmed = 1

我需要有一个索引user_email_confirmed吗?或者也许我需要两列索引user_id, user_email_confirmed?如果是,为什么?

4

1 回答 1

1

如果user_id是主键列并被索引,那就足够了。

如果同时满足以下两个条件,则应仅考虑在user_id和上创建复合索引:user_email_confirmed

  1. 您的 DBMS 支持带有附加列的唯一索引(DB2支持;我不确定其他列支持)。

    CREATE UNIQUE INDEX pkx_user ON User(User_ID) INCLUDE(User_Email_Confirmed); -- DB2
    
  2. 您的许多查询都将包含该user_email_confirmed列。

否则,索引就是浪费空间。鉴于您必须获取行的数据才能检索值,因此检查列也user_email没有实际成本。user_email_confirmed如果您的复合索引也包含该user_email列,那么您的索引效率会降低(因为索引中每一行的数据会更大),但您可以避免获取数据行(它变成一个索引-仅查询)。这是否重要很难判断——我怀疑不获取行的收益是否超过了索引效率的损失。

于 2013-09-08T00:59:17.417 回答