[20191225]主鍵使用uuid優缺點.txt

lfree發表於2019-12-25

[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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章