InnoDB引擎简单更新查询过长(query_end)

时间:2013-07-07 02:25:23

标签: 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, Query took 0.0004 sec

SELECT需要0.0004,但简单的UPDATE需要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)

1 个答案:

答案 0 :(得分:1)

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

innodb_flush_log_at_trx_commit = 2

#ACID合规性需要值1。通过将值设置为1可以获得更好的性能,但是在崩溃中最多可以丢失一秒钟的事务。

innodb_buffer_pool_size = [总内存的75%]

innodb_log_file_size = [innodb_buffer_pool_size的25%]

innodb_log_buffer_size = [innodb_log_file_size的10%]

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