標籤:

MySQL建立關聯表可以不創建主鍵么?

舉一個最簡單的例子:

用戶表基礎數據表user,裡面有欄位主鍵id,帳號account,密碼password,角色role_id,等等。

用戶擁有的物品表(關聯表),user_item,裡面擁有欄位user_id,item_id (分別對應用戶ID和物品ID,當然統統引用的是用戶表和物品表的主鍵id)

目前用戶表需要設置主鍵id, 是因為有很多user表的查詢需要使用這個主鍵id,而該id通常是int類型,查詢條件使用主鍵id比使用字元串account快,因此user表需要設置一個id作為主鍵。

再來看看user_item表,處理的業務邏輯查詢條件統統是用的user_id或者item_id作為查詢條件,這對於user_item這個關聯表來說,即使設置了主鍵自增id,也不會有任何業務SQL會使用這個id作為查詢條件查詢,所以user_item設置這樣的一個主鍵id無非是為了保證每個表需要一個主鍵的設計規範而已,但對查詢的效率並沒有什麼提升,全部的查詢條件都在user_id,item_id上,因此這2個欄位設置索引對效率提升是明顯的。

所以我個人認為像這樣子類型業務的關聯表可以不建立索引,因為這樣子的表查詢較為頻繁,可能新增和刪除也比較頻繁,但是沒有任何根據主鍵查詢的邏輯業務。


每個表需要一個主鍵的設計規範不是單純的為了查詢更快。

MySQL InnoDB存儲引擎的數據存儲格式就是主鍵索引(聚簇索引)。即使是一個沒有主鍵的表,其實也是有一個隱藏的主鍵。

沒有主鍵會有什麼影響呢?我舉一個例子:

一個集群,為了保證數據高可用,設置一個主庫多個從庫。

裡面有一張表,100w條數據,不算很大。

有一天要刪掉40w條數據。主庫上執行刪除操作大約十幾分鐘(可能還不到),從庫上因為沒有相同的主鍵,所以刪除需要進行全表掃描,掃描的行數就是100w*40w=400億。數據量大的話,可能需要幾天才能刪完。這時候從庫就完全沒有作用了。

所以添加一個主鍵是很有必要的。


推薦閱讀:

TAG:MySQL入門 |