Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/66.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/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
Mysql 特定于服务器的超慢速SQL更新命令_Mysql_Sql_Performance - Fatal编程技术网

Mysql 特定于服务器的超慢速SQL更新命令

Mysql 特定于服务器的超慢速SQL更新命令,mysql,sql,performance,Mysql,Sql,Performance,我在MySQL 5.5.31上有一个MYISAM数据库,正在运行以下更新 UPDATE tableA AS a INNER JOIN tableB AS b ON((a.id = b.dnum and a.account = b.account) OR a.id = CONCAT(b.dnum, '\_', b.account, '\_', b.unique)) SET a.status = 0, a.apd = NULL WHERE a.status = 1; 我尝试在3台不同的测试

我在MySQL 5.5.31上有一个MYISAM数据库,正在运行以下更新

UPDATE tableA AS a
INNER JOIN tableB AS b
ON((a.id = b.dnum and a.account = b.account) 
   OR a.id = CONCAT(b.dnum, '\_', b.account, '\_', b.unique))
SET a.status = 0, a.apd = NULL WHERE a.status = 1;
我尝试在3台不同的测试机器上运行这个查询,使用相同的数据集和几乎相同的mysql设置,查询在1秒或更短的时间内完成,更新了大约25000行

在生产服务器上运行此查询,但从未完成,我在40多分钟后将其终止

测试盒和生产版之间配置的主要区别在于MySQL版本是5.5.41,生产系统有一个复制日志,所有缓存大小等都相同

我找到了一个解决办法,就是运行一个select并创建25000多条update语句,这个过程能够在生产环境中以2-3秒的时间运行。然而,我担心的是,生产的SQL性能与测试环境有着根本的不同,以至于极慢的性能问题可能会在意想不到的地方发生

我在生产服务器上创建了一个新的测试数据库,并将数据导入其中,它的性能同样糟糕,因此它似乎特定于此服务器的配置。一般来说,SQL性能似乎不错,这是迄今为止唯一一个在性能方面明显不同的查询

我认为原因可能是复制,复制设置为行级别,因此需要在bin日志中生成数千行更新,但我添加了set@@session.sql\u log\u bin=0;并设置@@session.sql\u log\u bin=1;新测试数据库上的SQL语句的任何一方,它似乎都没有什么不同。此外,我还配置了一个测试盒来写入bin日志(但没有设置从属),这对性能没有太大影响


是否有人知道我如何确定此数据库未在合理水平上执行此查询的任何可能原因,或任何诊断以查明发生了什么情况?

连接中的
状态很慢。我建议将其分为两个更新:

UPDATE tableA a INNER JOIN
       tableB b
       ON a.id = b.dnum and a.account = b.account
    SET a.status = 0,
    a.apd = NULL
    WHERE a.status = 1;

UPDATE tableA a INNER JOIN
       tableB b
       ON a.id = CONCAT(b.dnum, '\_', b.account, '\_', b.unique))
    SET a.status = 0, a.apd = NULL
    WHERE a.status = 1;

然后,您可以使用适当的索引来加速这些操作<代码>表格A(状态、id、帐户)
表格B(dnum、帐户)
用于第一个<代码>表格A(id,状态)
用于第二个。

找到性能差异的原因


所有测试服务器的默认max_seek_for_key设置为18446744073709551615,但出现问题的生产服务器上的设置为500。当我分析服务器之间的细微差异时,这种差异并不突出,因为我认为这种设置可能会提高性能,而不是降低性能。

您是否直接在mysql服务器上运行它?或者您正在使用一些php或其他语言/框架/cms来调用查询?请尝试运行查询两次,每次运行一次,将每一组连接条件与它们进行比较或合并。执行
选择
并进行解释,如果您有5.6+就解释查询。这很可能是因为您缺少一个索引,导致最后一个问题,也就是说,我将通过MySQL workbench在三台不同的服务器上运行这些查询。生产服务器性能为40分钟以上,测试1 0.091秒,测试服务器2 1.034秒。我正在使用一个新创建的数据库,具有相同的创建表命令,并导入相同的文件以将数据获取到这3个服务器。在中间杀死MysAm更新会留下一些行的更改,有些不会更改。考虑切换到NYNDB。拆分查询不会改变测试服务器的性能,两个版本在3次测试运行中平均为0.4秒,但生产系统实际上同时完成。几乎意味着5.5.31而不是5.5.41上的OR行为中存在故障。由于
状态
是不稳定的,因此在任何索引中使用它可能是不明智的。