[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"site-config":3,"primary-menu":6,"cat-sharding":85,"catposts-sharding":99,"post-detail-post-sharding-migration-5d5ab7fd":208},{"config":4,"socialLinks":5},null,[],{"metadata":7,"spec":10,"menuItems":20},{"name":8,"creationTimestamp":9},"primary","2026-09-12T06:13:55.024154Z",{"displayName":11,"menuItems":12},"主菜单",[13,14,15,16,17,18,19],"88c3f10b-321c-4092-86a8-70db00251b74","menu-item-izrtmxer","c4c814d1-0c2c-456b-8c96-4864965fee94","menu-item-column","menu-item-tools","menu-item-zsxq","menu-item-ocrxlczu",[21,30,40,49,58,67,76],{"displayName":22,"metadata":23,"spec":25,"status":28,"children":29},"首页",{"name":13,"creationTimestamp":24},"2026-09-12T06:13:54.422830Z",{"displayName":22,"href":26,"priority":27,"menuName":8},"\u002F",0,{"displayName":22,"href":26},[],{"displayName":31,"metadata":32,"spec":34,"status":38,"children":39},"Java面试八股",{"name":14,"creationTimestamp":33},"2026-09-13T09:42:02.854891Z",{"displayName":31,"href":35,"target":36,"priority":37,"menuName":8},"\u002Fjava-interview","_self",1,{"displayName":31,"href":35},[],{"displayName":41,"metadata":42,"spec":44,"status":47,"children":48},"文章",{"name":15,"creationTimestamp":43},"2026-09-12T06:13:54.457307Z",{"displayName":41,"href":45,"priority":46,"menuName":8},"\u002Farchives",2,{"displayName":41,"href":45},[],{"displayName":50,"metadata":51,"spec":53,"status":56,"children":57},"项目实战",{"name":16,"creationTimestamp":52},"2026-09-14T00:35:08.138170Z",{"displayName":50,"href":54,"target":36,"priority":55,"menuName":8},"\u002Fcolumn",3,{"displayName":50,"href":54},[],{"displayName":59,"metadata":60,"spec":62,"status":65,"children":66},"在线工具",{"name":17,"creationTimestamp":61},"2026-09-14T00:35:08.171474Z",{"displayName":59,"href":63,"target":36,"priority":64,"menuName":8},"\u002Ftools",4,{"displayName":59,"href":63},[],{"displayName":68,"metadata":69,"spec":71,"status":74,"children":75},"知识星球",{"name":18,"creationTimestamp":70},"2026-09-14T00:35:08.199145Z",{"displayName":68,"href":72,"target":36,"priority":73,"menuName":8},"\u002Fzsxq",5,{"displayName":68,"href":72},[],{"displayName":77,"metadata":78,"spec":80,"status":83,"children":84},"特价云服务器",{"name":19,"creationTimestamp":79},"2026-09-25T15:30:59.201614Z",{"displayName":77,"href":81,"target":36,"priority":82,"menuName":8},"\u002Fserver",6,{"displayName":77,"href":81},[],{"metadata":86,"spec":91,"status":97,"postCount":73},{"name":87,"creationTimestamp":88,"labels":89},"sharding","2026-09-13T09:13:26.020943Z",{"haloweb.section":90},"interview",{"displayName":92,"slug":87,"cover":93,"description":94,"priority":95,"hideFromList":96,"preventParentPostCascadeQuery":96},"分库分表面试题","","分库分表面试题：分片策略、路由扩容、分布式主键、跨片查询与数据一致性方案。",20,false,{"permalink":98,"postCount":73,"visiblePostCount":73},"\u002Fcategories\u002Fsharding",[100,124,145,166,187],{"metadata":101,"spec":104,"status":113,"categories":118},{"name":102,"creationTimestamp":103},"post-sharding-shardingsphere-9d880c74","2026-09-13T10:01:13.510910Z",{"title":105,"slug":106,"cover":93,"excerpt":107,"publishTime":109,"categories":110,"tags":111,"priority":27,"pinned":96,"deleted":96,"visible":112,"allowComment":108},"ShardingSphere 的核心功能？","sharding-shardingsphere",{"raw":93,"autoGenerate":108},true,"2026-09-13T10:01:13.565762Z",[87],[],"PUBLIC",{"permalink":114,"excerpt":115,"lastModifyTime":116,"phase":117},"\u002Farchives\u002Fsharding-shardingsphere","一、定位 ShardingSphere 是分布式数据库中间件，提供分库分表、读写分离、数据加密等能力。 二、三种模式 ShardingSphere-JDBC：嵌入应用，JAR 包方式，性能好但只支持 Java。 ShardingSphere-Proxy：独立部署代理，支持多语言，有网络开销。 Sha","2026-09-16T09:16:37.209427Z","PUBLISHED",[119],{"metadata":120,"spec":122,"status":123,"postCount":73},{"name":87,"creationTimestamp":88,"labels":121},{"haloweb.section":90},{"displayName":92,"slug":87,"cover":93,"description":94,"priority":95,"hideFromList":96,"preventParentPostCascadeQuery":96},{"permalink":98,"postCount":73,"visiblePostCount":73},{"metadata":125,"spec":128,"status":135,"categories":139},{"name":126,"creationTimestamp":127},"post-sharding-migration-5d5ab7fd","2026-09-13T10:01:13.348573Z",{"title":129,"slug":130,"cover":93,"excerpt":131,"publishTime":132,"categories":133,"tags":134,"priority":27,"pinned":96,"deleted":96,"visible":112,"allowComment":108},"分库分表扩容如何平滑迁移？","sharding-migration",{"raw":93,"autoGenerate":108},"2026-09-13T10:01:13.392795Z",[87],[],{"permalink":136,"excerpt":137,"lastModifyTime":138,"phase":117},"\u002Farchives\u002Fsharding-migration","一、取模扩容问题 user_id % 4 改为 % 8，大部分数据需要迁移。 二、方案一：停机迁移 停机，写脚本把数据按新规则重新分配。 简单但有停机时间。 三、方案二：双写 + 迁移 新数据同时写旧分片和新分片。 后台把旧数据迁移到新分片。 校验一致后，切读到新分片。 停写旧分片。 - 不停机但复","2026-09-16T09:16:38.181057Z",[140],{"metadata":141,"spec":143,"status":144,"postCount":73},{"name":87,"creationTimestamp":88,"labels":142},{"haloweb.section":90},{"displayName":92,"slug":87,"cover":93,"description":94,"priority":95,"hideFromList":96,"preventParentPostCascadeQuery":96},{"permalink":98,"postCount":73,"visiblePostCount":73},{"metadata":146,"spec":149,"status":156,"categories":160},{"name":147,"creationTimestamp":148},"post-sharding-id-gen-2d3d5a55","2026-09-13T10:01:13.134819Z",{"title":150,"slug":151,"cover":93,"excerpt":152,"publishTime":153,"categories":154,"tags":155,"priority":27,"pinned":96,"deleted":96,"visible":112,"allowComment":108},"分布式 ID 生成方案有哪些？","sharding-id-gen",{"raw":93,"autoGenerate":108},"2026-09-13T10:01:13.220993Z",[87],[],{"permalink":157,"excerpt":158,"lastModifyTime":159,"phase":117},"\u002Farchives\u002Fsharding-id-gen","一、UUID 优点：本地生成，无网络开销，唯一。 缺点：无序，索引效率低；太长。 二、数据库自增 优点：简单，有序。 缺点：单库瓶颈；分库后不全局唯一。 三、号段模式 从数据库批量获取 ID 段（如 1-1000），在内存中使用。 优点：性能高，减少数据库压力。 缺点：服务重启可能断号。 四、Sno","2026-09-16T09:16:35.488658Z",[161],{"metadata":162,"spec":164,"status":165,"postCount":73},{"name":87,"creationTimestamp":88,"labels":163},{"haloweb.section":90},{"displayName":92,"slug":87,"cover":93,"description":94,"priority":95,"hideFromList":96,"preventParentPostCascadeQuery":96},{"permalink":98,"postCount":73,"visiblePostCount":73},{"metadata":167,"spec":170,"status":177,"categories":181},{"name":168,"creationTimestamp":169},"post-sharding-key-7d06fbdb","2026-09-13T10:01:12.933408Z",{"title":171,"slug":172,"cover":93,"excerpt":173,"publishTime":174,"categories":175,"tags":176,"priority":27,"pinned":96,"deleted":96,"visible":112,"allowComment":108},"如何选择分片键？","sharding-key",{"raw":93,"autoGenerate":108},"2026-09-13T10:01:12.988421Z",[87],[],{"permalink":178,"excerpt":179,"lastModifyTime":180,"phase":117},"\u002Farchives\u002Fsharding-key","一、选择原则 查询频率高：最常用的查询条件字段，如 user_id、order_id。 分布均匀：避免数据倾斜，如不要用性别（只有两个值）。 业务关联：关联表用相同分片键，减少跨库 join。 不可变：分片键值一旦确定不能改。 二、常见分片键 用户 ID：用户相关数据，如订单按 user_id 分片","2026-09-16T09:16:36.607917Z",[182],{"metadata":183,"spec":185,"status":186,"postCount":73},{"name":87,"creationTimestamp":88,"labels":184},{"haloweb.section":90},{"displayName":92,"slug":87,"cover":93,"description":94,"priority":95,"hideFromList":96,"preventParentPostCascadeQuery":96},{"permalink":98,"postCount":73,"visiblePostCount":73},{"metadata":188,"spec":191,"status":198,"categories":202},{"name":189,"creationTimestamp":190},"post-sharding-strategy-f725fb51","2026-09-13T10:01:12.754097Z",{"title":192,"slug":193,"cover":93,"excerpt":194,"publishTime":195,"categories":196,"tags":197,"priority":27,"pinned":96,"deleted":96,"visible":112,"allowComment":108},"分库分表有哪些策略？","sharding-strategy",{"raw":93,"autoGenerate":108},"2026-09-13T10:01:12.803252Z",[87],[],{"permalink":199,"excerpt":200,"lastModifyTime":201,"phase":117},"\u002Farchives\u002Fsharding-strategy","一、垂直拆分 垂直分库：按业务拆分库，如用户库、订单库、商品库。 垂直分表：按字段拆分表，如主表存常用字段，扩展表存大字段。 解决：单库压力、单表字段过多。 二、水平拆分 水平分库：同一张表数据按规则分到多个库。 水平分表：同一张表数据按规则分到多张表。 解决：单表数据量过大。 三、分片规则 范围：","2026-09-16T09:16:35.972485Z",[203],{"metadata":204,"spec":206,"status":207,"postCount":73},{"name":87,"creationTimestamp":88,"labels":205},{"haloweb.section":90},{"displayName":92,"slug":87,"cover":93,"description":94,"priority":95,"hideFromList":96,"preventParentPostCascadeQuery":96},{"permalink":98,"postCount":73,"visiblePostCount":73},{"metadata":209,"spec":210,"status":214,"categories":215,"content":221},{"name":126,"creationTimestamp":127},{"title":129,"slug":130,"cover":93,"excerpt":211,"publishTime":132,"categories":212,"tags":213,"priority":27,"pinned":96,"deleted":96,"visible":112,"allowComment":108},{"raw":93,"autoGenerate":108},[87],[],{"permalink":136,"excerpt":137,"lastModifyTime":138,"phase":117},[216],{"metadata":217,"spec":219,"status":220,"postCount":73},{"name":87,"creationTimestamp":88,"labels":218},{"haloweb.section":90},{"displayName":92,"slug":87,"cover":93,"description":94,"priority":95,"hideFromList":96,"preventParentPostCascadeQuery":96},{"permalink":98,"postCount":73,"visiblePostCount":73},{"content":222,"raw":222},"\u003Ch2>一、取模扩容问题\u003C\u002Fh2>\n\u003Cp>user_id % 4 改为 % 8，大部分数据需要迁移。\u003C\u002Fp>\n\u003Ch2>二、方案一：停机迁移\u003C\u002Fh2>\n\u003Cul>\n\u003Cli>停机，写脚本把数据按新规则重新分配。\u003C\u002Fli>\n\u003Cli>简单但有停机时间。\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2>三、方案二：双写 + 迁移\u003C\u002Fh2>\n\u003Col>\n\u003Cli>新数据同时写旧分片和新分片。\u003C\u002Fli>\n\u003Cli>后台把旧数据迁移到新分片。\u003C\u002Fli>\n\u003Cli>校验一致后，切读到新分片。\u003C\u002Fli>\n\u003Cli>停写旧分片。\n- 不停机但复杂。\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Ch2>四、方案三：一致性哈希\u003C\u002Fh2>\n\u003Cul>\n\u003Cli>新增节点只迁移相邻节点的部分数据。\u003C\u002Fli>\n\u003Cli>取模扩容影响小。\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2>五、方案四：预留分片\u003C\u002Fh2>\n\u003Cul>\n\u003Cli>初始就分足够多的逻辑分片（如 1024），开始只分配少量库。\u003C\u002Fli>\n\u003Cli>扩容时只需把部分逻辑分片迁移到新库，无需改规则。\u003C\u002Fli>\n\u003Cli>推荐方案。\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2>六、注意\u003C\u002Fh2>\n\u003Cul>\n\u003Cli>迁移过程保证数据一致性。\u003C\u002Fli>\n\u003Cli>做好回滚方案。\u003C\u002Fli>\n\u003C\u002Ful>"]