填写表格的最快方法

时间:2009-06-19 10:36:28

标签: 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 id, count(id) AS total FROM table2 GROUP BY id

关于这个的任何想法? 我认为我的解决方案更清晰,因为我不需要检查表格。 这将在一天的几次cron工作中运行

编辑:我不清楚。截断总是运行。这只是插入所有数据的最快的原因

7 个答案:

答案 0 :(得分:2)

我也认为你的解决方案更清洁,加上“某人”的解决方案让我觉得有些问题:

  • 它实际上并不删除表中的旧数据
  • create table ... select将根据select返回的内容创建包含类型的表列。这意味着table2的表结构中的更改将传播到表。这可能是也可能不是你想要的。它至少引入了隐式耦合,我发现这是一个坏主意。

至于表现,我认为没有理由为什么一个人应该比另一个更快。因此,通常的建议适用:选择最干净,最易维护的解决方案,对其进行测试,只有在性能出现问题时才进行优化: - )。

答案 1 :(得分:1)

您的解决方案将是我的选择,性能差异损失(如果有的话,我不确定,因为您不删除/创建表并重新计算列类型)可以忽略不计,恕我直言超重清洁度。

答案 2 :(得分:0)

CREATE TABLE IF NOT EXISTS table (PRIMARY KEY (inskey))
SELECT  id, count(id) AS total
FROM    table2
GROUP BY
        id

这不会从表中删除旧值。

如果这就是你想要的,它确实会更快。

答案 3 :(得分:0)

也许在你和别人之间的翻译中已经丢失了一些东西。他/她可能指的一种可能性是DROP / SELECT INTO与TRUNCATE / INSERT。

我听说后者更快,因为它的记录最少(但是再说一次,DROP的最终成本是多少?)。我没有严格的统计数据支持这一点。

答案 4 :(得分:0)

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

每个自尊的DB都会让您有机会回滚您的交易。 1.回滚INSERT INTO ...将需要DB跟踪插入表中的每一行 2.回滚CREATE TABLE ...对于DB来说非常简单 - 只需摆脱桌面。

现在,如果你正在设计&编写DB,哪个会更快? 1还是2?

“某人的建议”如果你使用的是甲骨文,那就特别有用。

的问候,
希瓦

答案 5 :(得分:0)

我确信任何时间差都无法区分,但你的恕我直言,因为它是一个SQL语句而不是两个; INSERT语句中的任何更改都不需要对其他语句进行更多操作;并且您的主机不要求主机验证您的INSERT是否与表中的字段匹配。

答案 6 :(得分:0)

从手册开始:从MySQL 5.1.32开始,为了二进制日志记录和复制,TRUNCATE被视为DROP TABLE,后跟CREATE TABLE - 即DDL而不是DML。这是因为当使用InnoDB和事务隔离级别不允许基于语句的日志记录(READ COMMITTED或READ UNCOMMITTED)的其他事务存储引擎时,在使用STATEMENT或MIXED日志记录时未记录和复制该语句模式。

您可以将插入简化为:

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