- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在开发一个项目,需要我生成数十亿个唯一代码。目前,我使用 MariaDB 与 InnoDB 引擎和 python 来生成随机唯一代码,每个生成周期插入一批 5000 个唯一代码。
我的表结构:
row_id int --primary key + autoincrement
unique_code varchar(10) --unique
问题:当我达到 500.000.000 个左右的唯一代码时,插入变得非常慢,而且我仍然需要生成多达 30 亿个代码。在达到这么多记录之前,我可以在几个小时内插入 300-4 亿个唯一代码。
任何帮助将不胜感激,谢谢!
更新(2019 年 1 月 22 日)正在接听Rick James ' 解决方案。以下是生成代码的一些示例:
RLXT$CPS1Y
Y4P$9K70WO
PKSTY9M$FR
T$0VEFL2B1
RX4$MEKVQL
我的服务器有 32GB RAM 和相对较快的 SAS 硬盘,我认为它足以满足我的需求(或者不是?)。
根据我的经验,TokuDB 的插入速度较慢,在达到 100m 条记录之前会很困难,所以当时我选择了 InnoDB。
至于我之前提到的事务:是的,一次插入5000条记录。直到150m代码时速度才这么快,之后我发现随着记录的增长速度逐渐下降。现在我正在处理 800m 的代码,一个插入周期需要 10 到 15 秒(5000 个记录)。
我使用自动增量id来排序和标记记录,因为这些代码将被传输到另一个数据库进行打印(生产)。所以我需要知道哪些代码已经被转移,哪些没有。
我会等待进一步的答复,同时我会尝试Rick's suggestions 。谢谢!
最佳答案
向我们展示前 10 个值的示例。
这就是为什么您可能会“碰壁”...索引可以(在某个级别上)分为两种类型:
连续,例如 AUTO_INCRMENT
值或 TIMESTAMP
,您可以在其中按时间顺序甚至大致按时间顺序插入行。这些值被插入到表或索引的“末尾”,并且仅命中 BTree 的最后一个 block (或几个 block )。通过将所有事件集中在几个 block 中,几乎不需要执行 I/O。
随机,例如 UUID、MD5 和其他“随机”值,大概包括您的值。在这种情况下,要插入表/索引的“下一个”值不太可能仍缓存在 RAM 中。所以需要I/O。虽然表不是太大,但所有索引 block 都可以保存在 RAM 中,因此需要很少的 I/O。但是,当索引变得大于缓存之后,添加“下一个”值的操作通常需要执行 I/O。你的进程会变得越来越慢。
要做什么?
计划 A:插入所有行后添加“随机”索引。添加索引会非常慢,但从长远来看可能会更快,因为它可以使用不同的算法。
B 计划:不要预先创建所有值。相反,请在需要时创建下一个。
C 计划:购买足够的 RAM 以将“随机”索引完全保存在 RAM 中。 (计划索引大小约为 2 倍。)
D计划:你尝试过TokuDB吗?我希望它在陷入严重麻烦之前能够生存更长时间。您的经历如何。
您提到了交易。请详细说明。您的意思是在一次交易中每 5000 个代码都插入
吗?这可能是最佳的。
您的唯一编号使用什么字符集和排序规则?您可能应该使用 ascii 和 ascii_bin ——以提高速度并避免大小写折叠问题。
而且...这是关于如何生成它们的另一个想法。您无需检查唯一性,因为它们将生成唯一的:
将 10 个字符的字符串视为以 base-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();
其执行方式如下:
INSERT
将它们插入到 real
表中,从而创建连续的 ids
。注意:这将创建一个巨大的撤消表,因此请确保有足够的磁盘空间。
至于我关于省略 id
、UNIQUE
等的评论,请提供有关您打算如何使用 real
的信息,所以我可以同意或反对他们的需求。
另一个计划
不要预先生成值。相反,从大约 14T 可能值中生成一个新值,检查重复项,如有必要,生成另一个值。在此计划中,表根据需要逐渐增长,而不是最初必须努力构建它。相反,每当需要新值时,就会花费一点精力(毫秒)。可以将其包装在存储函数中,以方便用户使用。
该表只有一列,unique_code CHAR(10) CHARSET ascii PRIMARY KEY
。
关于python - MySQL/MariaDB 在数亿数据后插入缓慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54283381/
我有 512 行要插入到数据库中。我想知道提交多个插入内容是否比提交一个大插入内容有任何优势。例如 1x 512 行插入 -- INSERT INTO mydb.mytable (id, phonen
已经提出了类似的问题,但由于它总是取决于,我单独询问我的具体情况。 我有一个网站页面,显示来自数据库的一些数据,要从该数据库生成数据,我必须执行一些相当复杂的多连接查询。 数据每天(每晚)更新一次。
我正在使用 MongoDb 和 MySQL 的 python 连接器 pymongo 和 pymysql 测试 MongoDb 和 MySQL,特别是插入功能。 pymongo版本是3.4,pymys
从 C# 应用程序插入大型数组(10M 元素)的最快方法是什么? 到目前为止,我使用的是批量插入。 C# 应用程序生成一个大文本文件,我使用 BULK INSERT 命令加载它。出于好奇,我编写了一个
我编写了一个枚举类型,当我为它运行我创建的 JUnit 测试时会出现以下语法错误: java.lang.Error: Unresolved compilation problems: Synt
我正在尝试创建一个程序,它将单词列表作为输入,并将它们排序为二叉树,以便能够找到它们,例如像字典。这是我到目前为止所做的,但是 newEl -> el = input; 出现段错误,我知道这是因为它试
你好 我有编译这个问题 \begin{equation} J = \sum_{j=1}^{C} \end{equation} 我不断收到错误 missing $ inserted 这很奇怪,因
我需要使用 LINQ to SQL 将记录插入到没有主键的表中。 table 设计得很差;我无法控制表结构。该表由几个 varchar 字段、一个文本字段和一个时间戳组成。它用作其他实体的审计跟踪。
我正在尝试使用 itextsharp 创建 Pdf。我添加了一张包含两列的表格,其中一列包含文本和其他图像。我想要恒定的图像大小 如果另一个单元格中的文本增加并且其他单元格中的图像大小不同,我的图像会
我想把 calory 作为 fruits 的第一个值,我做不到,有人能帮忙吗? $sql = 'INSERT INTO fruits VALUES('', ?, ?, ?)'
我有一个包含季度观察结果的 data.frame。我现在想插入每月值(首选三次,线性很好)。中间目标应该是使用 DATE 创建一个 data.frame作为所有每月观察的索引和缺失值。 谷歌搜索表明我
我想知道是否有办法在值列表中使用“插入”。我正在尝试这样做: insert into tblMyTable (Col1, Col2, Col3) values('value1', value
我想让人们能够在他们的网站中插入单个 Javascript 行,这实际上允许我插入包含我网站内容的固定大小的 IFRAME。它实际上是一个小部件,允许他们搜索我的网站或接收其他信息。这可能吗? 最佳答
我有一个包含时间的表,列名为 time,数据类型为 Date。 在 asp.net 中,我想要一个查询插入日期,另一个查询则在 2 个日期之间进行选择。 我已经尝试过这个: string data =
这是我的代码: create or replace trigger th after insert on stock for each row declare sqty number;
这是一个带有具体示例的通用问题。 我有一个包含三个字段(流派 ID (PK IDENTITY)、流派和子流派)的表。该表对(流派,子流派)组合具有唯一约束。 我想知道如何修改存储过程以在表中不存在时插
因此,我正在遍历二叉树,节点包含字符串,以及读取文件时该字符串是否出现多次。我只查找读取文件时出现次数最多的前 10 个单词,因此本质上我只是比较 int 值。 我的问题是我正在尝试找出一种有效的方法
我有一张机票和行李 map , 每张门票必须是唯一的,并且必须与 map 上的位置相对应 是否可以仅更改行李(m_bagage->秒)而不更改 key ? std::unordered_map m_c
我正在使用 jdbc 驱动程序做一个示例项目。我的问题是,如果我在 2 文本字段中输入空值。 null 不应该加载到数据库中吗?有没有办法避免在数据库中插入空字段?任何帮助将不胜感激。 //Execu
我想知道 SSIS 中是否有特定的插入或更新选项。 如果我想让程序检查它是更新还是插入,我是否必须做一些编码?或者是否可以启用一个选项,以便它会自行检查 PK 是否存在,然后更新,否则插入? 亲切的问
我是一名优秀的程序员,十分优秀!