1. 首页
  2. IT资讯

[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)消耗更大.
https://dfitzjarrell.wordpress.com/2016/12/21/do-you-have-a-key/

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/267265/viewspace-2670513/,如需转载,请注明出处,否则将追究法律责任。

主题测试文章,只做测试使用。发布者:深沉的少年,转转请注明出处:http://www.cxybcw.com/182810.html

联系我们

13687733322

在线咨询:点击这里给我发消息

邮件:1877088071@qq.com

工作时间:周一至周五,9:30-18:30,节假日休息

QR code