码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • MySQL运维6-Mycat分库分表之垂直分库


    合集 - mysql(39)
    1.侯哥的Python分享2019-04-162.MySQL基础1-关系型数据库与非关系型数据库2022-03-173.MySQL基础2-数据库及表的操作2022-03-174.MySQL基础3-数据库增删改操作2022-03-175.MySQL基础4-数据查询2023-07-176.MySQL基础5-用户及权限管理2023-07-187.MySQL基础6-常用数据库函数2023-07-188.MySQL基础7-约束2023-07-209.MySQL基础8-多表查询2023-07-2110.MySQL基础9-事务基础2023-08-3111.MySQL高级1-存储引擎2023-07-2412.MySQL高级2-SQL性能分析2023-07-2713.MySQL高级3-索引的结构和分类2023-07-2714.MySQL高级4-索引的使用规则2023-07-2815.MySQL高级5-SQL优化2023-07-3116.MySQL高级6-视图2023-07-3117.MySQL高级7-存储过程2023-08-1418.MySQL高级8-触发器2023-08-1719.MySQL高级9-锁2023-09-0420.MySQL高级10-InnoDB引擎存储架构2023-09-1921.MySQL高级11-后台进程2023-09-2022.MySQL高级12-事务原理 2023-09-2023.MySQL高级13-MySQL管理工具2023-09-2124.MySQL运维1-日志2023-09-2525.MySQL运维2-主从复制2023-09-2726.MySQL运维3-分库分表策略2023-12-1227.MySQL运维4-Mycat入门2023-12-1428.MySQL运维5-Mycat配置2023-12-14
    29.MySQL运维6-Mycat分库分表之垂直分库2023-12-17
    30.MySQL运维7-Mycat分库分表之取模分片2023-12-1831.MySQL运维8-Mycat分库分表之范围分片2023-12-1832.MySQL运维9-Mycat分库分表之枚举分片2023-12-1833.MySQL运维10-Mycat分库分表之一致性哈希分片2023-12-1934.MySQL运维11-Mycat分库分表之应用指定分片2023-12-1935.MySQL运维12-Mycat分库分表之按天分片2023-12-2036.MySQL运维13-Mycat分库分表之按月分片2023-12-2037.MySQL运维14-管理及监控工具Mycat-web的安装配置2023-12-2138.MySQL运维15-一主一从读写分离2023-12-2539.MySQL运维16-双主双从读写分离2023-12-25
    收起

    阅读目录

    • 一、垂直分库场景
    • 二、准备工作
    • 三、配置schema.xml
    • 四、配置server.xml
    • 五、Mycat分库测试
    • 六、Mycat多表查询测试

    一、垂直分库场景

      场景:在业务系统中,涉及一下表结构,但是由于用户与订单每天都会产生大量的数据,单台服务器的数据存储以及处理能力是有限的,可以对数据库表进行拆分,原有数据库如下

      

      说明1:整个业务系统中的表,大致分为四个,商品信息类的表,订单相关的表,用户相关表及省市区相关的表,这里暂时将省市区的表和用户相关的表放在一个数据节点上。

      说明2:因为商品,订单和用户相关的数据,每天都会产生海量的数据,所以我们采取的分库策略是将不同业务类型数据,放在不同数据库中,即垂直分库。

     

    二、准备工作

      在192.168.3.90,192.168.3.91,192.168.3.92三台服务器上创建shopping数据库

      

    三、配置schema.xml

      

      说明1:在schema标签里面的table标签不需要rule属性的,只有在分表时才需要rule,我们现在是分库操作,不需要rule属性
      说明2:在table标签中,商品相关的表都放在dn1数据节点上,和订单相关的表都放在dn2数据节点上,和用户和地址相关的都放在dn3数据节点上

    四、配置server.xml

      

      说明1:修改schemas标签中的数据库名称为shopping  

    五、Mycat分库测试

      首先因为修改Mycat的配置文件,所以需要重启一下Mycat,保证新的配置起作用。

      

      重启之后,在192.168.3.91服务器上连接Mycat

      

      查看逻辑库和逻辑表

      

      说明1:目前这些表都还只是逻辑表,在mycat中存在,但是在MySQL的数据库中都没不存在,所以还需要把这些表创建出来。

      说明2:这里我们创建三个表作为代表,其他暂时用不到的表就先不创建了,每个数据节点上创建一个表,然后这些表就会自动的出现在配置好的数据节点上。

    create table tb_goods_base(id int auto_increment primary key, goods_name varchar(20),  category varchar(20), price int);
    create table tb_order_master(order_id int auto_increment primary key, money int, goods_id int, receiver_province varchar(6), receiver_city varchar(6), receiver varchar(20));
    create table tb_user(id int auto_increment primary key, name varchar(20),  age int, gender varchar(1));

      

     

      在往每个表中插入一些测试数据

    复制代码
    insert into tb_user (name, age, gender) values ("张三", 21, "男");
    insert into tb_user (name, age, gender) values ("李四", 22, "女");
    insert into tb_user (name, age, gender) values ("王五", 23, "男");
    insert into tb_goods_base (goods_name, category, price) values ("华为手机","家电", 5888); insert into tb_goods_base (goods_name, category, price) values ("中国李宁","服装", 499); insert into tb_goods_base (goods_name, category, price) values ("双汇火腿","食品", 15); insert into tb_order_master (money, goods_id, receiver_province, receiver_city, receiver) values (5888, 1, "130000", "130200", "张三"); insert into tb_order_master (money, goods_id, receiver_province, receiver_city, receiver) values (499, 2, "130000", "130800", "李四"); insert into tb_order_master (money, goods_id, receiver_province, receiver_city, receiver) values (15, 3, "110000", 110100, "王五");
    复制代码

      

      以上是对Mycat数据垂直分库的创建表,插入数据和查询数据的测试。

    六、Mycat多表查询测试

      情况一:同一数据节点上的多表查询

        首先创建一个三个的表用于测试,同一数据节点内的多表查询,tb_areas_provinces, tb_areas_city, tb_user_address 三个表都是在dn3数据节点上的。

    create table tb_areas_provinces (id int auto_increment primary key, provinceid varchar(6), province varchar(20));
    create table tb_areas_city (id int auto_increment primary key, cityid varchar(6), city varchar(20), provinceid varchar(6));
    create table tb_user_address (id int auto_increment primary key, user_id int, province_id varchar(6), city_id varchar(6), address varchar(20));

        说明1:根据分库策略,创建的这三个测试表,都是属于用户和地址相关的数据,都在dn3数据节点上。

        

        添加一些测试数据

    复制代码
    insert into tb_areas_provinces (provinceid, province) values ("110000", "北京市");
    insert into tb_areas_provinces (provinceid, province) values ("120000", "天津市");
    insert into tb_areas_provinces (provinceid, province) values ("130000", "河北省");
    
    insert into tb_areas_city (cityid, city, provinceid) values ("110100", "市辖区", "110000");
    insert into tb_areas_city (cityid, city, provinceid) values ("130200", "唐山市", "130000");
    insert into tb_areas_city (cityid, city, provinceid) values ("130800", "承德市", "130000");
    
    
    insert into tb_user_address (user_id, province_id, city_id, address) values (1, "110000", "110100", "清河毛纺厂");
    insert into tb_user_address (user_id, province_id, city_id, address) values (2, "130000", "130200", "里二胡同");
    insert into tb_user_address (user_id, province_id, city_id, address) values (3, "130000", "130800", "避暑山庄");
    复制代码

        

        现多表查询需求是:根据tb_user, tb_user_address表,tb_areas_provinces表和tb_areas_city表查出用户的名字已经所在的省,市,已经详细的地址:使用Mycat查询

    select u.name, p.province, c.city, ua.address from tb_user as u, tb_user_address as ua, tb_areas_provinces as p, tb_areas_city as c where u.id = ua.user_id and ua.province_id = p.provinceid and ua.city_id = c.cityid;

        

        说明:同一数据节点内的多表联合查询在mycat中可以正确查出结果。 

      情况二:不在同一数据节点上的多表查询
        需求:查询每一笔订单的收件地址信息(包含省、市信息),其中要用到tb_order_master在dn2数据节点上,tb_areas_provinces和tb_areas_city在dn3数据节点上
    select o.order_id, o.receiver,p.province, c.city from tb_order_master as o, tb_areas_provinces as p, tb_areas_city as c where o.receive_province=p.provinceid and o.receiver_city=c.cityid;

        

        这个时候就报错了, 报错的原因是:夸数据节点的多表查询,在执行sql的时候,Mycat并不知道,将这条sql给哪一个数据节点处理。

        解决方式:将一些数据量少,并且一旦确定了就很少改变的表,设置为全局表,全局表可以在每个数据节点上都能访问。而本案例中的省/市表就符合这个特性,中国每个城市的编码一旦确定,几乎就不会变化,这样的数据表,我们就可以设置为全局表。全局表会存在每一个数据节点上。

        如果要设置全局表,只需要在schema.xml设置逻辑表的时候加上 type="global"参数即可

        

        说明1: 因为省市相关的数据表需要在dn1,dn2,dn3 三个数据节点上,所以dataNode这里要设置dn1,dn2,dn3三个节点

        说明2:在table标签内添加type="global"属性

        说明3:因为之前的areas的表,都要变成全局表,所以需要数据清空在重新添加测试数据

        

        说明4:因为修改了Mycat配置,所以需要重新启动Mycat

        

        重新创建tb_areas_provinces和tb_areas_city两个表

    create table tb_areas_provinces (id int auto_increment primary key, provinceid varchar(6), province varchar(20));
    create table tb_areas_city (id int auto_increment primary key, cityid varchar(6), city varchar(20), provinceid varchar(6));  

        

        

        说明5:这时候就会发现tb_areas_procinces和tb_areas_city出现在了三个数据节点上

        再次插入数据进行多表查询测试:

    复制代码
    insert into tb_areas_provinces (provinceid, province) values ("110000", "北京市");
    insert into tb_areas_provinces (provinceid, province) values ("120000", "天津市");
    insert into tb_areas_provinces (provinceid, province) values ("130000", "河北省");
    
    insert into tb_areas_city (cityid, city, provinceid) values ("110100", "市辖区", "110000");
    insert into tb_areas_city (cityid, city, provinceid) values ("130200", "唐山市", "130000");
    insert into tb_areas_city (cityid, city, provinceid) values ("130800", "承德市", "130000"); 
    复制代码

        会发现插入的这些测试数据,会在dn1,dn2,dn3的每个数据节点的表中都添加成功。

        现在就可以顺利的进行多表查询了。

        

        说明6:当全局表中的数据发生改变的时候,每个数据节点下的表,也都会发生数据改变。 

  • 相关阅读:
    一个可以让你有更多时间摸鱼的WPF控件(一)
    node模块
    【Rust 日报】2023-09-17 yazi:终端文件管理器
    二进制安全虚拟机Protostar靶场(3)溢出控制程序指针,基础知识讲解 Stack Three,Stack Four
    函数中使用sizeof(arr) / sizeof(arr[0])求数组长度不正确的原因
    【已解决】PDF文件无法编辑怎么办?
    vue3-vant4-vite-pinia-axios-less学习日记
    032-第三代软件开发-Popup弹窗
    如何实现骨架屏效果?
    java StringTokenizer类
  • 原文地址:https://www.cnblogs.com/Se7eN-HOU/p/17908887.html
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号