需要为多列唯一键列创建索引?

时间:2016-10-19 03:13:15

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

例如,表格FOO

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

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

将为(名称,类型)创建

索引。但是如果许多查询涉及类型如type = aNumber,我是否需要单独为类型创建索引?

换句话说,索引(名称,类型)是否包含索引(类型)?
mysql和oracle db怎么样?

2 个答案:

答案 0 :(得分:2)

这些规则适用于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,我是否需要单独为类型创建索引?" - 如果您还没有name = constant,则需要额外索引

和"换句话说,索引(名称,类型)是否包含索引(类型)?" - 不,它不包括在内。

另请参阅:Index Cookbook

答案 1 :(得分:0)

想象一下,你没有索引

此查询需要扫描整个表格以查找'somename'

 SELECT *
 FROM yourTable 
 WHERE name = 'somename'

现在想象你有name的索引,同样的查询将使用索引快速找到somename的出现,但是然后必须回到表中找到其余的字段。

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

 SELECT type
 FROM yourTable 
 WHERE name = 'somename'

您会很快找到someone并且您已经拥有type,因为它是索引的一部分,不需要在桌面上进行附加查找。

很好,但问题是什么呢?复合索引需要更多的数据库空间,并使插入更慢。所以你需要考虑一下。