具有多列查找的主键

时间:2011-04-11 15:50:04

标签: mysql sql query-optimization primary-key

我是数据库新手。如果我使用两列userIddayOfWeek制作主键。如何搜索此主键?

(dayOfWeek是一个int,其中1 =星期一,2 =星期二等)

我会使用:

SELECT * 
 WHERE userId = 1 
   AND dayOfWeek = 4

是否会扫描整个数据库或使用主键提供的信息?我可以使用另一个更合适的查询吗?

2 个答案:

答案 0 :(得分:2)

除非您指定了该数据库中的所有表,否则任何查询都不会扫描整个数据库。在最糟糕的情况下,如果您按非主键或索引的列进行搜索,则可以进行表扫描(这是我认为您的意思)。

您的示例是复合主键,因为它使用多个列作为键。 MySQL现在自动索引主键(因为v5?),因此所有主键列的搜索不太可能导致表扫描,而是索引搜索/扫描。这取决于是否使用任何其他标准。通过部分主键(IE:user_id)搜索可能会使用索引 - 假设它是覆盖索引,如果user_id列是左起第一个,则可以使用索引。否则不会。

答案 1 :(得分:1)

主键索引在内部与任何其他索引非常相似,除非您明确指出 THIS 是唯一标识记录的键。它只是一个带有“必须唯一”约束的索引。

DB是否使用复合主键取决于您在查询中指定键字段的方式。鉴于你的PK(userID,dayOfWeek),那么

SELECT * FROM mytable WHERE (userID = 1);
SELECT * FROM mytable WHERE (userID = 1) AND (dayOfWeek = 4);

都会使用主键索引,因为您已按照键中指定的顺序使用了字段。

然而,

SELECT * FROM mytable WHERE (dayOfWeek = 4)

不会,因为未指定userIDuserID在密钥定义中位于dayOfWeek之前。