[20191225]主鍵使用uuid優缺點.txt
[20191225]主鍵使用uuid優缺點.txt
--//連結:https://www.cnblogs.com/jpfss/p/11506824.html
UUID
UUID含義是通用唯一識別碼 (Universally Unique Identifier),指在一臺機器上生成的數字,它保證對在同一時空中的所有機器都是唯
一的。通常平臺會提供生成的API。換句話說能夠在一定的範圍內保證主鍵id的唯一性。
優點
出現資料拆分、合併儲存的時候,能達到全域性的唯一性
缺點
影響插入速度, 並且造成硬碟使用率低
uuid之間比較大小相對數字慢不少, 影響查詢速度。
uuid佔空間大, 如果你建的索引越多, 影響越嚴重
--//連結:https://blog.csdn.net/yinni11/article/details/79897696
現在大家應該對UUID有一個比較直觀的認識了,我們來看看UUID的優缺點分別是什麼。
優點:
能夠保證獨立性,程式可以在不同的資料庫間遷移,效果不受影響。
保證生成的ID不僅是表獨立的,而且是庫獨立的,這點在你想切分資料庫的時候尤為重要。
在oracle做資料遷移的時候不會因為表的sequence不連續而出現問題
缺點:
比較佔地方,和INT型別相比,儲存一個UUID要花費更多的空間。
使用UUID後,URL顯得冗長,不夠友好。
下面針對上述UUID的缺點說說我的看法,比較佔地方這個缺點我不是很在乎,現在最不值錢的就是硬碟了,略過此條缺點無妨,但需要注
意的一點資料在索引的時候效率會隨著體積的增加而降低。至於說使用UUID後,URL顯得不友好,我覺得這多少是你的INT情結造成的慣性
思維,其實,和INT型別相比,UUID才是最自然的主鍵選擇,注意,我這裡用的是自然這個形容詞,仔細體會一下你能理解我的意思。另
外,很多時候,URL本身就不需要友好,比如,一個電子商務網站,按照INT友好的URL說法,她的訂單URL大概是下面這個形式的:
/order.php/id/123,我要說明的是,這樣是很友好,但是有些太友好了,友好的甚至不安全,比如說,我早晨下一個訂單,發現URL是
/order.php/id/1000,晚上再下一個訂單發現URL是/order.php/id/2000,那麼我就可以估計出此網站一天的訂單數大致是1000左右,甚
至能大體估計出它的銷售額,而這些資料往往都是重要的商業秘密。使用UUID就沒有這個顧慮。
--//我個人並不同意這個觀點,最不值錢的就是硬碟,某種角度講這個觀點確實沒錯,但是對方明顯沒有考慮日誌,歸檔,索引,表這些匯
--//總起來,增加確實很快的.而且實際上許多開發不會選擇raw(16)型別,因為這樣會存在隱式轉換,程式設計很麻煩,而是更多的選擇
--//varchar2(32)型別儲存.
SCOTT@book> @ ver1
PORT_STRING VERSION BANNER
------------------------------ -------------- --------------------------------------------------------------------------------
x86_64/Linux 2.4.xx 11.2.0.4.0 Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
create table t ( a raw(16),b varchar2(32));
insert into t select sys_guid(), sys_guid() from dual ;
SCOTT@book> select * from t;
A B
-------------------------------- --------------------------------
9A7EBAE480254756E0534E64A8C05A8C 9A7EBAE480264756E0534E64A8C05A8C
~~~~~~~~~~~~
--//不仔細會以為2個一樣,實際上僅僅下劃線最後5存在不同.
SCOTT@book> select dump(a,16) c70 ,dump(b,16) c110 from t ;
C70 C110
---------------------------------------------------------------------- --------------------------------------------------------------------------------------------------------------
Typ=23 Len=16: 9a,7e,ba,e4,80,25,47,56,e0,53,4e,64,a8,c0,5a,8c Typ=1 Len=32: 39,41,37,45,42,41,45,34,38,30,32,36,34,37,35,36,45,30,35,33,34,45,36,34,41,38,43,30,35,41,38,43
--//前者佔用16位元組,後者32位元組.
SCOTT@book> select * from t where a='9A7EBAE480254756E0534E64A8C05A8C';
A B
-------------------------------- --------------------------------
9A7EBAE480254756E0534E64A8C05A8C 9A7EBAE480264756E0534E64A8C05A8C
SCOTT@book> @ dpc '' ''
PLAN_TABLE_OUTPUT
-------------------------------------
SQL_ID 71cgtup50d8p8, child number 0
-------------------------------------
select * from t where a='9A7EBAE480254756E0534E64A8C05A8C'
Plan hash value: 1601196873
---------------------------------------------------------------------------
| Id | Operation | Name | E-Rows |E-Bytes| Cost (%CPU)| E-Time |
---------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | | | 3 (100)| |
|* 1 | TABLE ACCESS FULL| T | 1 | 28 | 3 (0)| 00:00:01 |
---------------------------------------------------------------------------
Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------
1 - SEL$1 / T@SEL$1
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter(RAWTOHEX("A")='9A7EBAE480254756E0534E64A8C05A8C')
--//可以發現發生隱式轉換,這樣開發不會選擇raw型別來儲存生成的uuid.意味者需要更大的空間儲存資訊.
SELECT *
FROM ( SELECT table_name, COUNT (*)
FROM dba_tab_columns
WHERE owner = 'XXXXXX'
AND data_type = 'VARCHAR2'
AND data_length = 32
GROUP BY table_name
ORDER BY 2 DESC)
WHERE ROWNUM <= 8;
TABLE_NAME COUNT(*)
--------------------- --------
XXX_ITEM_HIS 27
XXX_ITEM 25
XXX_PAYBOOK 22
XXX_AGEN 22
XXX_PAYBOOK_BACK3040 21
XXX_BATCH_TASK_DETAIL 20
XXX_PAYBOOK_UNSIGN 20
XXX_ITEMSHARE_HIS 19
--//XXX_ITEM_HIS有27個,XXX_ITEM有25個varchar2(32)型別.可想而知如果這些都是uuid的編碼,消耗空間有多大,出現行連結遷移的可能
--//性有多大.
set linesize 2000
column comments format a60
SELECT table_name, column_name, comments
FROM DBA_col_COMMENTS
WHERE owner = 'XXXXXX'
AND table_name = 'XXX_ITEM'
AND column_name IN (SELECT column_name
FROM dba_tab_columns
WHERE owner = 'XXXXXX'
AND table_name = 'XXX_ITEM'
AND data_type = 'VARCHAR2'
AND data_length = 32);
TABLE_NAME COLUMN_NAME COMMENTS
---------- ---------------- --------------------
XXX_ITEM XXXEMIDCODE 專案識別碼
XXX_ITEM XXXITS 計量單位
XXX_ITEM XXXBID 收入科目Id
XXX_ITEM XXXERID 經辦人ID
XXX_ITEM XXXAREDIRECTCODE 分成方向
XXX_ITEM XXXALTYPERCENT 滯納金比例(%)
XXX_ITEM XXXDCODE 父級識別碼
XXX_ITEM XXXTSTYLECODE 預算管理方式程式碼
XXX_ITEM XXXAGSORTCODE 全國專案分類
XXX_ITEM XXX 主鍵
XXX_ITEM XXXTERCODE 變更型別程式碼
XXX_ITEM XXXYMODECODE 繳庫方式程式碼
XXX_ITEM XXXCOMESORTCODE 收入類別程式碼
XXX_ITEM XXXAGSORTCODE 地方專案分類
XXX_ITEM XXXNDSNATURE 資金性質內碼
XXX_ITEM XXXNDSNATURECODE 資金性質程式碼
XXX_ITEM XXXTCHKRGNID 終審透過的區劃ID
XXX_ITEM XXXDE 專案編碼
XXX_ITEM XXXNID 維護區劃ID
XXX_ITEM XXXEMCODE 專案業務碼
XXX_ITEM XXXVELCODE 層次碼
XXX_ITEM XXXRTCODE 專案分類程式碼
XXX_ITEM XXXPCODE 審批屬性程式碼
XXX_ITEM XXXNITEMIDCODE 全國專案識別碼
XXX_ITEM XXXTLVLCODE 專案使用級次
已選擇 25 行。
--//僅僅3-4個欄位(XXXITS,XXXAREDIRECTCODE,XXXALTYPERCENT,XXXVELCODE,XXXTLVLCODE)可能不是儲存uuid編碼.可想如果剩下全部保
--//存uuid資訊,32*20=640,不是一點點而是大量的空間.
--//任何一項技術都有其優缺點,適用範圍,如果濫用未必帶來好的結果.適當的使用才能帶來好處.而不是到處都用uuid儲存主鍵資訊.
--//你可以看如下連結的一些測試,對方還是使用raw(16)型別的,如果是varchar2(32)消耗更大.
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/267265/viewspace-2670513/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- MySQL 資料庫自增主鍵生成的優缺點MySql資料庫
- PostgreSQL中如何高效使用UUID主鍵?SQLUI
- 使用protocolbuffers優缺點分析Protocol
- 使用css框架的優缺點CSS框架
- RabbitMQ優缺點MQ
- Jtti:mysql主從同步的優點和缺點是什麼JttiMySql主從同步
- Docker的優缺點Docker
- HTTPS 優點與缺點HTTP
- PostgreSQL中UUID v7作為主鍵SQLUI
- 恆訊科技分析:共享主機的優點和缺點是什麼?
- 伺服器使用CDN加速的優缺點伺服器
- Laravel指東:使用模型建立 uuid 主鍵資料的兩種方式Laravel模型UI
- HTTP1.1 優缺點HTTP
- Ajax原理以及優缺點
- MySQL索引的優缺點MySql索引
- serverless與容器優缺點Server
- TokuDB優缺點總結
- JavaScript 模組化優缺點JavaScript
- 繼承的優缺點繼承
- 節點快取的優缺點快取
- MyBatis的優缺點以及特點MyBatis
- 繼承的優點和缺點繼承
- iframe有哪些優點和缺點?
- IOS資料儲存之CoreData使用優缺點iOS
- 資料表設計之主鍵自增、UUID或聯合主鍵UI
- mysql和Oracle的特點,優缺點MySqlOracle
- Java單例模式:缺點和優點Java單例模式
- kafka的優缺點都有那些Kafka
- 關於 Cookie的優缺點Cookie
- hadoop-HDFS優缺點Hadoop
- docker簡介以及優缺點Docker
- Git版本控制與優缺點Git
- Serverless架構的優缺點Server架構
- 微服務架構優缺點微服務架構
- 淺談Ajax的優缺點
- memcached 和 redis 使用場景及優缺點對比Redis
- 線性表順序儲存優缺點,線性連結串列的優缺點
- 面試官:你知道雙機儲存有哪幾種嗎?分別有哪些優缺點(主備、主從、主主)面試