淘宝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查数据,直
接走主键拿到数据,无
需回表