当前位置:首页 > 问答 > 正文

MSSQL怎么突然就能撑起500G内容存储,真是大进步了吧?

“MSSQL怎么突然就能撑起500G内容存储,真是大进步了吧?”这个问题问得很有意思,因为它触及了很多人对数据库,特别是像Microsoft SQL Server(MSSQL)这类传统关系型数据库的直观感受,感觉上好像是“突然”就能做到了,但实际上,这并不是一夜之间的魔术,而是微软和整个硬件工业在过去十多年里持续努力、一步步积累的结果,说它是“大进步”绝对没错,但这个进步是渐进的,是由多方面因素共同促成的。

最直接、最硬核的进步来自于硬件技术的飞跃,大概在十几年前,服务器的硬件配置和今天完全没法比,那时候,一台企业级服务器可能就配了十几、几十个G的内存,硬盘大多是转速一万或一万五千转的机械硬盘(SCSI或SAS盘),虽然比家用硬盘快,但和现在的固态硬盘(SSD)比起来就是老爷车了,CPU的核心数量也有限,在这样的硬件条件下,一个几百G的数据库确实是个“庞然大物”,进行全表扫描、复杂查询或者大量数据写入时,I/O(输入输出)瓶颈会非常明显,速度慢得像蜗牛,甚至可能把服务器拖垮,但是今天呢?服务器标配几百G内存、上T内存都不稀奇;SSD几乎成了数据库服务器的标准配置,其读写速度是机械硬盘的几十上百倍;CPU的核心数也越来越多,硬件瓶颈的极大缓解,是MSSQL能够轻松管理500G甚至更大数据库的物理基础,这就好比以前是一条小土路跑卡车,当然颠簸缓慢还容易抛锚;现在修成了双向八车道的高速公路,跑同样的卡车自然就顺畅多了。(基于对近十年服务器硬件发展趋势的普遍认知)

MSSQL怎么突然就能撑起500G内容存储,真是大进步了吧?

MSSQL数据库引擎本身也在不断进化,微软在每个新版本中都加入了对大规模数据处理的优化,从SQL Server 2005开始引入的表分区功能,就是一个对付超大型表的利器,它允许数据库管理员把一张逻辑上的大表,根据某个规则(比如按时间)分割成多个物理上的小文件来存储,当用户查询某个月的数据时,数据库引擎可以聪明地只去扫描对应月份的那个小文件,而不是傻乎乎地扫描整个几百G的大表,这叫做“分区消除”,极大地提高了查询效率,这就好比一本一千页的巨著,如果没有目录和章节划分,你想找某个内容得从头翻到尾;但如果它分成了20章,每章50页,你直接翻到对应章节就行了,快得多。(功能特性参考自微软官方文档对SQL Server表分区的介绍)

MSSQL怎么突然就能撑起500G内容存储,真是大进步了吧?

再比如,SQL Server 2012版本引入的列存储索引,更是针对数据仓库这类海量数据查询场景的革命性技术,传统的索引是行存储的,它把一行的所有数据都存在一起,适合频繁更新和事务处理,但对于需要统计、分析大量数据的查询(计算全公司过去五年每个季度的销售总额”),行存储就需要把每一行的所有数据都读出来,其中很多字段是用不上的,浪费了宝贵的I/O资源,而列存储索引是把每一列的数据单独存放,这样,进行上述求和查询时,数据库几乎可以只读取“销售金额”和“日期”这两列的数据,需要处理的数据量大大减少,查询速度自然获得成倍的提升,这些引擎层面的优化,让MSSQL处理500G数据时的“智力”水平远远超过了十年前。(技术特性参考自微软官方文档对SQL Server列存储索引的阐述)

人们对数据库设计和管理的理念也成熟了,过去可能更多是“先干了再说”,把所有的数据都往一个数据库实例里塞,而现在,面对大数据量,有经验的架构师会更多地考虑分层、分库、读写分离等策略,可以将实时交易的热数据放在一个性能极高的OLTP数据库中,而将用于报表分析的历史冷数据归档到另一个OLAP数据仓库中,MSSQL本身也提供了像Always On可用性组这样的功能,不仅可以实现高可用,还能将只读查询分流到辅助副本上,减轻主数据库的压力,这种架构上的优化,使得单个MSSQL实例不需要“硬扛”所有的数据和访问压力,500G的数据被合理地组织和分布,管理起来自然就更游刃有余了。(架构理念基于常见的企业级数据库设计实践)

回到最初的问题:“MSSQL怎么突然就能撑起500G内容存储,真是大进步了吧?”答案就是,这不是“突然”的,而是硬件性能的摩尔定律、数据库引擎的持续智能化以及人们架构设计经验的积累,三者共同作用下的一个必然结果,500G在今天看来可能只是一个中等偏上的规模,很多企业的核心系统都远远超过这个量级,这个进步确实是巨大的,它使得过去只有顶级企业才能玩转的海量数据应用,现在更多的中小型企业也能借助MSSQL这样的平台来实现了,这背后是整个信息技术时代滚滚向前的缩影。