30亿数据存mysql6_在数亿数据后缓慢插入mysql/mariadb

给我们看一个前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

.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值