Php 填表的最快方法

Php 填表的最快方法,php,mysql,performance,Php,Mysql,Performance,我正试图找到将数据插入表(数据来自select)的最快方法 我总是清理桌子: TRUNCATE TABLE table; 然后我执行此操作以插入数据: INSERT INTO table(id,total) (SELECT id, COUNT(id) AS Total FROM table2 GROUP BY id); 有人告诉我我不应该这样做。 他说这会快得多: CREATE TABLE IF NOT EXISTS table (PRIMARY KEY (inskey)) SELECT i

我正试图找到将数据插入表(数据来自select)的最快方法 我总是清理桌子:

TRUNCATE TABLE table;
然后我执行此操作以插入数据:

INSERT INTO table(id,total) (SELECT id, COUNT(id) AS Total FROM table2 GROUP BY id);
有人告诉我我不应该这样做。 他说这会快得多:

CREATE TABLE IF NOT EXISTS table (PRIMARY KEY (inskey)) SELECT id, count(id) AS total FROM table2 GROUP BY id
关于这个有什么想法吗? 我认为我的解决方案更干净,因为我不必检查桌子。 这将在cron作业中每天运行几次


编辑:我不清楚。截断总是运行的。这只是为什么要以最快的速度插入所有数据的问题

我还认为您的解决方案更干净,加上“某人”的解决方案在我看来有一些问题:

  • 它实际上并不删除表中可能存在的旧数据
  • create table…select将根据select返回的内容创建具有类型的表列。这意味着表2的表结构中的更改将传播到表中。这可能不是你想要的。它至少引入了隐式耦合,我发现这是个坏主意
至于性能,我看不出有什么理由一个比另一个快。因此,通常的建议是:选择最干净、最可维护的解决方案,对其进行测试,只有在性能出现问题时才进行优化:-)

这不会从表中删除旧值


如果这是您想要的,那么它确实会更快。

您的解决方案将是我的选择,性能差异损失(如果有,我不确定,因为您没有删除/创建表并重新计算列类型)是可以忽略的,而且我太过干净。

也许在你和某人之间的翻译中丢失了一些东西。他/她可能提到的一种可能性是拖放/选择到vs截断/插入

我听说后者的速度更快,因为它的日志记录最少(但再说一次,在这里下降的最终成本是多少?)。我没有可靠的数据来支持这一点。

我同意“sleske”的建议,让您自己测试并优化解决方案。DIY

每一个自尊的DB都会给您机会回滚事务。 1.正在将插入内容回滚到。。。将要求DB跟踪插入表中的每一行 2.正在回滚创建表。。。对于DB来说非常简单-只需去掉表即可

现在,如果你在设计和编码数据库,哪个会更快?1还是2

“某人的建议确实有价值,尤其是当你使用Oracle时

问候,

Shiva

我确信任何时差都是无法区分的,但你的更可取,因为它是一条SQL语句而不是两条;INSERT语句中的任何更改都不需要在另一个语句上做更多的工作;您的操作不需要主机验证您的插入是否与表中的字段匹配。

手册:从MySQL 5.1.32开始,出于二进制日志记录和复制的目的,TRUNCATE被视为DROP table,然后是CREATE table,即DDL而不是DML。这是因为,在使用InnoDB和其他事务存储引擎时,事务隔离级别不允许基于语句的日志记录(读已提交或读未提交),在使用语句或混合日志记录模式时,未记录和复制该语句

您可以将插入简化为:

INSERT INTO table
( SELECT id, COUNT(id) FROM table2 GROUP BY id );

如果在CREATETABLE之前没有DROP TABLE语句,我认为这两个语句并不完全相同,或者我错了吗?不,没有DROP。我不知道他为什么说创造更快。
INSERT INTO table
( SELECT id, COUNT(id) FROM table2 GROUP BY id );