【概述】 时隔五年,有幸以主持人角色参与第七届中国数据库技术大会,我已经封笔5年以上了。恰逢主持的技术专场有听众提到如何理解分库分表分区的问题。此领域的技术已经历10多年的发展,后来者们依然对这三个技术方向存在理解上的偏差和概念模糊,借此话题我重开技术写作,同时向技术朋友分享此领域的来龙去脉。 一、分表的前世今生 MySQL5.0以前版本存在单表行数的性能下降拐点,以经典的MySQL4.17或MySQL3.23为例,那个特定年代的存储引擎主要是ISAM或类ISAM存储引擎和BDB存储引擎,运行平台数据库服务器主要是2-4块硬盘,内存几乎都是4G-16G为主。在此背景下,行业内公认ISAM存储引擎的性能拐点为单表500万行记录,故一般会超过拐点的数据量表就会做人为分表和应用程序配合,常见是按日期(例如:每月份一张表)、HASH值等方式。 进入MySQL5.0时代,主要是MyISAM或类MyISAM存储引擎和InnoDB存储引擎,但MySQL同其他商业数据库产品相比依然无表分区特性。部分业务场景存在单表数据删除或数据冷热明显的需求,为方便定期删除数据和归档数据,或进行数据冷热分离而提升性能。 前者MyISAM和InnoDB存储引擎都存在,通常做法是定期切换表,业务低谷期加表级别锁,完成表名称的RENAME操作;后者主要是针对MyISAM存储引擎,只有索引缓存区,此时就会直接进行分表,通常做法是MyISAM存储引擎的表数据分表后,再借助MERG存储引擎合并回来,减少应用程序改造。
二、分区的功能特性 进入MySQL5.1及以上的时代,也随着硬件成本的降低和平民化,X86服务器硬盘更多和内存更大(起步都是6块SAS硬盘,64G内存),InnoDB存储引擎得到迅速的普及,且MySQL数据库支持分区特性。 InnoDB存储引擎具备元数据和索引数据的自适应调节数据活跃度的缓存功能,内存也足够大,同时具备分区功能和支持交换分区,此时往往不再使用分表的方法,而是借助分区功能实现数据的删除和归档等。
三、分库的缘由 分表和分区都是基于同一个数据库里的数据分离技巧,对数据库性能有一定提升,对MySQL数据库的吞吐量无质的变化。当业务系统的数据容量接近或超过单台X86服务器的容量、QPS/TPS接近或超过单个MySQL数据库实例的处理极限等,则重点在于扩展MySQL数据库的吞吐量和数据处理量。此时,往往是采用垂直和水平结合的数据拆分方法,把数据服务和数据存储分布到多台MySQL数据库服务器上。
分库只是一个通俗说法,更标准名称是数据分片,采用类似分布式数据库理论指导的方法实现,对应用程序达到数据服务的全透明和数据存储的全透明,这个领域的知识内容就更复杂,日后慢慢分篇幅介绍。
四、总结
补充说明: 若MyISAM存储引擎分表后,借助类MyISAM的MERG存储引擎,则不需要改造应用程序,存在少量限制;
五、结束语 本文写于2016年5月14日北京南站候车室。
本文转载自:公众号mysqlops2016 作者:金官丁 热璞科技 创始人 ZHDBA:中华数据库行业协会由来自北京、杭州、上海、深圳等地的技术精英们联合组织成立。协会致力于数据库开源领域的各项资源的有效整合与分享,为开源社区作出相关的贡献,为业界提供一个纯技术交流的优质平台。 如果您喜欢这篇文章,请点击右上角“...”将本文分享给您的朋友。 搜索微信号“zhdba2014”,或扫描二维码,关注中华数据库行业协会,分享中华数据库行业协会最新动态及更多的互联网信息。 本文转载自:微信公众账号 - zhdba,版权归原作者所有! | ||||||||||||||||||||||||||||
|
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系
[邮箱地址] 删除
|