In the last year, we've gone from millions of pieces of data to billions of pieces of data. I will speak on a solution for scaling up and about the challenges presented. Also covered will be the future of data at Qihoo 360 with MongoDB.
26. 案例二:死锁
? 背景:
利用show engine innodb statusG;
查看LATEST DETECTED DEADLOCK部分经常有死锁现象
死锁语句:
DELETE FROM GRP_OfflineNotify WHERE
UserId = 852577338 AND GroupId = 33990861 AND
NotifyType = 10
DELETE FROM GRP_OfflineNotify WHERE
UserId = 825749088 AND GroupId = 33990861 AND
NotifyType = 10
27. 案例二 分析
? 了解LATEST DETECTED DEADLOCK :
>show engine innodb statusG;
LATEST DETECTED DEADLOCK
------------------------
这个死锁信息发生的时间
*** (N) TRANSACTION:
死锁的语句及相关的信息
*** (N) WAITING FOR THIS LOCK TO BE
GRANTED:
死锁的原因
28. 案例二 分析
? 死锁原因分析:
mysql> explain select * from GRP_OfflineNotify where UserId=852577338 and
GroupId=33990861 and NotifyType=10G;
** 1. row **
id: 1
select_type: SIMPLE
table: GRP_OfflineNotify
type: ref
possible_keys:
IX_GRP_OfflineNotify_GroupId_NotifyType,IX_GRP_OfflineNotify_UserId
key: IX_GRP_OfflineNotify_GroupId_NotifyType
key_len: 5
ref: const,const
rows: 1 IX_GRP_OfflineNotify_Group
Extra: Using where Id_NotifyType
1 row in set (0.00 sec) (GroupId, NotifyType)
普通索引
29. 案例二 分析
? 原因归纳:
利用
IX_GRP_OfflineNotify_GroupId_NotifyType索引
去访问数据,而这个索引并不唯一,所以造成了
锁的区间较大,造成两个事务相互冲突死锁。
另外:
也可以参考show engine innodb statusG;中的
死锁部分中: WAITING FOR THIS LOCK TO BE
GRANTED
30. 案例二 分析
? 再回到问题上思考:
这个SQL是做什么的?
需要锁这么大的区间吗?
? 死锁语句:
DELETE FROM GRP_OfflineNotify
WHERE UserId = 852577338 AND
GroupId = 33990861 AND NotifyType = 10
DELETE FROM GRP_OfflineNotify
WHERE UserId = 825749088 AND
GroupId = 33990861 AND NotifyType = 10
31. 案例二 分析
? 非唯一索引Delete死锁原因:
root
brach1
5: col2= 3399086 ,col3=10,…
Leaf 1
Sec Ind1 PK loc 1001:col2= 3399086 ,col3=10,…
k
3399086 10 5 X 1006:col2= 3399086 ,col3=10,…
3399086 10 1001 X
3399086 10 1006 X
Table Redords
…
96257735 11 2
6
32. ? 解决办法:
– 创建新索引:
create index IX_GRP_OfflineNotify_GroupId
_UserId_NotifyType on GRP_OfflineNotify(Grou
pId,UserId,NotifyType);
– 删除旧索引:
drop index IX_GRP_OfflineNotify_GroupId_
NotifyType on GRP_OfflineNotify;
33. ? Innodb支持的锁类型:
– Record lock
– Next Key lock
– Gap lock
– Table lock
? 高并环境事务隔离级别:
READ-COMMITTED