隐藏MySQL数据库表中的插入顺序

隐藏MySQL数据库表中的插入顺序,mysql,mariadb,sql-insert,Mysql,Mariadb,Sql Insert,根据定义,MySQL表中的行没有可靠的“自然”顺序,除非添加递增ID、时间戳等。但是,在运行SELECT(无顺序)时,我通常可以重建添加(插入)行的顺序 出于隐私的原因,我试图摆脱这种“内部”秩序。如果我有一个Excel工作表,我会在另一个随机选择的行之前插入新行。但是在MySQL中,没有在之后插入 有什么想法吗 背景 我需要隐藏两行(在同一个表中“同时”插入),甚至在一个事务中)属于一起。其中一个(一个邪恶的雇员,有人入侵服务器)不应该能够重建这两个条目之间的关系 已考虑的解决方案 使用IN

根据定义,MySQL表中的行没有可靠的“自然”顺序,除非添加递增ID、时间戳等。但是,在运行SELECT(无顺序)时,我通常可以重建添加(插入)行的顺序

出于隐私的原因,我试图摆脱这种“内部”秩序。如果我有一个Excel工作表,我会在另一个随机选择的行之前插入新行。但是在MySQL中,没有在之后插入

有什么想法吗

背景

我需要隐藏两行(在同一个表中“同时”插入),甚至在一个事务中)属于一起。其中一个(一个邪恶的雇员,有人入侵服务器)不应该能够重建这两个条目之间的关系

已考虑的解决方案

  • 使用
    INSERT-SELECT
    ->重新创建数据库副本将不起作用,因为该表非常大,有许多插入项,并且锁定该表以便重新写入将是一个问题
  • 删除并重新插入另一行添加一对->在一个大表中,许多行将保持原始顺序,偶然性缺乏可靠性:(

默认的存储引擎InnoDB总是按主键组织表。如果您在查询时不按
排序,MySQL将按其用于访问表的索引顺序(主键顺序或使用任何辅助索引的顺序)返回行

这可能是将UUID用作主键的好机会


UUID看起来是一个随机唯一的数字,尽管它确实有一些结构。推断哪些行按时间顺序彼此靠近需要(这意味着几乎所有潜在的邪恶员工都不会知道它)。

正如Bill Karwin已经指出的(我在这里重复)InnoDB表总是有组织的集群密钥的“顺序”。对于集群密钥,InnoDB使用主键。如果没有主键,则使用第一个非空的唯一密钥。否则,使用合成密钥

要以更“随机”的顺序插入行,我们需要一个不显示插入顺序的集群键

但是更改集群键需要重建表rebuild,这似乎已经被排除

Bill Karwin建议使用UUID作为集群密钥

另一种选择是在集群键中添加一个合成列作为前导列,合成列的值可以由BEFORE INSERT触发器填充。触发器可以使用算法生成伪随机值,使用从其他列值和/或RAND()函数返回的哈希计算

我们还需要确保没有任何其他索引可以用来确定插入顺序


但所有这些选项都需要重建表。

“根据定义,MySQL表中的行没有可靠的“自然”顺序,除非我添加递增ID、时间戳等“确实,当您使用ORDER BY时,当您从该表中选择以保持该顺序时。您最好的选择可能是存储过程..但如果没有示例表、示例数据和预期输出,很难说。@RaymondNijland他的“预期输出”是对期望的否定。他希望查询结果不带ORDER BY与行惰性化的顺序无关。@RaymondNijland他希望阻止用户推断插入顺序。为什么您允许不受信任的用户直接对DB运行自定义查询?如果您强迫他们通过您r API,您应该能够使用
ORDER BY
子句来防止它们检测到存储的订单。感谢您的澄清,特别是关于合成键的提示。重建表本身不是问题,我只是排除了定期(例如,每小时一次)这样做的可能性-这也可能是一个相当愚蠢的想法。。。