uuid和自增 uuid作為主鍵,還是用自增呢?

2021-10-16 16:42:34 字數 3189 閱讀 9779

以預設的innodb儲存引擎為例:

做為主鍵時,uuid和自增相比較,自增更適合。

原因:1 uuid是無序的, 插入資料時,頁的位置會發生變化,頁**,速度慢。

2 uuid佔的空間大,並且innodb中,別的索引還都要包含主鍵的值,那麼每個索引的空間也都會增大,佔的空間大,需要讀資料時一般會認為需要的io次數多。

自增也是有缺點的

可見my blog

下面來乙個模擬乙個場景證明第二個觀點:

思路:1 建表有三列(主鍵,姓名,性別), 乙個表是uuid為主鍵,乙個表是自增為主鍵

插入同樣的記錄數

2 對「性別」列加索引,對比索引大小。索引大的佔的空間多

mysql> create table song_auto_inc(id int primary key auto_increment,name varchar(10),*** char(1));

query ok, 0 rows affected (0.01 sec)

mysql> create table song_uuid(id varchar(36) primary key ,name varchar(10),*** char(1));

query ok, 0 rows affected (0.00 sec)

cat insert_auto_inc.sh --插入自增表

#!/bin/bash

while true; do

mysql -h10.13.12.197 -p3306 -uroot -ptest -e "insert into test.song_auto_inc (name,***) select 'name1','1' ;"

done

cat insert_uuid.sh --插入uuid

#!/bin/bash

while true; do

mysql -h10.13.12.197 -p3306 -uroot -ptest -e "insert into test.song_uuid select uuid(),'name1','1' ;"

done

插入資料:

sh insert_auto_inc.sh

sh insert_uuid.sh

mysql> select count(*) from song_auto_inc;

| count(*) |

| 197806 | --記錄數一樣

1 row in set (0.03 sec)

mysql> select count(*) from song_uuid;

| count(*) |

| 197806 | --記錄數一樣

1 row in set (0.03 sec)

--去掉兩個表中的碎片

mysql> optimize table song_auto_inc;

| table | op | msg_type | msg_text |

| test.song_auto_inc | optimize | note | table does not support optimize, doing recreate + analyze instead |

| test.song_auto_inc | optimize | status | ok |

2 rows in set (4.32 sec)

mysql> optimize table song_uuid;

| table | op | msg_type | msg_text |

| test.song_uuid | optimize | note | table does not support optimize, doing recreate + analyze instead |

| test.song_uuid | optimize | status | ok |

2 rows in set (10.71 sec)

--檢視資料檔案大小:

-rw-rw---- 1 mysql mysql 8.5k jul 23 23:10 song_auto_inc.frm

-rw-rw---- 1 mysql mysql 7.0m jul 23 23:10 song_auto_inc.ibd

-rw-rw---- 1 mysql mysql 8.5k jul 23 23:13 song_uuid.frm

-rw-rw---- 1 mysql mysql 14m jul 23 23:13 song_uuid.ibd

加索引mysql> create index idx_song_uuid_*** on song_uuid(***);

query ok, 0 rows affected (5.51 sec)

records: 0 duplicates: 0 warnings: 0

mysql> create index idx_song_auto_inc_*** on song_auto_inc(***);

query ok, 0 rows affected (0.91 sec)

records: 0 duplicates: 0 warnings: 0

再次檢視資料檔案大小:

-rw-rw---- 1 mysql mysql 8.5k jul 23 23:19 song_auto_inc.frm

-rw-rw---- 1 mysql mysql 13m jul 23 23:19 song_auto_inc.ibd

-rw-rw---- 1 mysql mysql 8.5k jul 23 23:19 song_uuid.frm

-rw-rw---- 1 mysql mysql 24m jul 23 23:19 song_uuid.ibd

自增主鍵的表大小是 7m

uuid主鍵的表大小是14m

自增主鍵二級索引大小是 13-7=6m

uuid主鍵二級索引大小是 24-14=10m

可以證明第二個觀點。

第乙個觀點留給讀者自己驗證

上面的測試是在ucloud(ucloud – 專業雲計算服務商)的mysql5.6的普通udb上完成的,如果對比插入時的效能不滿意,可以使用ssd的udb,ssd的效能非常高。在網上看到這個文章,裡面用ucloud ssd mysql和別的雲服務商進行對比,可以參考下。

qq 273002188 歡迎一起學習

qq 群 236941212

oracle,mysql,pg 相互交流

MySQL 為什麼推薦自增 id 作為主鍵

在計算機裡,無論是記憶體還是磁碟,作業系統都是按頁的大小進行讀取的 頁大小通常為 4 kb 磁碟每次讀取都會預讀,會提前將連續的資料讀入記憶體中,這樣就避免了多次 io,這就是計算機中有名的區域性性原理,即我用到一塊資料,很大可能這塊資料附近的資料也會被用到,乾脆一起載入,省得多次 io 拖慢速度,...

mysql為什麼不推薦使用uuid作為主鍵

前言 在mysql中設計表的時候,mysql官方推薦不要使用uuid或者不連續不重複的雪花id long形且唯一 而是推薦連續自增的主鍵id,官方的推薦是auto increment,那麼為什麼不建議採用uuid,使用uuid究竟有什麼壞處?本篇部落格我們就來分析這個問題,一下內部的原因。1.1 要...

為啥不推薦uuid作為Mysql的主鍵呢

在mysql中設計表的時候,mysql官方並不推薦使用uuid或者不連續不重複的雪花id,而是推薦使用連續自增的主鍵id。官方推薦的是auto increment。主要原因是uuid在資料量較大的情況下,效率直線下滑。使用自增id的內部結構 自增的主鍵的值是順序的,所以innodb把每一條記錄都儲存...