我有一个带有几个表的mysql数据库,让我们称它们为Table1,Table2等。我必须对每个表进行多次调用
哪种效率最高,
a)在一条消息中收集每个表的所有查询,然后单独执行它们,例如:
INSERT INTO TABLE1 VALUES (A,B);
INSERT INTO TABLE1 VALUES (A,B);
...执行
INSERT INTO TABLE2 VALUES (A,B);
INSERT INTO TABLE2 VALUES (A,B);
...执行
b)在一条长消息中收集所有查询(不按表的顺序),然后执行此查询,例如:
INSERT INTO TABLE1 VALUES (A,B);
INSERT INTO TABLE2 VALUES (B,C);
INSERT INTO TABLE1 VALUES (B,A);
INSERT INTO TABLE3 VALUES (D,B);
c)还有别的吗?
目前我正在做选项(b),但我想知道是否有更好的方法。
(我在一个groovy脚本中使用jdbc来访问数据库)。
谢谢!
答案 0 :(得分:1)
第三种选择 - 使用准备好的陈述。
答案 1 :(得分:1)
如果不发布您的代码,您已经做了一个疯狂的猜测,但this blog post使用groovy Sql.withBatch method显示了出色的性能提升。
他们展示的代码(使用sqlite)在这里转载给后人:
Sql sql = Sql.newInstance("jdbc:sqlite:/home/ron/Desktop/test.db", "org.sqlite.JDBC")
sql.execute("create table dummyTable(number)")
sql.withBatch {stmt->
100.times {
stmt.addBatch("insert into dummyTable(number) values(${it})")
}
stmt.executeBatch()
}
将数字1到1000插入表dummyTable
显然需要调整以处理未知代码
答案 2 :(得分:0)
首先考虑表是否很大以及是否需要并发,而不是查看哪个更有效。
如果它们是(数百万条记录),那么您可能希望在语句基础上将它们分开并在每个语句之间留出一些时间,因此您不会一次锁定表格太久。
如果您的表不是那么大或并发不是问题,那么无论如何都要做。您应该查看语句的slow logs
,看看哪个语句更快。