MySQL分库分表

MySQL分库分表方法

水平分库

将同一个表的数据按照某种规则拆分到不同的数据库中。例如,按用户ID的哈希值将用户表分散到多个库中,每个库包含部分用户数据。这种方式适合数据量大但查询条件明确的场景。

水平分表

将同一个表的数据按行拆分到多个结构相同的表中。例如,按时间范围将订单表拆分为order_2023order_2024等。查询时需明确表名或动态拼接SQL。

垂直分库

按业务模块将表分布到不同库中。例如,用户相关表放在用户库,商品相关表放在商品库。减少单库压力,但跨库事务复杂。

垂直分表

将宽表的字段按访问频率拆分到多个表中。例如,将用户基本信息与用户详情信息分开存储。减少单表宽度,提升高频字段查询效率。

分库分表实现工具

ShardingSphere

Apache开源的分布式数据库中间件,支持读写分离、分片、分布式事务等功能。通过配置YAML文件或Java代码实现分片规则。

MyCat

基于Proxy的数据库中间件,支持MySQL分库分表、读写分离。需在schema.xml中配置逻辑表与物理表映射关系。

TDDL

淘宝开源的分布式数据库层,支持动态数据源切换、分库分表路由。适合与Spring生态集成。

分库分表注意事项

ID生成

避免使用自增ID,改用分布式ID生成器(雪花算法、UUID等)。确保全局唯一性,防止主键冲突。

跨分片查询

避免多分片JOIN操作。可通过冗余字段、数据异构或业务层聚合实现查询需求。

事务一致性

优先考虑最终一致性,使用消息队列或定时任务补偿。如需强一致性,可引入Seata等分布式事务框架。

扩容问题

设计分片规则时预留扩容空间。例如,哈希分片采用倍数扩容,减少数据迁移量。

分库分表后查询优化

路由优化

查询时尽量带上分片键(如user_id),避免全分片扫描。例如:

sql 复制代码
SELECT * FROM user WHERE user_id = 123 AND create_time > '2023-01-01';

结果合并

中间件或业务层对多个分片结果进行排序、分页聚合。注意深分页性能问题。

全局索引表

为跨分片查询建立索引表,存储关键字段与分片位置的映射关系。

相关推荐
YSL07012430 分钟前
时间复杂度和空间复杂度
数据结构
洋不写bug43 分钟前
链表面试笔试经典题目详细解析,题目多解法,复杂度分析
数据结构·链表·面试
白狐_7982 小时前
408 数据结构|KMP做题方法:next、nextval和高频易错点
数据结构·算法
数据库小学妹2 小时前
MySQL长事务复盘:Sleep连接、MDL排队与undo滞留
运维·数据库·mysql
计算机毕设定制辅导-无忧学长2 小时前
基于Spring Boot的玄幻小说个性化推荐平台设计与实现
java·vue.js·spring boot·后端·mysql·推荐算法
棣廷4 小时前
初识MySQL——DQL数据查询语言详解
数据库·mysql
来一碗刘肉面4 小时前
平衡二叉树的删除
数据结构·算法
wabs6664 小时前
关于二叉树【力扣199.二叉树的右视图的思考】
数据结构·c++·算法·leetcode·二叉树·层序遍历
hope_wisdom4 小时前
C/C++数据结构之二叉树的遍历
c语言·数据结构·c++·二叉树·深度优先·广度优先
LayZhangStrive5 小时前
数据结构与算法 - 堆排序
java·数据结构·算法·排序算法·堆排序·大根堆