Mysql InnoDB引擎简单更新查询耗时太长(查询结束)

Mysql InnoDB引擎简单更新查询耗时太长(查询结束),mysql,sql,innodb,myisam,Mysql,Sql,Innodb,Myisam,我最近在各种mysql表中添加了许多触发器,以强制实现所有内容的完整性。我担心我可能已经关闭了我的引擎,因为简单的更新现在需要很长时间 考虑: UPDATE `partner_stats` SET earnings=1 WHERE date=CURRENT_DATE() 0 rows affected. ( Query took 0.6523 sec ) SELECT * FROM `partner_stats` WHERE date = CURRENT_DATE() 1 total,

我最近在各种mysql表中添加了许多触发器,以强制实现所有内容的完整性。我担心我可能已经关闭了我的引擎,因为简单的更新现在需要很长时间

考虑:

UPDATE `partner_stats` SET earnings=1 WHERE date=CURRENT_DATE()
0 rows affected. ( Query took 0.6523 sec ) 

SELECT * FROM  `partner_stats` WHERE date = CURRENT_DATE() 
1 total, Query took 0.0004 sec
选择需要0.0004,但简单的更新需要0.65

此特定表只有一行,并且没有与之关联的触发器。将引擎切换到MyISAM解决了这个问题,但是我将来需要为这个表添加触发器,所以我想继续使用InnoDB

我的发动机怎么了?和其他桌子一起工作太忙了吗?我有哪些评测或调试选项

编辑:进行了分析,结果显示:

mysql> show profile for QUERY 2;
+----------------------+----------+
| Status               | Duration |
+----------------------+----------+
| starting             | 0.000064 |
| checking permissions | 0.000008 |
| Opening tables       | 0.000032 |
| System lock          | 0.000007 |
| init                 | 0.000051 |
| Updating             | 0.000069 |
| end                  | 0.011682 |
| query end            | 0.218070 |
| closing tables       | 0.000016 |
| freeing items        | 0.000017 |
| logging slow query   | 0.000003 |
| cleaning up          | 0.000002 |
+----------------------+----------+
12 rows in set (0.00 sec)

您应该尝试像前面解释的那样优化InnoDB引擎。在没有复制的生产服务器上,您可以使用:

=2

酸合规性要求值为1。通过设置不同于1的值,可以获得更好的性能,但在崩溃中最多会损失1秒的事务

innodb_缓冲区_池_大小=[75%的总内存]

innodb_日志_文件_大小=[innodb_缓冲区_池_大小的25]

innodb_日志_缓冲区_大小=[10%的innodb_日志_文件_大小]


innodb_thread_concurrency=[2 X CPU数量+磁盘数量,或0表示自动检测]

占用时间最长的两个部分是end和query end。这两者都与写入binlog有关。下面是另一个问题,可能有几个有用的答案:。其中一个答案是,我们将sync_binlog变量从1更改为0,这意味着在每次提交时不刷新对磁盘的binlog更改,而是允许操作系统决定何时fsync到binlog。这完全解决了我们的查询结束问题。