精华内容
下载资源
问答
  • 实测 Mysql UUID 性能

    2021-01-19 04:47:51
    实测 Mysql UUID 性能网上普遍认为Mysql 使用 UUID 主键性能低下,甚至建议用 自增ID 作为主键并用 UUID作唯一索引的方案。但没有提供具体的数据证明使用 UUID 作为主键时性能究竟低下到何种程度。为此我专门做了...

    实测 Mysql UUID 性能

    网上普遍认为Mysql  使用 UUID 主键性能低下,甚至建议用 自增ID 作为主键并用 UUID作唯一索引的方案。但没有提供具体的数据证明使用 UUID 作为主键时性能究竟低下到何种程度。为此我专门做了测试。

    测试环境:WindowsXP ,内存 4G , CPU : Duo T6570 , mysql : 5.1.36

    测试准备:

    1、 建表

    我建了3 个表来做性能比对

    表一:uuidtest_inno

    CREATE TABLE `uuidtest_inno` (

    `id` char(36) CHARACTER SET utf8 NOT NULL DEFAULT '',

    PRIMARY KEY (`id`)

    ) ENGINE=InnoDB DEFAULT CHARSET=latin1

    表二:uuidtest_myisam

    CREATE TABLE `uuidtest_myisam` (

    `id` char(36) CHARACTER SET utf8 NOT NULL DEFAULT '',

    PRIMARY KEY (`id`)

    ) ENGINE=MyISAM DEFAULT CHARSET=latin1

    表三:uuidtest_int

    CREATE TABLE `uuidtest_int` (

    `id` int(11) NOT NULL AUTO_INCREMENT,

    `test` varchar(255) CHARACTER SET latin1 DEFAULT NULL,

    PRIMARY KEY (`id`)

    ) ENGINE=MyISAM DEFAULT CHARSET=utf8

    可以看到,表一使用UUID 主键,引擎为 InnodB ;表二使用 UUID 主键,引擎为 MyISAM ;表三使用 自增ID ,引擎为MyISAM ;

    1、 编写存储过程

    编写存储过程分别插入100000 条记录:

    p_uuid_inno

    BEGIN

    set @i = 0;

    while @i < 100000 do

    insert into uuidtest_inno value(uuid());

    set @i = @i+1;

    end while ;

    END

    p_uuid_myisam

    BEGIN

    set @i = 0;

    while @i < 100000 do

    insert into uuidtest_myisam value(uuid());

    set @i = @i+1;

    end while ;

    END

    p_uuid_int

    BEGIN

    set @i = 0;

    while @i < 100000 do

    insert into uuidtest_int(test) value("test");

    set @i = @i+1;

    end while ;

    END

    1、 运行

    [SQL] call p_uuid_int;

    影响的数据栏: 0

    时间: 12.922ms

    call p_uuid_myisam;

    影响的数据栏: 0

    时间: 15.078ms

    call p_uuid_inno;

    影响的数据栏: 0

    时间: 4460.297ms

    结论:当数据表的引擎为MyISAM 时,自增 ID 无疑是效率最高的, UUID 效率略低,但不会低到无法接受。一旦数据引擎为 InnodB 时,效率下降非常严重,已经达到令人发指的地步。由于 InnodB 主键采用 聚集索引 ,会对插入的记录进行物理排序,而 UUID本身基本上是无序的,所以造成了巨大的 I/O 开销。所以如果使用 innodB  千万不要使用 UUID 。

    转载:http://cornerxp.iteye.com/blog/977463

    展开全文
  • UUID几个缺点

    千次阅读 2018-03-21 10:47:45
    第一个 UUID字符串占用的空间比较大。 第二个 索引效率很低。 第三个 生成的ID很随机,不是人能读懂的。 第四个 做不了递增,如果要排序的话,基本不太可能。...

    第一个


    UUID字符串占用的空间比较大。


    第二个


    索引效率很低。


    第三个


    生成的ID很随机,不是人能读懂的。


    第四个


    做不了递增,如果要排序的话,基本不太可能。

    展开全文
  • 1.无序,无法预测他的生成顺序,不能生成递增有序的数字。 首先分布式id一般都会作为主键...既然分布式id是主键,然后主键时包含索引的,然后mysql的索引是通过b+树来实现的,每一次新的UUID数据的插入,为了查询的优化

    1.无序,无法预测他的生成顺序,不能生成递增有序的数字。
    首先分布式id一般都会作为主键,但是安装mysql官方推荐主键要尽量越短越好,UUID每一个都很长,所以不是很推荐。
    2.主键,ID作为主键时在特定的环境会存在一些问题
    比如做DB主键的场景下,UUID就非常不适用Mysql官方有明确的建议主键要尽量越短越好36个字符长度的UUID不符合要求。
    3.索引,B+树索引的分裂
    既然分布式id是主键,然后主键时包含索引的,然后mysql的索引是通过b+树来实现的,每一次新的UUID数据的插入,为了查询的优化,都会对索引底层的b+树进行修改,因为UUID数据都是无序的,所以每一次UUID数据的插入都会对主键的b+树进行很大的修改,这一点很不好,插入完全无序,不但会导致一些中间节点产生分裂,也会白白创造出很多不饱和的节点,这样大大降低了数据库插入的性能。

    展开全文
  • Mysql可以使用字符串前缀 作为索引 以节约空间。下面我们以 Java的UUID 生成的 32位(移除UUID中的 中划线)字符串 来做一下 测试。表结构:CREATE TABLE `test_uuid` (`id` int(10) unsigned NOT NULL AUTO_INCREMENT...

    Mysql可以使用字符串前缀 作为索引 以节约空间。

    下面我们以 Java的UUID 生成的 32位(移除UUID中的 中划线)字符串 来做一下 测试。

    表结构:

    CREATE TABLE `test_uuid` (

    `id` int(10) unsigned NOT NULL AUTO_INCREMENT,

    `uuid` varchar(36) DEFAULT NULL,

    PRIMARY KEY (`id`)

    ) ENGINE=InnoDB AUTO_INCREMENT DEFAULT CHARSET=utf8

    UUID生成的方式(不考虑replaceAll的替换效率):

    UUID.randomUUID().toString().replaceAll("-", "")

    查询 不同长度的前缀索引效率(索引的选择性,即不重复的索引值)的SQL:

    select

    count(DISTINCT uuid) / count(*) as total,

    count(DISTINCT LEFT(uuid,5)) / count(*) as five,

    count(DISTINCT LEFT(uuid,6)) / count(*) as six,

    count(DISTINCT LEFT(uuid,7)) / count(*) as seven,

    count(DISTINCT LEFT(uuid,8)) / count(*) as eight,

    count(DISTINCT LEFT(uuid,9)) / count(*) as nine,

    count(DISTINCT LEFT(uuid,10)) / count(*) as ten

    from test_uuid;

    下面看一下测试数据及结果:

    20W数据

    9faa45b78e602abecbbc5e3c7a8b5581.png

    40W

    640cc88a3dcd72f486596fb81f0eaa31.png

    60W

    af8657383726b7dd6d33abb448b44ecc.png

    80W

    cf5a9cd2525cf0fc6879e665fd702051.png

    100W

    77ee31bf60b66e6b7659dbd189c7e3c9.png

    200W

    f263c458857f2c83727e72b5410018b2.png

    300W

    fb9c44ae25040c67a68ee98f679f65fe.png

    500W

    d30fc69d9c10625d5bd0525d85af7b77.png

    1000W

    cf75288c3c55c785204577c2d84d69e9.png

    2000W

    e0fe5ecb9e17b33e2a2c472b982f2f79.png

    随着数据量的增多,同样长度的前缀索引选择性 逐渐降低。

    前7位 在2000W数据的时候损失了 0.04, 也就是说 每100 条数据, 会有4条与其他96条数据 有重复。

    前9位 在2000W数据的时候损失了 0.0001 ,也就是说 每10000 条数据,会有1 条与 其他 9999条有重复。

    前10位 在2000W数据的时候 选择行 依然为1 (前10位没有任何重复的)。

    大家可以算一下 26的10次方,大概是 141 万 亿。

    当然,以上数据 我只做过一次, 其他测试数据应该与 本次测试数据 稍有不同,但可以肯定的是:不会相差很多。

    所以,当业务需要使用 uuid 作为 业务唯一的key时, 可以评估业务数据量,选择合适长度的前缀索引。

    前缀索引的选择性 越接近 总长度索引的选择性 时,说明已经可以了。

    但是,前缀索引有一些缺点:

    1. Mysql 前缀索引 不支持 order by 和 group by 查询。

    2 Mysql 前缀索引 不能作为 覆盖索引使用。

    各位大佬有问题,欢迎交流。

    展开全文
  • 索引开始的部分字符,这样可以大大节约索引空间,从而提高索引效率,但这样也会降低索引的选择性。索引的选择性是指不重复的索引值(也称为基数,cardinality)和数据表的记录总数的比值。计算公式:SELECT COUNT...
  • UUID做主键,好还是不好?这是个问题。

    万次阅读 多人点赞 2017-02-04 15:06:48
    以前对UUID的了解很少,只知道是128位整数(16字节)的全局唯一标识符(Universally Unique Identifier)。 刚才google了下,算是有了点深入的了解。 UUID是指在一台机器上生成的数字,它保证对在同一时空中的所有机器...
  • python的uuid都是32位的,比较长,处理起来效率比较低, 本算法利用62个可打印字符,通过随机生成32位UUID,由于UUID都为十六进制,所以将UUID分成8组,每4个为一组,然后通过模62操作,结果作为索引取出字符, 最后...
  • 需要配置offset,数据整合复杂2.uuid一些场景,更适合uuid分库分表:UUID支持对表进行水平划分,将数据分布存储在多台不同的机器上,动态扩缩容。内存生成对象,对象id在内存做关联运算时,可以使用u...
  • MySQL 索引MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度。打个比方,如果合理的设计且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索引的MySQL就是一个人力三轮车。...
  • 数据库主键性能对比:名称 存储长度 生成方式1. uuid 32+4 uuid()函数2. uuid20 20 UUID_SHORT()函数3.bigint自增 20 auto_increment测试表:id_int()、--uuid测试表CREATETABLE`id_uuid`(`id`...
  • 一个开发同事做了一个框架,里面主键是uuid,我跟他建议说MySQL不要用uuid用自增主键,自增主键效率高,他说不一定高,我说innodb的索引特性导致了自增id做主键是效率最好的,为了说服他,所以准备做一个详细的测试...
  • mysql 自增id和UUID做主键性能分析,及最优方案 1.为什么要使用uuid做主键 (1).其实在innodb存储引擎下,自增长的id做主键性能已经达到了最佳。不论是存储和读取速度都是最快的,而且占的存储空间也是最小。 (2...
  • mysql 自增id和UUID作主键性能分析,及最优方案1.为何会想到用uuid作主键(1).其实在innodb存储引擎下,自增加的id作主键性能已经达到了最佳。不管是存储和读取速度都是最快的,并且占的存储空间也是最小。mysql(2)....
  • 现在对其建索引,测试索引对查询和操作的效率影响情况。--operlog的表结构----------create table LAB1107.OPERLOG(LOGID VARCHAR2(18) not null,OPERTABLE VARCHAR2(100) not null,OPERKEY VA...
  • 在学习设计索引的原则之前需要了解到 Mysql针对主键索引会维护一个B+树,也称之为聚簇索引。针对非主键(一般都是建立的联合索引)会对索引字段依次排序,然后从第一个字段值开始比较,如果相同就针对下一个字段值...
  • 所以第1、3个查询都是直接从辅助索引中查询,并且获取索引值返回,大大加快了效率,但是第三个查询,MySQL会自动采用唯一键"UUID"作为索引,这是为什么呢。而第二个遍历的是主键索引,而且数据量大,IO操作频繁。
  • MySQL UUID做主键

    2021-02-03 18:55:36
    我唯一还算熟悉的数据库就算是MySQL了,大概使用MySQL的人,百分之九九以上的人会使用Autoincrement ID做主键,这是可以理解的,因为MySQL的自增ID效率很高,使用也很方便。那么剩下的百分之一的人使用什么做主键呢...
  • mysql主键自增和UUID的区别

    万次阅读 2020-06-29 23:35:21
    在进行数据库插入时,位置相对固定(B+树中的右下角)增加数据插入效率,减少插入的磁盘IO消耗,每页的空间在填满的情况下再去申请下一个空间,底层物理连续性更好,能更好的支持区间查找 2、UUID 由于UUID是随机...
  • java UUID做主键

    2021-01-27 15:56:20
    我唯一还算熟悉的数据库就算是MySQL了,大概使用MySQL的人,百分之九九以上的人会使用Autoincrement ID做主键,这是可以理解的,因为MySQL的自增ID效率很高,使用也很方便。那么剩下的百分之一的人使用什么做主键呢...
  • The UUID in MySQL8

    2021-02-04 02:08:24
    我顿时无语,考虑的还是挺周到,没有意识到这么长字段做主键的问题:首先这个主键很长,而主键会自动添加在每一二级索引的后面,这样会导致数据冗余严重,特别是二级索引建多了的情况下,有时会导致索引的数据比表的...
  • 1. 什么是索引?索引是一种排好序的数据结构(存储数据),可以帮助我们快速的进行数据的查找.索引是帮助高效获取数据的数据结构,索引是一个文件1)索引有哪些类型:Hash二叉树红黑树Hash:根据值进行Hash值 Hash(id),...
  • 通用唯一识别码: UUID

    2018-12-01 16:26:29
    什么是UUID? UUID 是 通用唯一识别码(Universally Unique Identifier)的缩写,是一种软件建构的标准,亦为开放软件基金会组织在分布式计算环境领域的一部分。其目的,是让分布式系统中的所有元素,都能有唯一的...
  • MySQL之索引详解

    2021-09-05 22:15:50
    索引的设计可以遵循一些已有的原则,创建索引的时候请尽量考虑符合这些原则,便于 提升索引的使用效率,更高效地使用索引。 搜索的索引列,不一定是所要选择的列。换句话说,最适合索引的列是出现在 WHERE 子句中的...
  • 1. UUID 是什么?UUID(Universally Unique Identifier 通用唯一识别码)用于标识资源唯一性。理论上说,门牌号、电话号码、邮编、身份证号都是用来标识资源唯一性的,但为使用方便,不适合用一个无规律的字符串表示,...
  • MySQL 自增主键和UUID

    2021-02-02 14:23:21
    关于自增主键和UUID的比较,可以从数据插入前,插入中,插入三个阶段进行比较,他们有各自的有点,当然也有各自的不足。下面就分三个阶段说说优缺点。插入前1)UUID 需要手动维护,要求是保证每次生成的数据都是不...
  • UUID/GUID介绍、生成规则及生成代码

    千次阅读 2020-10-12 23:57:36
    urn:uuid:123e4567-e89b-12d3-a456-426655440000 1.2 UUID优势 无需网络,单机自行生成 速度快,QPS高(支持100ns级并发) 各语言均有相应实现库供直接使用 1.3 UUID劣势 String存储,占空间,DB查询及索引效率低 ...
  • MySQL创建全文索引

    2021-01-18 23:40:54
    在MySql数据库中,有四种索引:聚焦索引(主键索引)、普通索引、唯一索引以及我们这里将要介绍的全文索引(FUNLLTEXTINDEX)。全文索引(也称全文检索)是目前搜索引擎使用的一种关键技术。它能够利用【分词技术】等多种...
  • 最后发现是UUID的问题,UUID作为主键在数据进行插入的时候对于系统的压力是非常大的。 UUID(Universally Unique Identifier)介绍 UUID结构如上图所示,比如7bf13c38-00a1-484e-b1e2-80c1ab8e754c,作为...
  • 如果InnoDB表的数据写入顺序能和B+树索引的叶子节点顺序一致的话,这时候存取效率是最高的。为了存储和查询性能应该使用自增长id做主键。 (2). 对于InnoDB的主索引,数据会按照主键进行排序,由于UUID的无序性,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 16,152
精华内容 6,460
关键字:

uuid索引效率