淘宝MySQL十大经典案例 
阿里集团-淘宝网DBA 
@杨德华Devin    2012-09 
个人简介 
• 负责淘宝用户中心从IOE迁移到MySQL集群的性能测试,高
可用运维,DB可用率达到100% 
 
• 管理数据魔方,SNS,淘宝评价,webww,notify等MySQL集群 
 
• 服务器优化,成本节省,把某个业务线的MySQL机器数量从
100台减少到70台。 
 
• SAS->SSD/FIO的MySQL服务器升级过程 
 
• 负责MySQL5.1.45->5.1.48-> Percona 5.5.18的工作 
 
 
 
 
淘宝线上十大MySQL经典案例 
 
• 数据库设计相关: 
•
(一) InnoDB表如何设计主键索引 
 
• SQL相关: 
•
•
•
(二) 字符串索引隐式转换 
(三) 表数据被莫名清空 
(四)  InnoDB表更新锁问题 
 
• 客户端相关: 
•
(五) 客户端连接被中断 
 
 
淘宝线上十大MySQL经典案例 
 
• “灵异事件”相关: 
•
(六)核心数据库被同时关闭 
 
• Slave相关: 
•
•
•
(七) Slave 事件Loop 
(八) Slave 更新操作找不到对应记录 
(九)备库设置read_only被堵塞 
 
• Swap相关:  
(十) 数据库服务器Swap 
•
 
 
一 InnoDB表如何设计主键索引 
CREATE TABLE `a` ( 
`id` bigint(20) NOT NULL AUTO_INCREMENT, 
`message_id` int(11) NOT NULL, 
`user_id` int(11) NOT NULL, 
`msg` varchar(1024) DEFAULT NULL, 
`gmt_create` datetime NOT NULL, 
PRIMARY KEY (`id`), 
KEY `user_id` (`user_id`,`message_id`), 
KEY `idx_gmt_create` (`gmt_create`) 
) ENGINE=InnoDB DEFAULT CHARSET=gbk; 
 
CREATE TABLE `b` ( 
  `user_id` int(11) NOT NULL, 
  `message_id` int(11) NOT NULL, 
  `msg` varchar(1024) DEFAULT NULL, 
  `gmt_create` datetime NOT NULL, 
  PRIMARY KEY (`user_id`,`message_id`), 
KEY `idx_gmt_create` (`gmt_create`) 
) ENGINE=InnoDB DEFAULT CHARSET=gbk; 
一 InnoDB表如何设计主键索引 
CREATE TABLE `a` ( 
`id` bigint(20) NOT NULL AUTO_INCREMENT, 
`message_id` int(11) NOT NULL, 
`user_id` int(11) NOT NULL, 
`msg` varchar(1024) DEFAULT NULL, 
`gmt_create` datetime NOT NULL, 
PRIMARY KEY (`id`), 
KEY `user_id` (`user_id`,`message_id`), 
KEY `idx_gmt_create` (`gmt_create`) 
) ENGINE=InnoDB DEFAULT CHARSET=gbk; 
 
CREATE TABLE `b` ( 
  `user_id` int(11) NOT NULL, 
  `message_id` int(11) NOT NULL, 
  `msg` varchar(1024) DEFAULT NULL, 
  `gmt_create` datetime NOT NULL, 
  PRIMARY KEY (`user_id`,`message_id`), 
KEY `idx_gmt_create` (`gmt_create`) 
) ENGINE=InnoDB DEFAULT CHARSET=gbk; 
大多数互联网业务(用户,消息),都可以
选择a或者b来满足业务需求, 
但a表和b表有何区别? 
一 InnoDB表如何设计主键索引 
记录  空间  优点 
A表  500万 
(顺序) 
509M  主键ID自增,在写入数据
的时候,Btree分裂成本
低,写性能高 
B表  500万 
(随机) 
361M  ? 
缺点 
? 
? 
一 InnoDB表如何设计主键索引 
记录  空间  优点 
A表  500万 
(顺序) 
509M  主键ID自增,在写入数据
的时候,Btree分裂成本
低,写性能高 
缺点 
? 
B表  500万 
(随机) 
361M  1.物理空间相对减少 
? 
2.根据user_id查数据,直
接走主键拿到数据,无
需回表