【问题标题】:need to create indexes for multi-column unique key columns?需要为多列唯一键列创建索引?
【发布时间】:2017-02-28 12:14:03
【问题描述】:

例如,表 FOO

          id         name         type
---------------------------------------------
         bigint(20)  varchar(30)  smallint(4)

唯一键 name_type(名称,类型)。

将为(名称,类型)创建索引。但是如果很多查询都涉及type=aNumber这样的类型,是否需要单独为type创建索引呢?

也就是说 index(name, type) 是否包含 index(type)?
mysql和oracle db怎么样?

【问题讨论】:

  • 戴夫 - 胡安在他的回答中所说的是真的,但它没有回答你的问题。至少在 Oracle 中,如果您按索引中的 FIRST 列进行过滤,则将使用复合索引,但如果您仅按索引中的第二列进行过滤,则不会使用复合索引。在您的情况下,您确实需要类型索引。
  • 这个 问题没有提到通配符,所以我觉得 dup 问题 不相关。投票重新开放。

标签: mysql oracle indexing multiple-columns unique-key


【解决方案1】:

这些规则适用于 MySQL。 可能它们适用于其他供应商。

INDEX(name, type)(或UNIQUE(name, type))对

很有用
WHERE name = ...
WHERE name = ... AND type = ...
WHERE name = ... AND something_else = ...
WHERE name LIKE 'Abc%'          -- note: does not start with wildcard
WHERE name BETWEEN 'x' AND 'y'
WHERE name = '123'      -- both are strings

但没用

WHERE type = ...        -- without `name`
WHERE name LIKE '%xyz'  -- because of _leading_ wildcard
WHERE name BETWEEN 'x' AND 'y' AND type = ... -- Only partially useful
WHERE name = 123      -- trouble between VARCHAR and number

注意:WHERE 中 AND 子句的顺序无关紧要;列的顺序很重要。

所以“但是如果很多查询都涉及type=aNumber这样的类型,我需要单独为type创建索引吗?” -- 需要额外的索引如果你也没有name = constant

“换句话说,索引(名称,类型)是否包括索引(类型)?” -- 不,它不是“包含”的。

另请参阅:Index Cookbook

【讨论】:

    【解决方案2】:

    假设你没有索引

    这个查询需要扫描整个表才能找到'somename'

     SELECT *
     FROM yourTable 
     WHERE name = 'somename'
    

    现在假设您有name 的索引,相同的查询将使用该索引快速找到somename 的出现,但随后将不得不返回表中查找该字段的其余部分。

    最后,如果您有一个包含(name, type) 和以下查询的复合索引。

     SELECT type
     FROM yourTable 
     WHERE name = 'somename'
    

    您会很快找到someone,并且您已经拥有type,因为它是索引的一部分,不需要对表格进行额外查找。

    这很好,但问题是什么?复合索引需要更多的数据库空间,并使插入速度变慢。您需要考虑的因素也是如此。

    【讨论】:

    • 他的问题是“将为(name, type)创建索引。但是如果很多查询涉及type=aNumber等类型,我需要为type单独创建索引吗?”
    • @Drew 好吧,我想我会回答这个问题。我的示例显示了一个复合键并搜索单个字段。所以简短的回答是否定的,不需要创建另一个索引
    • innodb 假设,在我看来就像一个 tablescan i.imgur.com/nxzxKn9.jpg
    • @Drew 你能帮我把那个测试用例放在rexter 中吗?
    • 我可以发布我的一些答案,这些答案只是自行生成数千万行。我用它来弄乱一些东西,比如here ...但我会为你发布一些网址
    猜你喜欢
    • 2015-09-15
    • 2010-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-15
    • 1970-01-01
    • 2018-10-01
    • 2017-02-01
    相关资源
    最近更新 更多