mysql 大量更新请求 updating 状态

2016-03-24 13:29:58 +08:00
 sujin190
每秒大概 100 个更新, 200 万左右数据,每次都是有索引更新,每次更新一条记录,大量处于 updating , mysql 更新操作有这么慢么?还好多都更新等待超时了,或者该怎么找出哪的问题么?
6575 次点击
所在节点    MySQL
58 条回复
sujin190
2016-03-25 11:11:17 +08:00
@noahzh 只有四个索引,其中两个都是不重复的
noahzh
2016-03-25 12:35:13 +08:00
@sujin190 你根本没有懂,我问你个问题一个表有 1000 列,索引能区分出 900 列,这个索引还有意义吗?
sujin190
2016-03-25 12:39:51 +08:00
@noahzh 索引不是区分度越大越好么?
realpg
2016-03-25 13:00:04 +08:00
@sujin190
云服务器,你确定不是 IO 的问题?感觉可能性极大……
另外发个 show create table XXX 上来让大家看看吧,感觉也可能是其他联合索引更新导致的锁
你这个 update 操作密度比较大, 100 次每秒,一旦一个其他导致锁的操作阻塞,你的 update 进队列,一秒就堵 100 个查询,导致阻塞的操作的频率,决定了累计程度,时间长就这样了,也是很可能的。
noahzh
2016-03-25 13:05:04 +08:00
@sujin190 一个表 100 条记录,一个索引能对应 99 条记录,你说这个索引有意义吗?
pubby
2016-03-25 13:08:19 +08:00
@realpg 如果其他因为锁表阻塞到这种程度, show processlist 应该一眼能看出来了。

感觉还是 io 问题, swap 严重不?
realpg
2016-03-25 13:12:08 +08:00
@pubby
不一定会的。导致锁表那个操作并不一定执行频率很高,未必能 show processlist 准确抓到。
卡住以后,堵了太多 update ,然后当那个锁释放的时候,这个待执行 update 队列就变态的大了, show proceslist 只能抓到正常的高密度 update 。
sujin190
2016-03-25 13:13:35 +08:00
@noahzh 哦,我们这个索引的这个字段是唯一索引,每行是不重复的
sujin190
2016-03-25 13:14:45 +08:00
@realpg 今天正常了,看起来可能是云服务器所在的物理机 io 比较高,准备换 ssd 主机试试
Infernalzero
2016-03-25 13:15:21 +08:00
最好不要拿 varchar 当索引,特别是长度比较长的
一般是把对应字段转换下, md5 后的值转换成整型存储,然后 md5 后的字段作为索引
sujin190
2016-03-25 13:16:23 +08:00
@pubby 12g 内存,用了不到一半。。 io 每秒 200 多, 300KB 左右,这应该不算高吧,因为是云主机,可能是云主机所在物理主机 io 高
sujin190
2016-03-25 13:17:26 +08:00
@Infernalzero 恩,固定 24 字符的,换成 char 会不会好点?
likuku
2016-03-25 14:47:14 +08:00
@sujin190 干嘛不用 RDS ?自动 HA ,还有自动快照备份, OPS/TPS 也足够高。
sujin190
2016-03-25 15:18:39 +08:00
@likuku 这个嘛数据早期是直接从物理机房的机器服务器上直接 copy 过来的,也没有对 rds 测试,所以暂时还没有使用 rds
sujin190
2016-03-26 17:04:28 +08:00
@lecher
@likuku
@yangqi
@realpg

ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
mysql> show profile;
+----------------------+------------+
| Status | Duration |
+----------------------+------------+
| starting | 0.000134 |
| checking permissions | 0.000033 |
| Opening tables | 0.000035 |
| init | 0.000050 |
| System lock | 0.000083 |
| updating | 121.503612 |
| end | 0.000096 |
| query end | 0.000028 |
| closing tables | 0.000029 |
| freeing items | 0.000074 |
| cleaning up | 0.000029 |
+----------------------+------------+
11 rows in set, 1 warning (0.00 sec)

这个看起来怎么这么奇怪啊? updating120 秒
yangdehua
2016-03-31 11:39:06 +08:00
楼主执行下 show full processlist; 贴上来
把 update 的 sql 贴出来;
把表结构贴上来;
sujin190
2016-03-31 12:43:55 +08:00
@yangdehua 好吧,终于发现了,其实是表有唯一索引, insert 之后没有 commit ,只有高并发之后才会出现异常,死锁了,不过这种情况下能不能看出是哪个 sql 没 commit 么?
yangdehua
2016-03-31 12:48:48 +08:00
@sujin190 如果你是 innodb 引擎,可以看看 show engine innodb status\G 或者是 select * from information_schema.innodb_trx\G

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/266017

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX