台灣最大程式設計社群網站
線上人數
853
 
會員總數:242642
討論主題:187615
歡迎您免費加入會員
討論區列表 >> MySQL >> 流水號主鍵、複合主鍵和GUID的效能問題
[]  
[我要回覆]
1
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
流水號主鍵、複合主鍵和GUID的效能問題
價值 : 100 QP  點閱數:354 回應數:4

樓主

迷路
高級專家
9796 132
6317 1634
發送站內信

捐贈 VP 給 迷路
最開始的問題是這樣的
我有兩張表是多對多的關聯
所以會額外建立一張關聯表
我想問的是這張關聯表,直接使用兩張表的ID欄位做複合主鍵
和另外建立一個無意義的流水號主鍵,兩張表的ID欄位則建立唯一索引
效能上有差異嗎?

在Google時又查到GUID這個能不依靠資料庫流水號產生不重複唯一值的方法
想請問的是,使用GUID做為主鍵,是否會讓效能變差?varchar的索引效率是否較差?

搜尋相關Tags的文章: [ 流水號主鍵 ] , [ 複合主鍵 ] , [ GUID ] ,
本篇文章發表於2018-03-08 11:20
別忘捐VP感謝幫助你的人 新手會員瞧一瞧
1樓
回應

浩瀚星空
捐贈 VP 給 浩瀚星空 檢舉此回應
大致上先讓你了解一下。一般來說,主鍵搜尋是最快的。
而複合式主鍵,會慢一些。(但慢是慢在建立資料的情況下)
在主鍵搜尋的情況下,其實整度沒差很多。大約可以用微豪秒來計算。

字元式的索引大多數而言,我在某一篇文章有見過。
非英數字的索引的效率是很差的。
而使用字元欄位做索引,一般一定不會比用數值欄位做索引還要快。
那時看到的因素是數值式的還可以有所謂的範圍性質來做處理。所以要快很多。
再加上數值式所建立的索引檔也會比一般字元式的索引檔byte還要少很多。

所以在開發設計上,其表資料大多還是用用數值儲存。如分類來說
並不會在物品的分類欄直接去儲存字元式的文字。而是會儲存對應的分類表id。
其目的也是為了分類表控制之外,另一方面也是為了索引因素。

本篇文章回覆於2018-03-08 12:01
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
2樓
作者回應

迷路
捐贈 VP 給 迷路 檢舉此回應
所以,如果沒有特殊原因,多對多關聯的關聯表
只需要建複合主鍵就可以了,沒必要額外建個流水號主鍵

GUID除非有分散式系統之類的需求
否則沒有比流水號ID來的高效?
本篇文章回覆於2018-03-08 17:03
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
3樓
最有價值解答

浩瀚星空
捐贈 VP 給 浩瀚星空 檢舉此回應
一般多對多的關聯表,我的確不會建立流水號主鍵。
只會建立複合式主鍵。

但要注意的是,這個的理論也只適合mysql 5.4以上的版本。
在5.4之前的版本,使用複合式主鍵而沒建流水號主鍵的情況下,不知道為何效能會變很差。
所以在早期我還是會建立一個流水號主鍵來用(但這個主鍵可以說完全沒去使用過它)

但現在新版的已經沒這樣的問題了。
本篇文章回覆於2018-03-08 19:01
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
4樓
作者回應

迷路
捐贈 VP 給 迷路 檢舉此回應
就是這個
我之前就是有看過複合主鍵的效能很差
所以才一直另外建一個流水號主鍵
原來是舊版的mysql有問題
那我現在可以安心用複合式主鍵了(目前的版本已經超過5.4了)
本篇文章回覆於2018-03-09 09:31
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
   
1

回覆
如要回應,請先登入.