一、Mysql大数据量问题与解决方案
Mysql单表适合的最大数据量是多少?
我们说Mysql单表适合存储的最大数据量,自然不是说能够存储的最大数据量,如果是说能够存储的最大量,那么,如果你使用自增ID,最大就可以存储2^32或2^64条记录了,这是按自增ID的数据类型int或bigint来计算的;如果你不使用自增id,且没有id最大值的限制,如使用足够长度的随机字符串,那么能够限制单表最大数据量的就只剩磁盘空间了。显然我们不是在讨论这个问题。
影响Mysql单表的最优最大数量的一个重要因素其实是索引。
我们知道Mysql的主要存储引擎InnoDB采用B+树结构索引。(至于为什么Mysql选择b+树而不是其他数据结构来组织索引,不是本文讨论的话题,之后的文章会讲到。)那么B+树索引是如何影响Mysql单表数据量的呢?
B+树
一棵B+树如下所示:
Mysql的B+树索引存储在磁盘上,Mysql每次读取磁盘Page的大小是16KB,为了保证每次查询的效率,需要保证每次查询访问磁盘的次数,一般设计为2-3次磁盘访问,再多性能将严重不足。MysqlB+树索引的每个节点需要存储一个指针(8Byte)和一个键值(8Byte)。因此计算16KB/(8B+8B)=1K
16KB可以存储1K个节点,3次磁盘访问(即B+树3的深度)可以存储1K_1K_1K即10亿数据。
如果查询依赖非主键索引,那么还涉及二级索引。这样数据量将更小。
拆分
分而治之——没有什么问题不能通过拆分一次来解决,不行就拆多次。
Mysql单表存储的数据量有限。一个解决大数据量存储的办法就是分库分表。说白了就是一个数据库一张表放不下那么多数据,那就分多个数据库多张表存储。
拆分可分为垂直拆分和水平拆分。
垂直拆分是按照不同的表(或者Schema)来切分到不同的数据库(主机)之上,水平拆分则是根据表中的数据的逻辑关系,将同一个表中的数据按照某种条件拆分到多台数据库(主机)上面或多张相同Schema的不同表中。
垂直拆分的最大特点就是规则简单,实施也更为方便,尤其适合各业务之间的