Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何提高mySQL与SQL Server中一系列大型更新的速度?_Mysql_Sql_Sql Server_Jdbc - Fatal编程技术网

如何提高mySQL与SQL Server中一系列大型更新的速度?

如何提高mySQL与SQL Server中一系列大型更新的速度?,mysql,sql,sql-server,jdbc,Mysql,Sql,Sql Server,Jdbc,我有一个应用程序,我正在用简单的SQL用Java编写,所以这里没有定制的MySQL或SQL Server,它可能必须在这两个平台上运行。一个数据持久化操作必须从数据库中获取数据,将其与提交的数据进行比较,然后相应地插入、更新或删除 通过对JDBC调用进行批处理,我大大提高了操作的性能 因此,我的insert-我只需调用语句.addBatch()方法来插入整个数据集,JDBC驱动程序就会创建 INSERT INTO data (parentId, seriesDate, valueDate, va

我有一个应用程序,我正在用简单的SQL用Java编写,所以这里没有定制的MySQL或SQL Server,它可能必须在这两个平台上运行。一个数据持久化操作必须从数据库中获取数据,将其与提交的数据进行比较,然后相应地插入、更新或删除

通过对JDBC调用进行批处理,我大大提高了操作的性能

因此,我的insert-我只需调用
语句.addBatch()
方法来插入整个数据集,JDBC驱动程序就会创建

INSERT INTO data (parentId, seriesDate, valueDate, value) 
    VALUES (a,b,c,d),(a,b,e,f),(a,b,g,h)... etc
删除了——我只是用

DELETE FROM data WHERE parentId = a AND seriesDate = b;
我可以重新插入它们。(最好采用另一种方法,编写一个大的长卷

DELETE FROM data WHERE (parentId = 1 AND seriesDate = b) 
    OR (parentId = 2 AND seriesDate = c) 
    OR (parentId = 3 AND seriesDate = d)  ...
但这不是问题所在,我的主要问题是更新的速度非常慢,是插入的速度的两倍

我收到1000份单独的声明:

UPDATE data SET value = 4 
    WHERE parentId = 1 AND seriesDate = '' AND valueDate = '';
在SQL Server中,更新的速度与插入的速度一样快,但在MySQL中,我看到它的运行速度慢了10倍

我希望我已经忘记了一些相互兼容的方法,或者错过了一些需要调整的JDBC连接配置,可能是与我在每批中放入的项目数量有关

[UPDATE 2018-05-17]这是请求的DDL-不幸的是,我还不能更改它,因此任何涉及架构更改的建议都不会有帮助,至少今年不会:(

插入的

INSERT INTO `data` (`parentId`, `valueDate`, `value`, `seriesDate`)
    VALUES (52031,'2010-04-20',1.12344,'2013-01-10')

EXPLAIN PLAN:
id: 1
select_type: INSERT
table: data
partitions:
type: ALL
possible_keys: PRIMARY,ix_data_seriesdate
以及更新

UPDATE `data` SET `value` = -2367.0
    WHERE `parentId` = 52005 AND `seriesDate` = '2018-04-20' AND `valueDate` = '2000-02-11'

EXPLAIN PLAN:
id: 1
select_type: UPDATE
table: data
partitions: 
type: range
possible_keys: PRIMARY,ix_data_seriesdate
key: PRIMARY
key_len: 10
ref: const,const,const
rows: 1
filtered: 100
Extra: Using where
DELETE FROM `data` WHERE `parentId` = 52030 AND `seriesDate` = '2018-04-20'

EXPLAIN PLAN:
id: 1
select_type: DELETE
table: data
partitions: 
type: range
possible_keys: PRIMARY,ix_data_seriesdate
key: PRIMARY
key_len: 7
ref: const,const
rows: 1
filtered: 100
Extra: Using where
删除

UPDATE `data` SET `value` = -2367.0
    WHERE `parentId` = 52005 AND `seriesDate` = '2018-04-20' AND `valueDate` = '2000-02-11'

EXPLAIN PLAN:
id: 1
select_type: UPDATE
table: data
partitions: 
type: range
possible_keys: PRIMARY,ix_data_seriesdate
key: PRIMARY
key_len: 10
ref: const,const,const
rows: 1
filtered: 100
Extra: Using where
DELETE FROM `data` WHERE `parentId` = 52030 AND `seriesDate` = '2018-04-20'

EXPLAIN PLAN:
id: 1
select_type: DELETE
table: data
partitions: 
type: range
possible_keys: PRIMARY,ix_data_seriesdate
key: PRIMARY
key_len: 7
ref: const,const
rows: 1
filtered: 100
Extra: Using where

FYI 2字段由更新时的
ON UPDATE
子句自动更新-
last\u modified
,由触发器自动更新
versionstamp
(同样,我不能放弃该功能)。

我找到了改进更新语句的方法:

  • 使用辅助表(可以“批量”更新)
  • 检查不必要的触发器
  • 改进索引(对于WHERE子句)
  • OLAP或OLTP中间人临时表(它们允许批量更新)
例如


我找到了改进UPDATE语句的方法:

  • 使用辅助表(可以“批量”更新)
  • 检查不必要的触发器
  • 改进索引(对于WHERE子句)
  • OLAP或OLTP中间人临时表(它们允许批量更新)
例如


您最常使用哪一种方法?请共享表的DDL,包括索引、实际查询和执行计划。好的。我还发现SQL Server中的更新不受此问题的影响-只有mySQL。“简单SQL,因此这里没有自定义mySQL或SQL Server-它可能必须在其中任何一个上运行”-当然,您可以使用“香草”SQL使您的代码库保持简单,但如果性能非常重要,那么您可能需要考虑使用特定于平台的特性。您应该能够从<代码>连接< <代码>对象中识别出后端数据库的类型,例如,<代码> COM.MySQL.jDBC.JDBC4CONNECT/<代码>或<代码> COM.MySt.SQLServ.JDBC SQLServer。rConnection@GordThompson目前正在使用JDBC连接字符串标识数据库,并在连接和语句对象的包装器中自定义SQL。最初这很快,但我不想重新发明Hibernate:(看起来我已经将问题缩小到JDBC驱动程序,因为更新速度比SQL Server中的插入速度快。我可能会发布另一个主题更明确的问题。您最常做哪一个?请共享表的DDL,包括索引、实际查询和执行计划。OK done。我还发现SQL Server中的更新不受此问题的影响,只受mySQL的影响。“简单的SQL,所以这里没有自定义的mySQL或SQL Server-它可能必须在任何一个服务器上运行”-当然,您可以使用“香草”SQL使您的代码库保持简单,但如果性能非常重要,那么您可能需要考虑使用特定于平台的特性。您应该能够从<代码>连接< <代码>对象中识别出后端数据库的类型,例如,<代码> COM.MySQL.jDBC.JDBC4CONNECT/<代码>或<代码> COM.MySt.SQLServ.JDBC SQLServer。rConnection@GordThompson目前正在使用JDBC连接字符串标识数据库,并在连接和语句对象的包装器中自定义SQL。最初这很快,但我不想重新发明Hibernate:(看起来我已经将问题缩小到JDBC驱动程序,因为更新速度比SQL Server中的插入速度快。我可能会发布另一个主题更明确的问题。触发器不是不必要的:(我认为索引是好的(愿意被证明是错的-我在问题中添加了索引),但是关于辅助表和批处理,您是什么意思呢?我不确定我是否会创建复合主键,但是跨parentId、seriesDate和valueDate的索引可能是个好主意。我所说的辅助表是指创建一个存储经常使用的数据类型的边表,就像一系列带有日期部分的日期一样s、 或者0到100万之间的数字。辅助可能在这里没有帮助,但您可以使用一个临时表,如OLTP:创建一个只存储value、parentID、seriesDate和valueDate的临时表。首先填充该临时表,然后将其用于实际表的更新。是的,我100%同意您的意见,但现在我不打算这样做点击模式。再往下一点,我将有机会将
seriesDate
标准化,但还没有。@Adam:即使没有标准化数据,您也应该能够使用#TempData模型。关于#Temp表的一个警告是,它们可能会随着时间的推移而膨胀数据库,这将需要通过向其扔磁盘空间或使用良好的ma