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 行--
INSERTs
和 autocommit=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 个小表?的主要内容,如果未能解决你的问题,请参考以下文章