技术实践

为什么需要分表MySQL

最近在做一个爬虫,因为需要有大量数据,而我只开了一张表,突然想到了需不需要分表,把内容字段新开一张表

羊先生的头像
羊先生2020.11.11 · 11 分钟阅读 · 123 阅读
为什么需要分表MySQL封面
文章正文还需 11 分钟

一、分库分表背景

为什么分库

1.1数据库最容易产生性能瓶颈的服务组件。数据库连接数资源捉襟见肘和数据库因为表多、数据多造成的性能问题。这里以淘宝为例,在淘宝平台向共享服务体系改造的过程中,通过各个服务中心拥有各自独立数据库的方式,即采用数据库垂直分区的方式对业务数据进行分区。

1.2单一服务中心的数据访问压力也必然会达到单机数据库的承载上限,所以在进行服务化改造的同一时间段内,需要对数据库能力做扩展的工作。

1.3.单台数据库 这里以mysql为例,mysql数据库,当访问连接数过多时,就会出现‘too many connections’的错误,一般来说是访问量太大或者数据库设置的最大连接数太小的原因。Mysql默认的最大连接数为100.这个连接连接数可以修改,而mysql服务允许的最大连接数为16384.虽然可以通过连接池可以一定程序上优化连接,但是当数据量过大时,单台数据库显示已经不能支撑应用服务器的访问。所以就需要做分库,具体分库方法下面会有详细介绍。

1.4 在实际的应用中,绝大部分情况都是读远大于写。Mysql提供了读写分离的机制,所有的写操作都必须对应到Master,读操作可以在 Master和Slave机器上进行,Slave与Master的结构完全一样,一个Master可以有多个Slave,甚至Slave下还可以挂 Slave,通过此方式可以有效的提高DB集群的 QPS.

所有的写操作都是先在Master上操作,然后同步更新到Slave上,所以从Master同步到Slave机器有一定的延迟,当系统很繁忙的时候,延迟问题会更加严重,Slave机器数量的增加也会使这个问题更加严重。

此外,可以看出Master是集群的瓶颈,当写操作过多,会严重影响到Master的稳定性,如果Master挂掉,整个集群都将不能正常工作。

所以

  1. 当读压力很大的时候,可以考虑添加Slave机器的分式解决,但是当Slave机器达到一定的数量就得考虑分库了。

2. 当写压力很大的时候,就必须得进行分库操作。

2.为什么分表

有一组数据可以参考:

基本指标:

库物理文件大小<100G

表<100

字段<200

单表记录数<500W

经测试在单表1000万条记录一下,写入读取性能是比较好的. 这样在留点buffer,那么单表全是数字类型的保持在800万条记录以下, 有字符型的单表保持在500万以下.如果按 100库100表来规划,如用户业务:

500万100100 = 50000000万 = 5000亿记录.供参考,具体按按业务做规划.

3.什么是分区

分表是将一张表分成N多个小表,分区是把一张表的数据分成N多个区块,这些区块可以在同一个磁盘上,也可以在不同的磁盘上。mysql的分表是真正的分表,一张表分成很多表后,每一个小表都是完整的一张表,都对应三个文件,一个.MYD数据文件,.MYI索引文件,.frm表结构文件。

查看原文

MySQL单表最大记录数不能超过多少?

MySQL单表最大记录数不能超过多少?

很多人困惑这个问题。其实,MySQL本身并没有对单表最大记录数进行限制,这个数值取决于你的操作系统对单个文件的限制本身。
从性能角度来讲,MySQL单表数据不要超过多少呢?业界流传是500万行。超过500万行就要考虑分表分库了。

笔者以为,其实不然。

曾经在中国互联网技术圈广为流传着这么一个说法:MySQL 单表数据量大于 2000 万行,性能会明显下降。事实上,这个传闻据说最早起源于百度。具体情况大概是这样的,当年的 DBA 测试 MySQL性能时发现,当单表的量在 2000 万行量级的时候,SQL 操作的性能急剧下降,因此,结论由此而来。然后又据说百度的工程师流动到业界的其它公司,也带去了这个信息,所以,就在业界流传开这么一个说法。

再后来,阿里巴巴《Java 开发手册》提出单表行数超过 500 万行或者单表容量超过 2GB,才推荐进行分库分表。对此,有阿里的黄金铁律支撑,所以,很多人设计大数据存储时,多会以此为标准,进行分表操作。

那么,你觉得这个数值多少才合适呢?为什么不是 300 万行,或者是 800 万行,而是 500 万行?也许你会说这个可能就是阿里的最佳实战的数值吧?那么,问题又来了,这个数值是如何评估出来的呢?稍等片刻,请你小小思考一会儿。

事实上,这个数值和实际记录的条数无关,而与 MySQL 的配置以及机器的硬件有关。因为,MySQL 为了提高性能,会将表的索引装载到内存中。InnoDB buffer size 足够的情况下,其能完成全加载进内存,查询不会有问题。但是,当单表数据库到达某个量级的上限时,导致内存无法存储其索引,使得之后的 SQL 查询会产生磁盘 IO,从而导致性能下降。当然,这个还有具体的表结构的设计有关,最终导致的问题都是内存限制。这里,增加硬件配置,可能会带来立竿见影的性能提升哈。

那么,我对于分库分表的观点是,需要结合实际需求,不宜过度设计,在项目一开始不采用分库与分表设计,而是随着业务的增长,在无法继续优化的情况下,再考虑分库与分表提高系统的性能。

对此,阿里巴巴《Java 开发手册》补充到:如果预计三年后的数据量根本达不到这个级别,请不要在创建表时就分库分表。那么,回到一开始的问题,你觉得这个数值多少才合适呢?我的建议是,根据自身的机器的情况综合评估,如果心里没有标准,那么暂时以 500 万行作为一个统一的标准,相对而言算是一个比较折中的数值。

总结

像我这小网站,哪怕爬虫爬了几十万条数据甚至百万条也不要分表,
注意点:每条包含文章内容,在查询列表的时候需要过滤大的字段

更多文章

MySQL 分库分表方案,总结的非常好!
大众点评订单系统分库分表实践