mysql 分表
将表按列分开 把表的字段进行拆分,即一张字段比较多的表拆分为多张表,这样使得行数据变小。一方面,可以减少客户端程序和数据库之间的网络传输的字节数,因为生产环境共享同一个网络带宽,随着并发查询的增多,有可能造成带宽瓶颈从而造成阻塞。另一方面,一个数据块能存放更多的数据,在查询时就会减少 I/O 次数。 原则
例如 BLOB 和 TEXT 字符串类型的字段,以及 TINYBLOB、 MEDIUMBLOB、 LONGBLOB、 TINYTEXT、 MEDIUMTEXT、 LONGTEXT字符串类型。这样可以减少客户端程序和数据库之间的网络传输的字节数。
举个例子,假设用户表的设计中,还存在“最后登录时间”字段,每次用户登录时会被更新。这张用户表会存在频繁的更新操作,此外,每次更新时会导致该表的查询缓存被清空。所以,可以把这个字段放到另一个表中,这样查询缓存会增加很多性能。
不然在联合查询的情况下,会带来数据库额外压力。
将表按数据行分开,许多策略有:取模分表,时间维度分表,以及自定义 Hash 分表 策略可分为随机分表和连续分表两种情况。例如,取模分表就属于随机分表,而时间维度分表则属于连续分表。 连续分表可以快速定位到表进行高效查询,大多数情况下,可以有效避免跨表查询。如果想扩展,只需要添加额外的分表就可以了,无需对其他分表的数据进行数据迁移。但是,连续分表有可能存在数据热点的问题,有些表可能会被频繁地查询从而造成较大压力,热数据的表就成为了整个库的瓶颈,而有些表可能存的是历史数据,很少需要被查询到。
随机分表是遵循规则策略进行写入与读取,而不是真正意义上的随机。通常,采用取模分表或者自定义 Hash 分表的方式进行水平拆分。随机分表的数据相对比较均匀,不容易出现热点和并发访问的瓶颈。但是,分表扩展需要迁移旧的数据。此外,随机分表比较容易面临跨表查询的复杂问题。
库内分表,仅仅是解决了单表数据过大的问题,但并没有把单表的数据分散到不同的物理机上,因此并不能减轻 MySQL 服务器的压力,仍然存在同一个物理机上的资源竞争和瓶颈,包括 CPU、内存、磁盘 IO、网络带宽等。
垂直拆分,按照业务和功能划分,把数据分别放到不同的数据库中。举个例子,可以划分资讯库、百科库等。
水平拆分,把一张表的数据划分到不同的数据库,两个数据库的表结构一样。实际上,水平分库与水平分表类似,水平拆分有许多策略,例如,取模分库,自定义 Hash 分库等,在不同策略分库情况下,根据各自的策略写入与读取。举个例子,随着业务的增长,资讯库的单表数据过大,此时采取水平拆分策略,根据取模分库。
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。