存储MySql表的随机ID

时间:2017-12-30 16:23:49

标签: mysql random sql-order-by

我有一个大型(1.5M-2M)记录MySQL表,我正在将其编入Sphinx

我需要ID是随机/非顺序的,因为我正在执行两级订单(order by FieldA DESC,FieldB DESC),然后默认按ID排序。这给我带来了不良后果,因为我通过供应商存储我的数据,并且在实施FieldA和FieldB订单后我会更喜欢更多的随机供应商。

由于我无法想出如何动态执行此操作,我尝试了以下操作,我在小表上测试以生成随机唯一整数:

-- Update IGNORE Table
Set ID=FLOOR(RAND() * 2000000);

但是大约一个小时后就放弃了这种方法

是否有一些有效的方法来生成随机ID?

2 个答案:

答案 0 :(得分:2)

您可以将日期用作唯一ID,然后使用密钥对其进行加密:

SET ID = HEX(AES_ENCRYPT(CONCAT(NOW(), RAND()), 'secret_key'));

这是一个加密安全性较低的替代(to enhance performance)

SET ID = MD5(CONCAT(NOW(), RAND()));

注意:如果在同一秒内插入多行,则上述两个建议都会使用随机盐和日期来规避原本存在的时间戳冲突。

答案 1 :(得分:0)

无冲突地随机化订单的一种简单方法是随机化并分配一个新的单调增加的id。

下面的示例假设您没有运行其他并发插入(否则会导致竞争条件)。

SET @id = (SELECT MAX(ID) FROM MyTable);

UPDATE MyTable
SET ID = @id:=@id+1
ORDER BY RAND();

我从1开始重新编号,高于之前的最大ID,因为如果我们尝试在相同的id范围内随机重新编号,则很有可能导致冲突。