MySQL性能优化(五):分表

单表行数超过 500 万行或者单表容量超过 2GB,才推荐进行分库分表。
例如QQ,一般一个人有两个或者更多账号,整个中国QQ要有多上账号,可能有几十亿个账号

分表的关键是找到分表的标准,即根据什么值进行分表。

表名可以使用1、2、3等编号,对id去模
id%3 = 编号

插入查询都要计算出来要操作的表名

user0
user1
user2

或者其他唯一的字段,如手机号,邮箱,日期(月) 尽量使得每个表数据量均匀

单表一到两年内数据量超过500w或数据容量超过10G考虑分表,需提前考虑历史数据迁移或应用自行删除历史数据,采用等量均衡分表或根据业务规则分表均可。要分表的数据表必须与DBA商量分表策略

用HASH进行散表,表名后缀使用十进制数,下标从0开始
按日期时间分表需符合YYYY[MM][DD][HH]格式
采用合适的分库分表策略。例如千库十表、十库百表等
禁止使用分区表,分区表对分区键有严格要,分区表在表变大后执行DDL、SHARDING、单表恢复等都变得更加困难。
拆分大字段和访问频率低的字段,分离冷热数据

  • 水平分割:即根据一列或者多列数据的值把数据行放到两个独立的表中。水平拆分通常在以下几种情况下使用:

    • 表很大,分隔后可以降低在查询是需要读的数据和索引的页数,同时也降低了索引的层数,提高查询速度哦
    • 表中的数据本来就有独立性,例如分别记录各个地区的数据或者不同时期的数据,特别是有些数据常用,而另外一些数据不常用。
    • 需要把数据存放到多个介质上。

    例如:一定电话账单就可以分成多个表:最近3个月的账单数据存在一个表,3个月前的历史账单存放到另一种表,超过一年的历史账单可以存储到单独的存储介质上,这种拆分是最常用的水平拆分方法。
    水平拆分会给应用增加复杂度,它通常在查询是需要多个表名,查询所欲数据需要union操作。在许多数据库应用中,这种复杂性会超过它带来的有点,因为
    只要索引关键字不大,则在索引用于查询时,表中增加2-3倍数据量,查询时也就增加读一个索引层的磁盘次数,所以水平拆分要考虑数据量的增长速度,
    根据实际情况决定是否需要对表进行水平拆分。

  • 垂直分割:即把主码和一些列放到一个表,然后把主码和另外的列放到另一个表中。如果一个表中的某些列常用,而另一些列不常用,可以采用
    垂直拆分,另外垂直拆分可以使得数据行变小,一个数据页就能存放更多的数据,在查询时就会减少I/O次数,其缺点是需要管理荣誉列,查询所有数据需要联合操作
    垂直分割适用于记录不是非常多的,但是字段却很多,这样占用空间比较大,检索时需要执行大量的I/O,严重降低了性能,这个时候需要把大的自读那拆分到另一个表中,并且该表与源表时一对一关系。

例如 用户表中的自我介绍,技能。如 tbl_user, tbl_userinfo, tbl_order, tbl_order_detail
如:文章tbl_articles(id, titile, create_time) tbl_articles_detail(content)

中间表查询:大表统计

创建一个中间表,中间表的结构和原始表结构一样,或多字段,将原始表中的部分数据转移到中间表,然后对中间表进行统计
中间表复制源表部分数据,并且与源表相隔离,在中间表上做统计查询不会对在线应用产生负面影响
中间表上可以灵活的添加索引增加临时用的新字段,从而达到提高统计查询效率和辅助统计查询作用。

猜你喜欢

转载自blog.csdn.net/vbirdbest/article/details/81084182