我们的主服务器(PHP / MySQL)上有一个数据库,用于存储我们通过网站更新的数据。我正在试图找出将这些数据复制到本地SQLite数据库(在android上运行)的最佳方法。由于移动互联网速度的限制等,我需要建立检查以查看每行是否需要更新。认为每行的版本号可能是最好的解决方案。
人们对此有何看法?
谢谢, 森
答案 0 :(得分:1)
不会更容易使用时间戳吗?只需获取自特定时间以来更新的所有行。您需要复制多少数据?
答案 1 :(得分:1)
根据数据库的大小,binary search可能值得。
基本上,提出一个在行子集上运行MD5()
的查询。然后就像以二进制方式沿着树走下去一样简单,跳过匹配的那些部分。步骤进行:
预先计算搜索的前3个级别(或左右),将其发送给客户端。
在客户端上,计算这3个级别,检查匹配项。在那些不匹配的计算中,计算3个级别(每个非匹配级别3个14个哈希值)并发送回服务器。
在服务器上,计算接下来的3个级别,并与客户端发送的内容进行比较。为不匹配的行计算接下来的3个级别。
重复2-3,直到每个限制中的行数达到1。在那之后,您已经确定了差异,因此从服务器发送/请求它们,您就完成了。
现在,为什么这比发送转储更有效?好吧,对于1行更改,将转换大约log(total_rows, 2) * (sizeofMD5 + 2)
个字节(不包括开销)。因此,对于100万行表,它将需要大约352字节的方向数据来确定更改的行。现在,更改的行越多,它将使用的数据就越多。
我选择3批次,因为在处理额外数据和减少延迟与连接数量之间是一个很好的平衡。
现在,就哈希行而言,您可以执行以下操作:
SELECT MD5(GROUP_CONCAT(row)) AS checksum FROM
(
SELECT 1 AS grouping, MD5(CONCAT(id, col2, col3)) AS row
FROM table
ORDER BY id ASC
WHERE id > ? AND id < ?
) AS a
GROUP BY grouping
哪个会生成一个MD5,它依赖于限制中的每一行。 (还有其他方法,但这是一个例子)。然后用0, count(rows)
调用它来检查整个表格,然后从那里迭代链。
请注意,这仅适用于具有整数PK的表(因为它用作二分查找的边界窗口)。但它会以相同的速度,效率和代码检测每种类型的更改(主 - 删除,从 - 删除,主 - 更改,从 - 更改,主 - 插入,从 - 插入)。