给我们看一个前10个值的样本。
这就是为什么你可能会“撞墙”…索引可以分为两种类型(在一个级别上):
连续的,如
AUTO_INCREMENT
值,或
TIMESTAMPs
,按时间顺序插入行,甚至大致按时间顺序插入行。这些值被插入到表或索引的“末尾”,并且只命中btree的最后一个块(或几个块)。由于所有的活动只在几个块中进行,因此几乎没有要执行的I/O。
随机的,如UUID、MD5和其他“随机”值,可能包括您的值。在这种情况下,插入到表/索引中的“next”值不太可能仍然缓存在RAM中。因此需要I/O。虽然表不太大,但是所有的索引块都可以保存在RAM中,所以只需要很少的I/O。但是,当索引大于缓存后,添加“next”值的操作通常需要进行I/O。您的过程将变得越来越慢。
怎么办?
方案A:添加“随机”索引
之后
插入所有行。添加索引将非常缓慢,但从长远来看可能更快,因为它可以使用不同的算法。
计划B:不要预先创造所有的价值观。相反,在需要时创建下一个。
方案C:购买足够的随机存取储存器(RAM),将“随机”指数完全保存在随机存取储存器(RAM)中。(计划有大约2倍的索引大小。)
计划D:你试过托卡布吗?我希望它能在遇到严重麻烦之前存活更长时间。你的经历是什么?
你提到了交易。请详细说明。你是说每5000个密码
INSERTed
在交易中?这可能是最理想的。
您的唯一编号使用什么字符集和排序规则?您可能应该使用ascii和ascii_-bin——以提高速度并避免折叠大小写的问题。
还有…下面是关于如何生成它们的另一个想法。您无需检查唯一性,因为它们将生成唯一性:
把10个字符串想象成以95为基数的整数编码方式编码的数字。(或您允许的许多不同字符)。我们将按顺序生成数字,将其转换为字符串,然后随机化。
“下一个”值作为超过“当前”值的随机值计算。随机值需要在1到大约10亿的增量之间(这取决于最终需要多少数字、字符集等)。
INSERT
将5K(或其他)批处理到没有索引的myisam表中。
完成后,请执行以下操作:
CREATE TABLE real (
id ... AUTO_INCREMENT, -- do you really need this??
random CHAR(10), NOT NULL CHARSET ascii COLLATE ascii_bin,
PRIMARY KEY(id), -- what for?
INDEX(random) -- uniqueness has been checked
INSERT INTO real (random)
SELECT random FROM myisam_table
ORDER BY RAND();
这是如何实现的:
从基本上是一个平面文件(myisam表)中获取所有“随机”字符串。
使用unix-sort对它们进行加扰。
插入
他们进入
real
表,创建顺序
ids
就这样。
注意:这将创建一个巨大的撤消表,因此一定要有大量的磁盘空间。
至于我关于离开的意见
id
,
UNIQUE
等等,请提供您打算如何使用的信息
真实的
所以我可以同意或反对他们的需要。
另一个计划
不要预先生成值。相反,从大约14t的可能值生成一个新值,检查DUP,必要时生成另一个。在这个计划中,表将根据需要逐渐增长,而不是在最初的构建过程中挣扎。相反,只要需要一个新的值,就会花费一点精力(毫秒)。可以将其包装在存储函数中,以方便用户使用。
这个表只有一列,
unique_code CHAR(10) CHARSET ascii PRIMARY KEY
.