例如,表格FOO
id name type
---------------------------------------------
bigint(20) varchar(30) smallint(4)
唯一键name_type(名称,类型)。
将为(名称,类型)创建索引。但是如果许多查询涉及类型如type = aNumber,我是否需要单独为类型创建索引?
换句话说,索引(名称,类型)是否包含索引(类型)?
mysql和oracle db怎么样?
答案 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
,因为它是索引的一部分,不需要在桌面上进行附加查找。
很好,但问题是什么呢?复合索引需要更多的数据库空间,并使插入更慢。所以你需要考虑一下。