数据库分库分表的依据及产生的问题

分库分表的必要性

关系型数据库本身比较容易成为系统瓶颈,单机存储容量、连接数、处理能力都有限。当单表的数据量达到 1000W 或 100G 以后,由于查询维度较多,即使添加从库、优化索引,做很多操作时性能仍下降严重。此时就要考虑对其进行切分了,切分的目的就在于减少数据库的负担,缩短查询时间。

库内分表只解决了单一表数据量过大的问题,但没有将表分布到不同机器的库上,因此对于减轻 MySQL 数据库的压力来说,帮助不是很大,大家还是竞争同一个物理机的 CPU、内存、网络 IO,最好通过分库分表来解决。

分表类型及依据

数据切分根据其切分类型,可以分为两种方式:垂直 (纵向) 切分和水平 (横向) 切分
垂直切分:多字段表拆分成多个少字段表。
     tab(a,b,c,d)--->tab1(a,b)+tab2(c,d)
水平切分:按照业务类型拆分成多个同字段表。
    tab(a,b,c,d)--->tab1(a,b,c,d)+tab2(a,b,c,d)

拆表依据根据id范围(缺点是热点数据不均匀)、根据取模范围、根据业务范围。
根据数值范围,比如id 1-1000,还有时间范围
根据数值取模, hash 取模 mod ,余数为0的放一个库,1放第二个库,类推


分库分表问题


1.事务一致性:XA协议、二阶段提交。最终事务一致性:允许一点时间内,最终事务一致即可。事务补偿:对数据进行对账检查。
2.跨节点join查询
  (1)字典表关联查询,可以每个库都备一份
  (2)字段冗余,反范式设计,比如订单表保存user_id的时候也保存user_name
   (3)分两次查询
3.主键冲突(序列),只会出现在按id范围划分的时候
  序列的起始值不一样,步长一样,就可以错开。
4.跨库排序、最大值
  要一个个取出来,最后再集中排序,如果取最大值,要取每个分片的最大值,再集中取最大值。

猜你喜欢

转载自blog.csdn.net/x18094/article/details/114285346