[20191225]主键使用uuid优缺点.txt

来源:这里教程网 时间:2026-03-03 14:45:01 作者:

[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/

相关推荐