# 跨库分页/ 分表分页/ 跨库分页
WARNING
当MySQL单表数据量过大,比如超过5千万条的时候,读写性能变得很差。而且常规的优化手段已经不起作用了,比如:SQL调优、添加索引、主从复制、读写分离。这时候就需要用到MySQL终极优化方案 — 分库分表。
# 一、分表对分页的影响
# 1.1 分段法
(比如:有时间属性的数据,类似订单这种,可以按下单时间拆分,每个月 1 张表)
# 1.2 模余均摊法
(比如:字段值对 2 取模求余数,根据余数决定分到哪个表,该方法也简称为取余法)
# 二、全局法(limit x+y)
本质上我们在每个子数列(即:分表)上 limit x,y 时,取出来的数据就有可能已经产生缺失了。
TIP
把范围扩大,分表sql上的limit x,y 变成 limit 0, x+y ,这样改写后,相当于分表中把"每页最后一条数据"之前的所有数据全都取出来了(当然:这里面可能会有不需要的多余数据),然后内存中合并在一起,再取x偏移量后的y条数据。
实际用处不大
# 三、二次查询法
# 怎么判断项目是需要分库还是要分表?是先分库还是先分表?
- 当数据库的QPS过高,数据库连接数不足的时候,就需要分库。
- 当单表数据量过大,读写性能较差,就需要分表。
- 当两者都有的时候,就需要分库分表。
- 至于先分库还是先分表?建议先分表,如果分表能解决问题,就不需要分库了,毕竟需要单独服务器资源,成本更高。
# 分库分表有哪些拆分方案呢
分库分表有垂直拆分和水平拆分。垂直拆分又有垂直分库、垂直分表
- 垂直分库,不同的业务拆分到不同的数据库。
- 垂直分表,把长度较大或者访问频次较低的字段,拆分到扩展表中。
- 水平分表,单表数据量过大时,按照订单ID拆分到多张表中。