我正在开展一个项目,其中一些客户有互联网连接问题。
当互联网连接不起作用时,我们将信息存储在客户端PC中的数据库中。 当我们再次获得连接时,我们将本地数据库与中央数据库进行同步。
为了避免两个数据库之间的记录ID冲突,我们将使用UUID [char(36)]而不是自动增量。
数据库是带有InnoDB引擎的Mysql。
我的问题是这会对选择,加入等的性能产生影响吗? 我们应该使用varbinary(16)而不是char(36)来提高性能吗?
注意:我们已经有一个包含4个Go数据的现有数据库 我们也欢迎其他建议来解决此离线/在线问题。
由于
答案 0 :(得分:2)
由于您没有说明正在使用哪个数据库引擎(MyISAM或InnoDB),因此很难说出性能影响的大小。
然而,要简短地讲述这个故事 - 是的,对更大的数据集会有性能影响。 原因是你需要36个字节用于主键索引,而4个(8个bigint)字节用于整数。
我会告诉你如何避免冲突:
首先是在数据库上有不同的自动增量偏移量。如果你有2个数据库,你的自动增量在一个数据库上是奇数,甚至在另一个数据库上也是奇数。
第二是拥有复合主键。如果将主键定义为PRIMARY KEY(id, server_id)
,那么如果将数据复制到中央数据库中,则不会发生任何冲突。
你也会知道它来自哪里。
缺点是您需要为每个查询提供server_id。