1.数据库分库分表设计(1)
2.数据库分库分表,实现分库分表后的分页查询,比如所有用户信息分页显示,用户表q_user_01–q_user_10
淘宝的做法是拆分买家库和卖家库,也就是两个库:买家库、卖家库。
买家库,按照用户的id来分库分表。卖家库,按照卖家的id来分库分表。
实际上是通过数据冗余解决的:一个订单,在买家库里面有,在卖家库里面也存储了一份。下订单的时候,要写两份数据。先把订单写入买家库里面去,然后通过消息中间件来同步订单数据到卖家库里面去。
买家库的订单a修改了后,要发异步消息,通知到卖家库去,更改状态。
————————————————
id:000000000001
id:000000000002
id:000000000003
sys_database_conf
sys_table_conf
| id | ip | port | database | user | password | create_time | update_time |
|---|---|---|---|---|---|---|---|
| 1 | 127.0.0.1 | 3306 | qphp_db_01 | root | 123456 | 1232132101 | 123123231202 |
| 2 | 127.0.0.1 | 3306 | qphp_db_02 | root | 123456 | 1232132101 | 123123231202 |
| 3 | 127.0.0.1 | 3306 | qphp_db_03 | root | 123456 | 1232132101 | 123123231202 |
| 4 | 127.0.0.2 | 3306 | qphp_db_04 | root | 123456 | 1232132101 | 123123231202 |
| 5 | 127.0.0.2 | 3306 | qphp_db_05 | root | 123456 | 1232132101 | 123123231202 |
| 6 | 127.0.0.2 | 3306 | qphp_db_06 | root | 123456 | 1232132101 | 123123231202 |
| 7 | 127.0.0.3 | 3306 | qphp_db_07 | root | 123456 | 1232132101 | 123123231202 |
| 8 | 127.0.0.3 | 3306 | qphp_db_08 | root | 123456 | 1232132101 | 123123231202 |
| 9 | 127.0.0.3 | 3306 | qphp_db_09 | root | 123456 | 1232132101 | 123123231202 |
| id | table_name | shard_rule | create_time | update_time |
|---|---|---|---|---|
| 1 | q_user | 10 | 1232132101 | 123123231202 |
| 2 | q_goods商家商品表 | 100 | 1232132101 | 123123231202 |
| 3 | q_business_order商家订单表,订单id与消费者订单表订单id相同 | 200 | 1232132101 | 123123231202 |
| 3 | q_consumer _order消费者订单表,订单id与商家订单表订单id相同 | 200 | 1232132101 | 123123231202 |
| 4 | q_order_goods_info订单详细表 | 200 | 1232132101 | 123123231202 |
| 5 | q_address | 20 | 1232132101 | 123123231202 |
| 订单分为商家订单表,消费者订单表是冗余数据 |
对用户分布式id进行取模
用户分布式id=9
要连接的主机数据库id=(分布式id%(sys_database_conf表条数))+1
要连接的主机数据库id=1 ,
sys_database_conf 表查询id等于1的主机信息,并连接数据库
q_user_01用户表设计
| id | user_name | password | is_business_state | create_time | update_time |
|---|---|---|---|---|---|
| 1 | mumu | 123456 | 1:普通用户2:商家 | 1232132101 | 123123231202 |
| 2 | mumu1 | 123456 | 1:普通用户2:商家 | 1232132101 | 123123231202 |
| 3 | mumu2 | 123456 | 1:普通用户2:商家 | 1232132101 | 123123231202 |
q_business_order_01用户表设计
| id | order_sn | business_uid | consumer_uid | order_status | total_amount | create_time | update_time |
|---|---|---|---|---|---|---|---|
| 1 | O000001 | 0001 | 01 | 1:未付2:已付3:已完成4:申请退款5:已退款 | 99.01 | 123123231202 | 123123231202 |
| 2 | O000002 | 0002 | 02 | 1:未付2:已付3:已完成4:申请退款5:已退款 | 10.01 | 123123231202 | 123123231202 |
| 3 | O000003 | 0003 | 03 | 1:未付2:已付3:已完成4:申请退款5:已退款 | 17.99 | 123123231202 | 123123231202 |
用户分布式id=9
对用户分布式id进行取模
用户要插入的表id=(用户分布式id%(sys_table_conf表的q_user字段对应的shard_rule规则个数10))+1 = 10
要插入用户表:q_user_10
4、其他表都是用用户id进行分片,保证同一个用户的信息在同一张表内用户分布式id=9
对用户分布式id进行取模
用户要插入的表id=(用户分布式id%(sys_table_conf表的q_goods ,q_address 字段对应的shard_rule规则个数10))+1 = 10
q_order表有商家用户id,购买者用户id,
以购买者id做分片,购买者的订单在同一个分片表,方便购买者查询订单
商家用户id查询所有购买者下的订单,就要扫描全库全表q_order01-q_order100
插入订单数据时,同时按商家id对数据库取模,获取所在数据库,
在按照商家id对q_business_order的规则200取模,获取所在的商家订单表,插入订单信息。
在按照消费者id对q_consumer _order的规则200取模,获取所在的消费者订单表,插入订单信息。
5.1.3、商家订单表,消费者订单表之间状态同步使用消息对列MQ 5.2、q_order_goods_info表最好以q_order的订单id做分片,点订单好在查询一次详情,效率最好,如果使用用户id无论商家还是消费者,查询都要做相应的取舍


