我是數據庫的新手。如果我使用兩列的主鍵,userId
和dayOfWeek
。我如何搜索這個主鍵?帶多列查找的主鍵
(一週中的某天是int,其中1 =星期一,2 =星期二等)
我會做使用:
SELECT *
WHERE userId = 1
AND dayOfWeek = 4
將其掃描整個數據庫或使用由主提供的信息鍵?是否有另一個更合適的查詢我可以使用?
我是數據庫的新手。如果我使用兩列的主鍵,userId
和dayOfWeek
。我如何搜索這個主鍵?帶多列查找的主鍵
(一週中的某天是int,其中1 =星期一,2 =星期二等)
我會做使用:
SELECT *
WHERE userId = 1
AND dayOfWeek = 4
將其掃描整個數據庫或使用由主提供的信息鍵?是否有另一個更合適的查詢我可以使用?
主鍵索引在內部與其他索引非常相似,除非您明確指出這個是唯一標識記錄的關鍵。它只是一個帶有「必須是唯一」約束的索引。
數據庫是否使用複合主鍵取決於您在查詢中如何指定關鍵字段。鑑於您的PK(用戶ID,星期),然後
SELECT * FROM mytable WHERE (userID = 1);
SELECT * FROM mytable WHERE (userID = 1) AND (dayOfWeek = 4);
將都使用了主鍵索引,因爲你已經使用的字段在他們的關鍵之內指定的順序。
但是,不會,因爲userID
未指定
SELECT * FROM mytable WHERE (dayOfWeek = 4)
,並userID
自帶的鍵定義dayOfWeek
之前。
沒有查詢將掃描整個數據庫,除非您指定該數據庫中的所有表。在最糟糕的情況下,如果您通過不是主鍵或索引的列進行搜索,您可能會期望進行表掃描(這正是我認爲您的真正意思)。
您的示例是一個組合主鍵,因爲它使用多個列作爲鍵。 MySQL現在自動爲主鍵索引(從v5開始),所以通過所有主鍵列進行搜索不太可能導致表掃描,而是索引查找/掃描。這取決於是否使用其他標準。按照主鍵(IE:user_id only)的一部分進行搜索可能會使用索引 - 假設它是覆蓋索引,如果user_id列是從左邊開始的第一個索引,那麼可以使用索引。否則不是。