1. 程式人生 > >Mysql為什麼不用uuid作為表的主鍵

Mysql為什麼不用uuid作為表的主鍵

  1. UUID生成速率低下

Java的UUID依賴於SecureRandom.nextBytes方法,而SecureRandom又依賴於作業系統提供的隨機數源,在Linux系統下,它的預設依賴是/dev/random,而這個源是阻塞的。最可怕的是,這個nextBytes方法還是一個synchronized方法,也就是說,如果多執行緒呼叫UUID,生成速率不升反降。

測試結果:在一臺64執行緒的伺服器上,呼叫UUID.randomUUID方法,生成一千萬個uuid平均耗時在130s,tps不到8w

  1. UUID主鍵在innodb中會引發效能問題

a. innodb中的主鍵索引也是聚集索引,如果插入的資料是順序的,那麼b+樹的葉子基本都是滿的,快取也可以很好的發揮作用。如果插入的資料是完全無序的,那麼葉子節點會頻繁分裂,快取也基本無效了。這會減少tps

b. uuid佔用的空間較大

  1. UUID完全沒有意義,如果有一個主鍵是全域性自增的,那麼資料排列順序就是資料的插入順序