强制串行 mySQL 插入(或以更好的方式重建表)

Posted

技术标签:

【中文标题】强制串行 mySQL 插入(或以更好的方式重建表)【英文标题】:Force serial mySQL insertions (or rebuild a table a better way) 【发布时间】:2018-07-07 14:08:26 【问题描述】:

我是 mysql 事务的新手,我正在使用我继承的一些代码,但问题是与基本功能相关而不是特定于代码。

我有一个要插入到 mySQL 表中的 js 数组。这 表大小永远不会超过 200 个条目,通常少于 100 个。 目前,我正在循环遍历 js 数组并发送个人 每个数组元素的 AJAX 请求到现有的 php 文件 在它们到达时对其进行处理,并为每个执行 sql INSERT 调用 元素。 async 在 js AJAX 调用中设置为“false”。 一切正常 - 没有 INSERTS 失败,也没有数据 迷路了,所以这不是代码失败问题——但是当我后来拿到桌子时 从数据库中加载它到一个数组中,按更新(添加)排序,条目的顺序是错误的,这是一个问题。

所以我向 mySQL 专家提出的问题是:是否有一个我没有看到的简单握手函数可以确保按顺序处理 mySQL 插入?

如果答案是否定的,我将需要为每个请求添加一个序列号,并在表中为其添加一列。此外,如果我无论如何都要对继承的代码进行更改,我愿意接受有关寻找更有效解决方案的指针。

谢谢。

【问题讨论】:

解决问题的最简单方法是在表中设置一个 auto_increment 主键列。这样,每次插入都会生成一个新的 id (lastID+1),并且它们将被正确排序。 为什么每个元素都有一个请求?您可以在单个请求中发送完整的数组。 【参考方案1】:

正如 Paul Spiegel 所说,如果您想要的只是可重复的事件序列,最好使用 auto_increment。

我假设当您说“按更新(添加)排序”时,这是一个 DateTime 字段或表格上的某个字段。如果您的插入发生得足够快,那么在同一插入日期/时间将有多行(该字段仅达到一秒分辨率),并且 MySQL 不保证在发生这种情况时您将始终以相同的顺序取回行。

【讨论】:

我没这么说。虽然我会,如果 Ivan86 没有。 :-) 是的,这就是问题所在。更新时间字段的分辨率不够。适用于单个更新(但它仍然是错误的设计),但不适用于批量输入。我将其更改为使用 auto_increment 字段,一切都很好。下一步是根据 Kosh Very 的建议进行改进,以获得更好的性能和更简洁的设计。【参考方案2】:

您可以一次插入所有数组:

使用 VALUES 语法的 INSERT 语句可以插入多行。到 这样做,包括逗号分隔的列值的多个列表,与 用括号括起来并用逗号分隔的列表。示例:

INSERT INTO tbl_name (a,b,c) VALUES(1,2,3),(4,5,6),(7,8,9);

阅读更多here。

【讨论】:

是的,这就是我能拿到的地方。单个行处理的性能并不令人印象深刻。谢谢! 不仅是性能。您也可以保持条目的原始顺序。 是的,这是正确的做法。毫无疑问。

以上是关于强制串行 mySQL 插入(或以更好的方式重建表)的主要内容,如果未能解决你的问题,请参考以下文章

Oracle 重建表(rename)注意事项总结

Mysql—Mysql磁盘空洞的成因以及重建表的几种方式

mysql如何清空表

MySQL回收表空间

Mysql转换表存储引擎的三种方式

Postgresql 序列与串行