
中表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存储引擎采用的是聚簇索引。聚簇索引采做胡用的是平衡二叉树算法,而且每个节点都保存了该主键所对应行的数据,假设插入数据的主键是自增长的,那么根据二叉树算法会很快的把该数据添加到某个节点下,而其他的节点不用动;迟咐但是如果插入的是不规则的数据,那么每次插纯旦拦入都会改变二叉树之前的数据状态。从而导致了页分裂。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)