我是数据库新手。如果我使用两列userId
和dayOfWeek
制作主键。如何搜索此主键?
(dayOfWeek是一个int,其中1 =星期一,2 =星期二等)
我会使用:
SELECT *
WHERE userId = 1
AND dayOfWeek = 4
是否会扫描整个数据库或使用主键提供的信息?我可以使用另一个更合适的查询吗?
答案 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)
不会,因为未指定userID
,userID
在密钥定义中位于dayOfWeek
之前。