我正在尝试找到将数据插入表格的最快方法(来自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工作中运行
编辑:我不清楚。截断总是运行。这只是插入所有数据的最快的原因答案 0 :(得分:2)
我也认为你的解决方案更清洁,加上“某人”的解决方案让我觉得有些问题:
至于表现,我认为没有理由为什么一个人应该比另一个更快。因此,通常的建议适用:选择最干净,最易维护的解决方案,对其进行测试,只有在性能出现问题时才进行优化: - )。
答案 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 );