hanfeng.name

I am a software engineer with interests in web applications.

水平分表

前言

学习分库、分表的一记录,后期整理,添加示例。

正文

数据库分表与分库的实现方法:

tb_user_0 … tb_user_1 ….tb_user_2 …. tb_user_3


当多张表具有完全相同的数据结构时,我们认为这些表示对一个实体数据的横向切分。

每张表都可以有自己的id 但是所有切分出来的表必须具备全局uid 分表后要按照某个元素(通常全局id)进行某种算法的计算,得到表后缀。

id生成器。(用redis做id在断电的情况下有风险),通常用mysql

uuid 得到一个字符串

自建索引

当数据库大了,分表是必然的。分表之后,建索引是必然的。

将全局id进行一次md5将得到一个由16进制数值组成的32位字符串。 数据越多越均匀。分成15张表,

或分成256张表。

分成80张: FF = 255 255%80 取余数。分多少张表,就余多少。


如果只是做简单切分的时候后,我们会遇到问题:

  1. 当我们需要将这些数据进行统计与分析的时候,不能使用聚合函数
  2. 当我们查询某条数据时,我们必须要知道我要查询的数据在哪一张表里,否则我就需要查询所有的表来查找结果。

  3. 当我插入数据的时候,我必须尽可能的让每张表的负载均匀

  4. 当我要修改数据的时候,我必须明确我要修改的数据在哪里。

在不同的时期分表,会产生不同的问题。

  1. 项目启动阶段就进行分表
  2. 项目启动阶段没有分表,而是在项目进行到积累了一定数据量以后再进行分表
  3. 项目之前就进行切分过表,但是被切分后的表经过长时间运行,又产生了大量数据,需要再次分表

合理的分表不单单能解决单张表数据量过大的问题,还能优化我们的业务逻辑。

tb_product_store_sh tb_product_store_bj tb_product_store_hubei

基于区域位置的分表,非常适合做类似库存,商户信息,工商管理等有着明显区域性的数据分表。

基于IP地址的分表, 用于统计与分析数据。访问日志。 (几十万的数据开始考虑分表。) 当数据达到100多万的时候,就要考虑分表。

按时间分表, 日志。 财务报表。 绩效考核。

工资流水、销售业绩、出纳凭证等记录,按年份来分表。

考勤记录 销售业绩 个人考勤记录 签单记录 按月分表比较适合

季度、半年度、部门业绩 工资资产 等

Comments