MySQL PDO 在 3 秒或更短的时间内创建和填充 1000 个小表?

Posted

技术标签:

【中文标题】MySQL PDO 在 3 秒或更短的时间内创建和填充 1000 个小表?【英文标题】:MySQL PDO create and populate 1000 small tables in 3 seconds or less? 【发布时间】:2017-09-09 19:26:34 【问题描述】:

有可能吗?从一个单一的过程? DB 在 SATA 磁盘上。 我正在使用 ubuntu 14.04。所有表格都有 20-60 行和 6 列。 我正在使用交易。

当前序列是:

    创建表 开始交易 插入 #1 插入 #2 ... 插入 #n 提交

现在我每秒大约有 3-4 张桌子。

结论:当我禁用日志记录时,我的性能变得类似于 phpmyadmin。因此,正如 Rick James 所建议的那样,我想如果没有更快的存储,就无法实现进一步的改进。

【问题讨论】:

【参考方案1】:

在旋转驱动器上,您每秒可以获得大约 100 次操作。 CREATE TABLE 可能会更慢,因为它涉及操作系统中的多个文件操作。所以,我预计 1000 CREATE TABLEs 需要超过 10 秒。那是在 Ubuntu 上;在 Windows 上更长。

创建多个相同的表通常是糟糕的架构设计;而是有一个带有额外列的表来区分子集。

INSERTing 40K 行--

40K 单行 INSERTsautocommit=ON -- 400 秒。 1000 多行 INSERTs,每行 20-60 行,每条语句后再次 COMMITted -- 10 秒。 具有 40K 行的单个 INSERT(如果您不打破其他限制)- 可能不到 1 秒。

不要使用多语句查询;这是一个潜在的安全问题。反正也没多大用。

【讨论】:

我创建 1000 个表的原因之一是提高搜索/更新速度并允许并发。我注意到管理员在相同的设置下在大约 144 秒内重新加载了整个数据库(大约 1200 个表上的 3477 个查询)。这大约快 3 倍。那么我错过了什么?以上数字是您的经验还是来自其他来源? 我的经验。但是有很多变量(磁盘速度、驱动程序等),所以大约有 3 倍的差异。我所描述的是与单个表的单个连接。与单个 InnoDB 表的多个(但不是 1000 个)连接会更快。尽管如此,操作系统仍然需要时间来创建 1000 个表。【参考方案2】:

对于创建表,您可以执行多语句查询(PDO 支持此),因此在单个查询中您可以创建多个表和 t 用于插入 您可以使用批量插入来准备具有重复插入值的 sql 插入查询,并将其作为单个查询执行

批量插入是基于

INSERT INTO your_table( col1, col2,,,) 
VALUES ( val1_1, val1_2 ,,,), 
       ( vale2_1, val2_2 ,,,), 
       ....

然后您可以基于这些技术构建一个 PDO 查询,并执行以下事实几秒

使用多行INSERT语法减少通信开销 如果您需要插入许多行,则在客户端和服务器之间 提示适用于插入任何表,而不仅仅是 InnoDB 表。

【讨论】:

我认为事务会产生与多行插入相同的结果。我有限的测试似乎证实了这一点。 IE。没有改善。 @gene - 事务不会更好,因为每个单行 INSERT 的设置和拆卸都有开销。

以上是关于MySQL PDO 在 3 秒或更短的时间内创建和填充 1000 个小表?的主要内容,如果未能解决你的问题,请参考以下文章

iOS 8 后台应用程序位置

更改标签文本时的延迟响应(Swift)

30 段 Python 实用代码

使用横向连接搜索非常慢

敏捷21天打卡--Scrum活动

在 apache spark 中创建存储桶