300 likes | 466 Views
数据库的优化和管理. 盛大文学小说阅读网 李明珠 2012.07. 什么是数据库 ?. 保存数据的仓库就是数据库。 除了 mysql 以外,还有: Memcache Redis MongoDB ……. 一、小说阅读网的技术架构变化 -1. 小说阅读网的技术架构变化 -2. 小说阅读网的技术架构变化 -3. 小说阅读网的技术架构变化 -4. CDN 是什么. LVS 是什么. 小说阅读网的技术架构变化 -5. 唯一不变的是变化. 大型网站的共同点: 负载大有突发流量 数据量持续增长 服务越来越复杂 业务持续变化 总结几点运维管理的经验:
E N D
数据库的优化和管理 盛大文学小说阅读网 李明珠 2012.07
什么是数据库? 保存数据的仓库就是数据库。 • 除了mysql以外,还有: • Memcache • Redis • MongoDB • ……
唯一不变的是变化 大型网站的共同点: • 负载大有突发流量 • 数据量持续增长 • 服务越来越复杂 • 业务持续变化 总结几点运维管理的经验: • 系统优化是持久战 • 消灭单点是系统成熟的重要标志 • 系统监控很重要 • Cacti、短信报警、关键业务监控、性能监控、防黑监控
二、数据服务的稳定至关重要 MySQL是重点,常见问题: • 数据表慢查询 • 数据库同步和编码问题 • 数据库如何配合业务扩展 • 表数据量过亿如何管理? • 其他数据库的管理
2.1 数据表慢查询 数据表慢查询定义: • 跟产品要求有关,一般来说超过0.2秒都属于很慢的sql了 木桶原理:数据库的性能由最慢的sql决定 如何避免慢查询: • SQL优化,explain,建索引 • 合理建表结构,选择合适的engine • 控制表的大小,加强监控 • 尽量避免联表查询,严禁跨库查询,分拆sql • 提高sql效率,严控产品上线流程
建表SQL示例: (注意索引) CREATE TABLE `pay_expend` ( `id` int(10) unsigned NOT NULL auto_increment, `pid` varchar(64) NOT NULL, `userid` int(10) unsigned NOT NULL, `type` tinyint(1) NOT NULL, `subject` varchar(255) NOT NULL default '', `amount` int(10) NOT NULL, `price` decimal(13,1) NOT NULL, `totalprice` decimal(13,1) NOT NULL, `time` int(10) unsigned NOT NULL, `user_level` tinyint(2) NOT NULL default '1', PRIMARY KEY (`id`), KEY `Index_pid` (`pid`), KEY `Index_userid` (`userid`,`type`,`time`), KEY `Index_time` (`time`,`type`) ) ENGINE=MyISAM DEFAULT CHARSET=gbk;
Explain的使用 注意:explain只是一个辅助工具,实践才是检验真理的唯一标准。
SQL优化实例 select a.userid, a.addtime, a.mobile From pay.pay_mobile_month a LEFT JOIN (select mobile,count(*) num from support.sohu_msg_status_log where gwdate>unix_timestamp('20120701') group by mobile) tmpON ( a.mobile=tmp.mobile ) Where a.addtime>unix_timestamp(20120710) order by a.addtime; 有趣的现象: SQL初学者很喜欢写长长的SQL; 希望一个SQL搞定好几个事情,但往往效率很差。
SQL优化实例 select a.userid, a.addtime, a.mobile From pay.pay_mobile_month a LEFT JOIN (select mobile,count(*) num from support.sohu_msg_status_log where gwdate>unix_timestamp('20120701') group by mobile) tmpON ( a.mobile=tmp.mobile ) Where a.addtime>unix_timestamp(20120710) order by a.addtime;
建表SQL反面实例: (注意索引) CREATE TABLE `pay_mobile_month` ( `userid` int(10) unsigned NOT NULL default '0', `mobile` char(11) NOT NULL, `addtime` int(10) unsigned NOT NULL default '0', `status` tinyint(1) unsigned NOT NULL default '0', `endtime` int(10) unsigned NOT NULL default '0', PRIMARY KEY (`userid`,`mobile`), KEY `userid` (`userid`), KEY `status` (`status`), KEY `mobile` (`mobile`) ) ENGINE=MyISAM DEFAULT CHARSET=gbk;
优化后 select a.userid, a.addtime, a.mobile From pay.pay_mobile_month a LEFT JOIN pay.sohu_tmp_msglogtmp ON ( a.mobile=tmp.mobile ) Where a.addtime>unix_timestamp(20120710) order by a.addtime; 优化SQL重要原则: • 尽量避免联表,尤其是大表相联; • 严禁跨库操作; 尽量不要使用临时表; • 确定使用了index;
再谈: MyISAM 或 InnoDB ? MyISAM: • 适合大部分以查询为主的数据表 • 适合常有select count(*) 的sql查询 • 适合日志类型表,写入效率常比InnoDB还高 • 备份和运维管理较方便 • 缺点:1. 数据表和索引常需要repair 2. 表锁 InnoDB: • 适合有事务处理需求的情况:消费、注册 • 不适合数据经常会被删减,空间不释放 • 写入量多的表不一定选InnoDB 总的来说,大多数情况用MyISAM,事务处理用InnoDB。
为什么不能建外键? • 不管哪种表,都不要建外键 • 尽量少使用存储过程。 为什么? 原因: • KISS原则 =Keep It Simple Stupid • 业务逻辑前移原则
2.2 数据库同步和编码问题 数据表同步: • 选择需要同步的库和表 • 不是所有的数据库和数据表都需要同步,比如:统计和搜索应用 • 合理分担同步压力 • 例子: 移动机房数据同步 数据库编码: • 优先选择UTF8 • 如果无法选择,至少保证编码一致 • 导入导出注意编码问题 set names gbk
2.3 数据库如何配合业务扩展 业务的发展常常会有很多意料之外,比如: • 手机站半年流量增长4倍 • 暑期用户注册人数每天超过5万 • 哀悼日网站总访问量增100% 数据库: • 异常增长的监控 • 数据库可扩展设计 • 消灭单点,有灾备方案
2.3.1 数据库的监控 数据库的监控: • 数据表文件和数据量增量: 抓住主要矛盾 • 数据表是否损坏 • mysql是否可以正常访问 • 最大连接数和buffer是否设置正确 • 是否有异常慢查询堵塞
2.3.2 数据库的可扩展性 数据库的可扩展性: • 数据库分库原则:按业务划分 • 应用接口要符合OCP原则和KISS原则 • 一个软件服务应当对扩展开放,对修改关闭。(Open-Closed Principle ) • 例子: 小说正文数据服务接口 • 设计数据结构时,对未来2-3年做合理预期 • 避免考虑未来过长过细,技术架构一般2-3年都会变化 • 避免常识性的基本错误,比如:表索引。 • 一般来说,重建要比修改要省力 • 例子:重装系统常常比花时间修复系统漏洞要省时省力 • 例子:pay_expend重建索引
2.3.3 消灭单点、灾备方案 消灭单点: • Master DB是重点也是难点 • MMM 的尝试 • MM和Heart-beat配合使用 • Slave DB和LVS配合使用 • 重视数据备份和验证 • 监控和优化是常态 灾备方案: • 每个业务核心数据服务都需要有明确的灾备方案 • 什么是灾备方案: 就是一个服务或一个点出了问题,该如何处理。重要业务要有多项灾备方案。
2.4 数据表过亿怎么办 数据表过亿怎么办: • 不要紧张,mysql很强大 • 例子: 07年做抓虾网的时候数据单表数据量接近4亿条 • 分表和归档是主要思路,如何分则要具体分析 • 按业务逻辑分 • 按时间周期分 • 按统计需求分 • 总表是否保留取决于业务需要 • 分表后的管理和数据统计需要提前考虑好 • 前台各数据接口尽量保持不变(OCP原则) • 数据文件存放和管理,历史数据同样需要备份
2.5 其他数据库的管理 Redis的管理: • 建议大家使用redis,不用memcache • 效率更高,数据更可靠 • master-slave管理 • 内存使用的控制 • 服务的监控 Session的管理: • 内存表方案 • 分布式存储方案 • 无状态验证方案
2.6 数据库优化和管理的重要原则 重要原则: • 增加系统冗余、提高可用性:消灭单点 • 设计可扩展的数据库结构 • 永远的监控,要对变化敏感 • 要主动出击,不要被动挨打 • 业务逻辑前移原则 • OCP 和 KISS原则 = Keep It Simple Stupid • 谨慎使用新技术,新技术常=不成熟不稳定 • 实践是检验真理的唯一标准
Thank You ! 欢迎提问!