【发布时间】:2013-03-29 05:03:44
【问题描述】:
应用程序是实时站点,需要每个查询的访问速度(选择、更新、插入)每次查询的低延迟必须小于 200 毫秒
嗯,平均每个查询有 98%。完成作业查询的时间少于 0.001-0.005 秒。
问题是 有时每小时大约 5 次,它们可能需要 1s 并且可能是 5s,我不知道问题的真正原因
我发现减少问题的方法是将其从 INNODB 移到 MEMORY。
问题是为什么有时查询可能需要长达 5 秒的时间?
Example query in sometime query more than 1 secound
# Time: 130328 20:27:40
# User@Host: ferge572w[ferge572w] @ localhost []
# Query_time: 1.339712 Lock_time: 0.000026 Rows_sent: 0 Rows_examined: 1
SET timestamp=1364477260;
UPDATE log_product SET credit=credit+1 WHERE id_product='149721921' and id_user='2029275' LIMIT 1;
table index: id_product, id_user
No.row: 33,491 table size: 5Mb
# Time: 130329 7:25:37
# User@Host: ferge572w[ferge572w] @ localhost []
# Query_time: 1.439856 Lock_time: 0.000031 Rows_sent: 0 Rows_examined: 1
SET timestamp=1364516737;
UPDATE product SET lastuser='hello',picperson='1',lastid='2030505',country='thailand',price=price+0.01,time=DATE_ADD(time, INTERVAL 3 SECOND) WHERE id='349721227' LIMIT 1;
table index: id
No.row: 35 table size: 2.1Mb
我确保 EXPLAIN 优化查询和更新使用索引。还检查了表字段的数据类型及其长度,但仍然有问题
更新 我发现问题的原因是系统高 IOwait 时。慢查询 heppen 立即。 如何解决它
IO 等待高时查询慢。
从 iotop 命令显示
-- TID -- PRIO -- 用户 -- 磁盘读取 -- 磁盘写入 -- SWAPIN -- IO> -- 命令
-- 2311 -- be/4 -- mysql -- 0.00 B/s -- 0.00 B/s -- 0.00% -- 96.25% -- mysql~l.sock
-- 2311 -- be/4 -- mysql -- 0.00 B/s -- 0.00 B/s -- 0.00% -- 96.25% -- mysql~l.sock
-- 2311 -- be/4 -- mysql -- 0.00 B/s -- 0.00 B/s -- 0.00% -- 96.24% -- mysql~l.sock
高 IO 等待从下午 6:13:28 到下午 6:13:29(sar 命令)开始
--------------------- CPU -- %usr -- %nice -- %sys -- %iowait -- %steal
-- 下午 6:13:28 --- 全部 -- 2.53 -- 0.00 -- 2.02 -- 39.39 -- 0.00
-- 下午 6:13:29 --- 全部 -- 1.99 -- 0.00 -- 1.00 -- 49.25 -- 0.00
这段时间的查询速度很慢
时间:130329 18:13:29
用户@主机:wdwdwd[wdwdwd]@本地主机[]
Query_time: 2.007902 Lock_time: 0.000025 Rows_sent: 0 Rows_examined: 1 SET timestamp=1364555609;
UPDATE log_product SET credit=credit+1 WHERE id_product='349721228' and id_user='2021841' LIMIT 1;
【问题讨论】:
-
也许使用像 munin 这样的服务来随着时间的推移创建这些漂亮的图表,这样你就可以看到是否有基于时间的模式。 oierud.name/bliki/ImprovedMuninGraphsForMySQL.html
-
你有totutial来设置munin吗? CentOS 6.4。谢谢
-
如果你可以重新出现这个问题,尝试使用配置文件dev.mysql.com/doc/refman/5.5/en/show-profile.html
-
我找到了原因,在上面更新了。