小白请教如何在mysql数据库中使用uuid为主键

小白请教如何在mysql数据库中使用uuid为主键,第1张

MYSQL

中表1需要准备大量数据,内容主要取自表2,id必须为32位uuid

(项目所有明模表都是这样,没办法),

准备这样插入:

1

INSERT

INTO

TBL_ONE

(ID,

SOID,

SNAME)

SELECT

2

REPLACE

(UUID(),

'-',

''),

3

TWO.ID,

4

TWO.NAME

5

FROM

6

TBL_TWO

TWO

报错:

Duplicate

entry

'4534c15dc2a111e6a9ab000ec6c596eb'

for

key

'PRIMARY',显然主键冲突了告槐橘,

REPLACE

(UUID(),

'-',

'')

仅执行了一次,

找了半天,似乎也没有最简单的解决方案。退而求其次,我想到的最简单解决方案:

1

INSERT

INTO

TBL_ONE

(ID,

SOID,

SNAME)

SELECT

2

UUID(),

#UUID()为什么可以?

3

TWO.ID,

4

TWO.

NAME

5

FROM

6

TBL_TWO

TWO7

8

UPDATE

TBL_ONE

SET

ID

=

REPLACE

(ID,

'-',

'')

uuid()生成的id不会重复,但是会有"-",用空格替换一下就ok了。袜团

作为主键,UUID长度过长,主键索引KeyLength长度过大,而影响能够基于内存的索引记录数量,进而影响基于内存此核的索引森弯掘命中率,而基于硬盘进行索引查询性能很差。严重影响数据库服务器整体的性能表现。 建议,

如果考虑分布式,可以仿造MongoDB建立索引,能有效实现服务器同步,KeyLength也很小。如果使用UUID进行数据同步管理,需要对UUID字符串进行Djb的Hash算法,然后对Int/Long类型的哈希数值进行索引闹山。第一次检索,通过UUIDHashCode将结果集范围缩小,再使用UUID定位具体数据。这样性能能高很多。使用Int类型的ID作为主键。UUID不作为主键,而仅作为数据同步的标记字段被使用。

主要和索引有关,myisam存储引擎使用的是非聚簇索引,而innodb存储引擎采用的是聚簇索引。聚簇索引采做胡用的是平衡二叉树算法,而且每个节点都保存了该主键所对应行的数据,假设插入数据的主键是自增长的,那么根据二叉树算法会很快的把该数据添加到某个节点下,而其他的节点不用动;迟咐但是如果插入的是不规则的数据,那么每次插纯旦拦入都会改变二叉树之前的数据状态。从而导致了页分裂。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/bake/11974644.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-20
下一篇2023-05-20

发表评论

登录后才能评论

评论列表(0条)

    保存