`
fantaxy025025
  • 浏览: 1309726 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类

DB_ID_UUID_优缺点前瞻(三)

阅读更多

我唯一还算熟悉的数据库就算是MySQL了,大概使用MySQL的人,百分之九九以上的人会使用Autoincrement ID做主键,这是可以理解的,因为MySQL的自增ID效率很高,使用也很方便。那么剩下的百分之一的人使用什么做主键呢?可能是自己做的 KeyGenerator,也可能是我们下面要说的UUID。

据说在Oracle的圈子里,如果谁用自增ID做主键是要被鄙视的,主键最自然的选择就是UUID。我不了解Oracle,这些道听途说的结论是否正确不做承诺。

那么我们先看看什么是UUID?简单的说,UUID是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的。在UUID的算法中,可能会用到诸如网卡MAC地址,IP,主机名,进程ID等信息以保证其独立性。

如果你的MySQL版本不太老的话,键入 SELECT UUID(); 输出的就是UUID,如下:

mysql> select uuid();
+————————————–+
| uuid() |
+————————————–+
| 54b4c01f-dce0-102a-a4e0-462c07a00c5e |
+————————————–+

现在大家应该对UUID有一个比较直观的认识了,我们来看看UUID的优缺点分别是什么。

优点:

能够保证独立性,程序可以在不同的数据库间迁移,效果不受影响。
保证生成的ID不仅是表独立的,而且是库独立的,这点在你想切分数据库的时候尤为重要。

缺点:

比较占地方,和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就没有这个顾虑。

效率?

如果上面说的UUID的所谓缺点都不成立的话,那么是否使用UUID做主键,唯一的问题就是效率了。据说在PostgreSQL等数据库里,都有专 门的 UUID类型,在这样的数据库里,使用UUID做主键,效率没有任何问题,可惜在MySQL里没有这样的字段,如果想在MySQL里保存UUID做主键, 一般是使用CHAR(36)来模拟,因为不是一个原生的UUID类型,所以主键的效率到底如何有待测试,另外,UUID做主键的效率和UUID本身的算法 实现也有很大关系。

另外,对于InnoDB这种聚集主键类型的引擎来说,数据会按照主键进行排序,由于UUID的无序性,InnoDB会产生巨大的IO压力,此时不适合使用UUID做物理主键,可以把它作为逻辑主键,物理主键依然使用自增ID。

我本来想在我自己的电脑上插入1000000条数据测试一下看看来着,可惜一测试,硬盘灯就一直亮,让我很担心它会挂,虽然硬盘不值钱,但是我重要的数据都在上面,一旦坏了,损失就大了,所以,测试只好作罢。

至于在MySQL上使用UUID(用char(36)存储,也可以用binary(16)存储)做主键,效率到底如何,我也不知道,抱歉 -_-!!!

 

http://chentu.info/archives/708

分享到:
评论

相关推荐

    uuid.rar_C获得UUID_UUID C_c生成uuid_c语言生成uuid_uuid

    标题“uuid.rar_C获得UUID_UUID C_c生成uuid_c语言生成uuid_uuid”表明这是一个关于使用C语言实现UUID生成的资源包。这个压缩包可能包含了一个C语言编写的程序或库,可以用来在Windows平台上(通过VC6编译器)生成...

    UUID.rar_UUID C_uuid_uuid 加密_uuid.c_wince UUID

    - UUID是一种128位的数字,通常以16进制表示,分为5个部分:时间戳、节点ID、时钟序列、变异性位和版本号。 - UUID的设计目标是确保全局唯一,即使在分布式环境中,不同系统生成的UUID也应互不冲突。 - UUID有多...

    LENOVO_VBKE_SN_SLP_UUID_TOOL_V480S专用

    LENOVO_VBKE_SN_SLP_UUID_TOOL_V480S专用

    uuid.zip_c_there9gy_uuid

    - 生成UUID通常涉及调用`uuid_generate()`函数,然后使用`uuid_unparse()`将其转换为字符串格式。 - 针对不同版本的UUID,可能需要实现不同的生成逻辑,比如V1需要获取当前时间戳和硬件地址,V4则需要大量随机数。...

    uuid工具工具

    java图形化操作,点击生成全球唯一的uuid

    NW705+_G升级文件.uuid,磊科NW705+_G升级文件.uuid

    NW705+_G升级文件

    获取机器中的UUID-SMBIOS TYPE1

    此工具可以协助大家读取系统中的UUID,即SMBIOS TYPE1部分的信息.

    深入解析C++编程中__alignof 与__uuidof运算符的使用

    本文将深入解析两个在C++中不常用但非常重要的运算符:`__alignof`和`__uuidof`,它们分别涉及数据对齐和UUID(通用唯一标识符)的处理。 首先,我们来看`__alignof`运算符。`__alignof`是C++11引入的,用来获取...

    PHP实现生成统一唯一标识符UUID

    在IT行业中,UUID(Universally Unique Identifier)是一种用于标识信息的标准,它确保了全局的唯一性,不依赖网络连接或中央注册机构。在PHP中,生成UUID常常用于创建唯一的记录标识,比如数据库中的主键或者分布式...

    uuid-1.6.2-43.el8.x86_64.rpm

    官方离线安装包,测试可用。使用rpm -ivh [rpm完整包名] 进行安装

    Data-UUID-0.14.tar.gz_Data::uuid_uuid

    print "Generated UUID: $uuid_str\n"; my $uuid_bin = $ug->create_bytes(); # 生成二进制形式的UUID ``` 五、UUID在实际应用中的场景 1. 数据库主键:UUID作为数据库记录的主键,能保证每个记录的唯一性,尤其...

    uuid-1.6.2.tar.gz

    uuid-ossp扩展提供了两个主要函数:uuid_generate_v1()和uuid_generate_v4(),它们分别生成基于时间的UUID(Version 1)和随机UUID(Version 4)。时间基的UUID基于当前时间和MAC地址,而随机UUID则完全基于随机数,...

    UUID.rar_UUID C_uuid

    UUID由五个部分组成,包括时间戳、随机数、节点ID以及版本号,确保了生成的每一个UUID几乎不可能与已存在的UUID重复。 GUIDGEN.EXE同样是Windows提供的一个图形化界面工具,用于生成GUID。与UUIDGEN不同,GUIDGEN...

    zoomclone_js_nodejs_webRTC_socketio_ejs_uuid

    zoomclone_js_nodejs_webRTC_socketio_ejs_uuid

    UUID完全解析.txt

    2. **节点ID**:为了进一步提高唯一性,UUID还可能包含节点ID(通常是MAC地址),这样即使在同一时刻生成的UUID也能保证不同。 3. **版本和变体**:UUID有多个版本和变体,不同的版本采用不同的算法来生成。例如,...

    uuid-nginx-module:创建一个新的唯一 UUID 值

    uuid_random $uuid_random ; uuid_time $uuid_time ; uuid_time_safe $uuid_time_safe ; set $not_empty_var "not empty" ; uuid $not_empty_var ; uuid_random $not_empty_var ; uuid_time $not_empty_var ; uuid_...

    udf.rar_linux udf_udf_uuid

    标题“udf.rar_linux udf_udf_uuid”暗示了这个压缩包包含的是与Linux系统下处理UDF文件系统相关的源代码,特别是涉及到读取文件系统标签和UUID的部分。在Linux中,文件系统标签和UUID是用于唯一标识和区分不同文件...

    CREATE_DB_AND_TABLE_add_edit_del-pw.rar_CREATE_DB_AND_TABLE_Tabl

    cmd->CommandText = "CREATE TABLE Employees (ID AUTOINCREMENT PRIMARY KEY, Name VARCHAR(50), Position VARCHAR(50))"; cmd->Execute(NULL, NULL, adCmdText); ``` 插入记录: ```cpp cmd->CommandText = ...

    uuid.rar_uuid

    可能包含了如`uuid_generate()`用于生成新的UUID,`uuid_parse()`解析字符串形式的UUID,以及`uuid_compare()`比较两个UUID是否相同等函数。这些函数的实现通常基于RFC 4122,这是一个定义UUID生成和格式的标准。 ...

Global site tag (gtag.js) - Google Analytics