我正在做一个项目,其中一些客户有互联网连接问题。
当互联网连接不起作用时,我们将信息存储在位于客户端 PC 的数据库中。 当我们再次建立连接时,我们将本地数据库与中央数据库同步。
为避免两个数据库之间的记录 ID 发生冲突,我们将使用 UUID [char(36)] 而不是自动增量。
数据库是带有InnoDB引擎的Mysql。
我的问题是这会对选择、连接等的性能产生影响吗? 我们应该使用 varbinary(16) 而不是 char(36) 来提高性能吗?
注意:我们已经有一个包含 4 个 Go 数据的现有数据库 我们也欢迎其他建议来解决此离线/在线问题。
谢谢
最佳答案
由于您没有说明正在使用哪个数据库引擎(MyISAM 或 InnoDB),因此很难说出性能影响的大小。
但是,简而言之 - 是的,较大的数据集会影响性能。 这样做的原因是主键索引需要 36 个字节,而整数需要 4 个字节(如果是 bigint,则为 8 个字节)。
我会提示您如何避免冲突:
首先是在数据库上有不同的自动增量偏移量。如果您有 2 个数据库,则自动增量在一个数据库上为奇数,在另一个数据库上为偶数。
其次是要有复合主键。如果您将主键定义为 PRIMARY KEY(id, server_id)
,那么在将数据复制到中央数据库时不会发生任何冲突。
你也会知道它来自哪里。
缺点是您需要为您执行的每个查询提供 server_id。
关于mysql - 离线同步(Performance UUID为主键),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6466459/