PHP+MySQL 千万级数据处理案例(二) 分表的意义

前一篇博客PHP+MySQL 千万级数据处理案例(一)(分表)我们讲过了分表的含义以及其中的方式之一,当然除了对主键取模,你也可以用hash来搞,这里就不多讲啦!今天我们说说分表的意义,意义,意义,意义是什么???

关于分表:顾名思义就是一张数据量很大的表拆分成几个表分别进行存储。
我们先来大概了解以下一个数据库执行SQL的过程:
接收到SQL –> 放入SQL执行队列 –> 使用分析器分解SQL –> 按照分析结果进行数据的提取或者修改 –> 返回处理结果。在这个过程中一般比较花时间的是在队列里的等待时间和执行时间。归根到底就是执行时间,执行时间减少了等待时间自然就变短了。
为了保证数据的完整性,数据库有锁定机制。MySQL中有表锁定和行锁定,MySQL中myisam存储引擎是表锁定,innodb存储引擎是行锁定。分为包含共享锁和独占锁两种。独占锁就是整个数据文件归一个线程所有,其他线程就必须等待。如果数据太多,一次执行的时间太长,特别是在锁表的情况下,就会导致大量的其他SQL等待执行,严重影响系统的正常使用。
另外更新表数据时会导致索引更新,当单表数据量很大时这个过程比较耗时,这就是为什么对大表进行新增操作会比较慢的原因。并且更新表数据会进行表级锁或者行锁,这样就导致其他操作等待!
所以我们将大表拆分为多个字表,那么在更新或者查询数据的时候,压力会分散到不同的表上。由于分表之后每个表的数据较小,不管是查询还是更新都极大的提高了速度,即使出现最坏的“锁表”的情况,那其他表还是可以并行使用。所以我们将大表拆分为多个字表,那么在更新或者查询数据的时候,压力会分散到不同的表上。由于分表之后每个表的数据较小,不管是查询还是更新都极大的提高了速度,即使出现最坏的“锁表”的情况,那其他表还是可以并行使用。

分表的几种常见策略:
(1)预先估计某个大表的数据量,按实际情况将其均分为固定数量表
根据分表算法,将数据平均分散到不同的数据表中,常见处理方式有对自增id取模、对某个字段进行hash。比如某系统用户预计支持1亿用户数,分100个表存储用户数据,按照自增id的最后2位来分表,对100取模,那么用户数据表就是user_01~user_99。
(2)按时间拆分
对于那种根据时间增长较快的数据可以按时间拆分,根据业务实际情况按天、按月、按年等进行拆分。比如进销存数据,我们可以按月分表,形如jxc_data_201201、jxc_data_201202
(3)按每个表固定记录行数拆分
一般根据自增长ID拆表,每张表存储指定数量的数据。一张表的数据行数到了指定数量,就自动保存到新的表里。
(4)将很久之前的数据迁移到一张历史表
比如日志记录,一般只会查询3个月之内的日志,对于超过三个月的日志记录我们可以迁移到到迁移到另一张表中,比如log_history

本作品采用《CC 协议》,转载必须注明作者和本文链接
胡军
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!