精华内容
下载资源
问答
  • 水平分表
    千次阅读
    2022-05-08 14:14:37

    1. 水平分表


    (1) 什么是水平分表
    水平分表就是指以行为单位对数据进行拆分,一般意义上的分库分表指的就是水平分表。
    分表之后,所有表的结构都是一样的。


    (2) 为什么要水平分表
    水平分表可以解决表中的数据量大的问题,如果一张表的数据太多,操作起来会很麻烦,所以分表存储数据。


    (3) 如何进行水平分表
    一般可以有范围法和hash法来进行水平分表。
    假设现在有30万行数据,需要对它们进行水平分表:
    范围法很好理解,可以让第1-100000行数据存放在表1,第100001-200000行数据存放在表2,第200001-300000行数据存放在表3,就完成了水平分表。
    hash法也不难理解,就是选择一个合适的hash函数,比如说使用取模操作(%),把%3结果为0的数据存放在表1,结果为1的存放在表2,结果为2的存放在表3即可。


    2. 垂直分表


    (1) 什么是垂直分表
    垂直分表就是把一张表按列分为多张表,多张表通过主键进行关联,从而组成完整的数据。
    分表之后,每张表的结构都不相同。
    (2) 为什么要垂直分表
    这主要跟某些数据库的引擎有关,比如Mysql的InnoDB引擎。

    在Mysql中,数据的基本单位,称为行 (Row)
    管理数据的基本单位,称为页 (Page)
    保存页的单位,称为区 (Extent)

    一个区由连续的页组成,一个页由连续的行组成
    默认每一个区的大小为1M,默认每一页的大小为16K,所以一个区有1024 / 16 = 64个页
    而每个页中,根据每行数据的大小,又可以存储多个行
    然而,在InnoDB 1.0版本之后,引入了一个新特性:压缩页
    被压缩之后的页在实际占用空间上,比逻辑上的要小,但是在压缩和解压缩时会花费额外的时间
    这时如果出现了跨页检索数据,效率就会比较低
    因此,在表设计时,尽可能的在页内多存储数据行,这样可以减少跨页检索,提高效率。
    而多存储数据行就意味着,每一行的列数要尽可能少。


    (3) 如何进行垂直分表
    如果直接每个表就只存储一两列的话
    这样做不仅会造成表过多,而且会产生大量重复字段(比如主键),在查询时还需要不断地进行多表关联
    所以,如何进行垂直分表还是有技巧的。
    一般来说,垂直分表并不会把列平分到2个表中,而是会将一些重要的字段单独剥离成小表,把剩余的不太重要的字段放在大表中。
    比如,把查询、排序时需要的字段,高频访问的小字段放在小表
    而把低频访问字段以及一些大字段放在大表中

    更多相关内容
  • 今天小编就为大家分享一篇关于Mysql的水平分表与垂直分表的讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
  • 方案一:使用myisam进行水平分表优化 方案二:使用mysql分区优化 一:Myisam水平分区 1、创建水平分表 user_1: -- 创建水平分表 create table user_1( id varchar(50) PRIMARY key COMMENT '主键id', user_name ...
  • 水平分表

    千次阅读 2018-04-09 10:26:53
    分表有两种形式(水平分表和垂直分表)。 一、水平分表 核心思想:把一个大表,分割N个小表,小表和大表结构一样,只是把数据分散到不同的表中。 简单例子:比如说是通过ID直接登录(例如QQ号),可以...

    概述

    当一个表的数据很大,比如200G,这时太大,我们只靠索引也不好使了,这时我们需要分表和分区处理。分表有两种形式(水平分表和垂直分表)。

    一、水平分表

      核心思想:把一个大表,分割N个小表,小表和大表结构一样,只是把数据分散到不同的表中。

    简单例子:比如说是通过ID直接登录(例如QQ号),可以直接使用下面的例子

    这里写图片描述

    每次登录验证的时候只要把传过来的Id除3取模,根据模可以找到对应的表,然后再去对应的表做查询操作,以下为php的相关操作,注册以及登录。

    register.php

    <?php
     2     //接收参数
     3     //测试的参数有:Pwd,Name, Email
     4     extract($_POST);
     5 
     6     //检查是否为空
     7     if(empty($Pwd) || empty($Name) || empty($Email)){
     8         die('参数不能为空!');
     9     }
    10 
    11     //连接数据库
    12     $link = mysql_connect('127.0.0.1:3306','root', 'root');
    13     if(!$link){
    14         die('数据库连接失败!');
    15     }
    16 
    17     //选择数据库:这个数据库有:uuid表(产生Id的表)、User0表(存放模为0的用户信息)、User1表(存放模为1的用户信息)和User2表(存放模为2的用户信息)
    18     mysql_select_db('test');
    19 
    20     $sql = 'INSERT INTO uuid VALUES(null)';
    21     if(mysql_query($sql, $link)){
    22         //获取刚刚插入的Id
    23         $id = mysql_insert_id();
    24 
    25         //根据 Id%3 来确定该新用户存放的表
    26         $table_name = 'User'.$Id%3;
    27 
    28         $pwd = md5($Pwd);
    29         $sql = "INSERT INTO $table_name VALUES($id, $Name, $pwd, $Email )";
    30 
    31         if(mysql_query($sql, $link)){
    32             echo '注册成功!';
    33         }else{
    34             echo '注册失败!';
    35         }
    36     }

    login.php

     1 <?php
     2     header("Content-Type:text/html;charset:utf-8");
     3     
     4     //接收参数:Id, Pwd
     5     extract($_POST);
     6 
     7     //判断是否为空
     8     if(empty($Id) || empty($Pwd)){
     9         die('参数不能为空!');
    10     }
    11 
    12     //连接数据库
    13     $link = mysql_connect('127.0.0.1:3306', 'root', 'root');
    14     if(!$link){
    15         die('连接失败!');
    16     }
    17 
    18     //选择数据库
    19     mysql_select_db('test');
    20 
    21     $table_name = 'User'.$Id%3;
    22     $sql = "SELECT * FROM $table_name WHERE Id = $Id";
    23     $rst = mysql_query($sql, $link);
    24 
    25     if($row = mysql_fetch_assoc($rst)){
    26         $db_pwd = $row['Pwd'];
    27         
    28         if($db_pwd == md5($Pwd)){
    29             echo '登录成功!';
    30         }else{
    31             echo '用户名或者密码错误!';
    32         }
    33     }else{
    34         echo 'Id错误!';
    35     }

    通过邮箱登录,通过邮箱对表进行分割

    这里写图片描述

    邮箱基本原理都是和Id差不多,就是要通过一个算法把md5字符串转成十进制的数,然后再取模,以下为把十六进制的md5字符串转成十进制的函数。

    这里写图片描述

    这里写图片描述

    mysql 按日期水平分表之后的数据查询方式以及分页策略

    问题描述

    mysql数据库在数据量较大的情况下,对数据表进行水平分表,按照年份,如下:

    data_2013
    data_2014
    data_2015
    …………

    目前的解决方案

    在这种情况下的数据查询我暂时的解决方案是对每个数据库进行循环查询,然后返回每个数据表符合查询条件的数据,并且将查询到的数据合并到一个数组中,渲染到模板:

    for($i = 0;$i<=$n;$i++)
                {
                    //对日期时间进行处理
                    if($i == 0) $map['d.collected_time'] = array('EGT',$start_date);
                    if($i == $n) $map['d.collected_time'] = array('ELT',$end_date);
    
                    $data = M('data_'.($start_year+$i));
    //                dump($map);
                    //对数据总量进行统计
                    $count += $data
                        ->join('monitor_point p ON d.point_id = p.point_id')
                        ->join('hydro h ON h.hydro_id = p.hydro_id')
                        ->join('monitor_type t ON d.monitor_type_id = t.monitor_type_id')
                        ->join('agency a ON p.agency_id = a.id')
                        ->table('data_'.($start_year+$i).' d')
                        ->field('d.*,p.*,t.*,a.*,h.*')
                        ->where($map)
                        ->count();
                    //不同年份的数据进行组合
                    $page = new \Think\MyPage($count,30);
                    $this->page = $page->show();
                    $result_data[$i] = $data
                        ->join('monitor_point p ON d.point_id = p.point_id')
                        ->join('hydro h ON h.hydro_id = p.hydro_id')
                        ->join('monitor_type t ON d.monitor_type_id = t.monitor_type_id')
                        ->join('agency a ON p.agency_id = a.id')
                        ->table('data_'.($start_year+$i).' d')
                        ->field('d.*,p.*,t.*,a.*,h.*')
                        ->where($map)
                        ->limit($page->firstRow.','.$page->listRows)
                        ->select();
    //                echo $data->_sql();
                    //先检查是否是数组再进行添加或者合并操作。
    //                $result_data[$i]是一个未知元素数量的一维数组,需要对其循环并添加到新的数组中去。
                     $result_data_num = count($result_data[$i]);
                    for($j = 0;$j<$result_data_num;$j++)
                    {
                        array_push($years_data,$result_data[$i][$j]);
                    }
                }

    使用的是thinkphp框架。但是上述的解决方案问题在于,返回每个数据表的前30条数据,如果要查询2013、2014两年的数据,他就会返回每个年份的前30条数据,总共60条。而且在显示的时候是先显示13年的,然后显示14年的,按照我们的查询方式 ,这个方式也确实没有问题,但是它是不符合我们的问题解决方法的。

    新问题

    通过谷歌搜索“mysql 水平分表之后 按年份 查询”找到一种解决办法:

    SELECT d.*,p.*,t.*,a.*,h.* FROM data_2013 d 
    INNER JOIN monitor_point p ON d.point_id = p.point_id 
    INNER JOIN hydro h ON h.hydro_id = p.hydro_id 
    INNER JOIN monitor_type t ON d.monitor_type_id = t.monitor_type_id 
    INNER JOIN agency a ON p.agency_id = a.id 
     WHERE ( d.point_id IN ('16') ) AND ( d.collected_time >= '2013-01-01+00:00' )
    UNION
    SELECT d.*,p.*,t.*,a.*,h.* FROM data_2014 d 
    INNER JOIN monitor_point p ON d.point_id = p.point_id 
    INNER JOIN hydro h ON h.hydro_id = p.hydro_id 
    INNER JOIN monitor_type t ON d.monitor_type_id = t.monitor_type_id 
    INNER JOIN agency a ON p.agency_id = a.id 
    WHERE ( d.point_id IN ('16') ) AND ( d.collected_time <= '2014-01-24+09:50' )
    LIMIT 0,30

    但是这个解决方案在于他在分页方面是在最后限制的,也就是两条查询语句只能用一个限制语句,现在需要一个好的分页策略。
    对于上述两种解决方案,其实都是需要解决分页的问题.

    目前正在尝试中的方案

    select * from 
    (SELECT d2013.* FROM data_2013 d2013
    WHERE ( d2013.point_id IN ('16') ) AND ( d2013.collected_time <= '2014-01-24+09:50' ) 
    UNION
    SELECT d2014.* FROM data_2014 d2014 
    WHERE ( d2014.point_id IN ('16') ) AND ( d2014.collected_time >= '2013-01-01+00:00' )
    ) d
    INNER JOIN monitor_point p ON d.point_id = p.point_id 
    INNER JOIN hydro h ON h.hydro_id = p.hydro_id 
    INNER JOIN monitor_type t ON d.monitor_type_id = t.monitor_type_id 
    INNER JOIN agency a ON p.agency_id = a.id 
    ORDER BY d.collected_time 
    LIMIT 0,30

    最终的解决方案

    在for循环中,对需要查询的年份构建子查询,然后将每次查询的sql语句组合成为一个数组(array_push),最后用implode(’ union ‘,$union_sql)用union组合成为总的sql语句,然后,照着上面给出的sql语句,将总的子查询语句添加进去,再加入排序、分页等~很美妙~虽然今早6.30就被38°的太阳刺眼到睡不着,早早过来做,用了一上午做好的……
    最后的分页控制

    $years_data = $union_model->table('('.$subQuery.') d')
                    ->field('d.*)
                    ->limit($page->firstRow.','.$page->listRows)
                    ->order('d.collected_time')
                    ->select();
    
    
    

    优缺点

    1水平分割:根据一列或多列数据的值把数据行放到两个独立的表中。
      水平分割通常在下面的情况下使用。
      •表很大,分割后可以降低在查询时需要读的数据和索引的页数,同时也降低了索引的层数,提高查询速度。
      •表中的数据本来就有独立性,例如表中分别记录各个地区的数据或不同时期的数据,特别是有些数据常用,而另外一些数据不常用。
      •需要把数据存放到多个介质上。
    水平分割会给应用增加复杂度,它通常在查询时需要多个表名,查询所有数据需要union操作。在许多数据库应用中,这种复杂性会超过它带来的优点,因为只 要索引关键字不大,则在索引用于查询时,表中增加两到三倍数据量,查询时也就增加读一个索引层的磁盘次数。  

    参考地址

    http://www.dewen.net.cn/q/17048/mysql+%E6%8C%89%E6%97%A5%E6%9C%9F%E6%B0%B4%E5%B9%B3%E5%88%86%E8%A1%A8%E4%B9%8B%E5%90%8E%E7%9A%84%E6%95%B0%E6%8D%AE%E6%9F%A5%E8%AF%A2%E6%96%B9%E5%BC%8F%E4%BB%A5%E5%8F%8A%E5%88%86%E9%A1%B5%E7%AD%96%E7%95%A5

    还有一个链接。。找不到了,如有侵权请留言。

    展开全文
  • 本文介绍数据库的分库分表的方案:垂直分表与水平分表

    原文网址:数据库--分库分表--垂直分表与水平分表_IT利刃出鞘的博客-CSDN博客

    简介

    说明

            本文介绍数据库的分库分表的方案:垂直分表与水平分表。

            关系型数据库本身比较容易成为系统瓶颈,单机存储容量、连接数、处理能力都有限。当单表的数据量达到1000W或100G以后,由于查询维度较多,即使添加从库、优化索引,做很多操作时性能仍下降严重。

            此时就要考虑对其进行切分了,切分的目的就在于减少数据库的负担,缩短查询时间。

            数据库分布式核心内容无非就是数据切分(Sharding),以及切分后对数据的定位、整合。

            数据切分就是将数据分散存储到多个数据库中,使得单一数据库中的数据量变小,通过扩充主机的数量缓解单一数据库的性能问题,从而达到提升数据库操作性能的目的。

            数据切分根据其切分类型,可以分为两种方式:垂直(纵向)切分和水平(横向)切分。

    垂直(纵向)切分

    说明

            垂直切分常见有垂直分库和垂直分表两种。

            垂直分库就是根据业务耦合性,将关联度低的不同表存储在不同的数据库。

            做法与大系统拆分为多个小系统类似,按业务分类进行独立划分。与"微服务治理"的做法相似,每个微服务使用单独的一个数据库。如图:

            垂直分表是基于数据库中的"列"进行,某个表字段较多,可以新建一张扩展表,将不经常用或字段长度较大的字段拆分出去到扩展表中。

            在字段很多的情况下(例如一个大表有100多个字段),通过"大表拆小表",更便于开发与维护,也能避免跨页问题,MySQL底层是通过数据页存储的,一条记录占用空间过大会导致跨页,造成额外的性能开销。

            另外数据库以行为单位将数据加载到内存中,这样表中字段长度较短且访问频率较高,内存能加载更多的数据,命中率更高,减少了磁盘IO,从而提升了数据库性能。

    优缺点

    优点

    • 解决业务系统层面的耦合,业务清晰
    • 与微服务的治理类似,也能对不同业务的数据进行分级管理、维护、监控、扩展等
    • 高并发场景下,垂直切分一定程度的提升IO、数据库连接数、单机硬件资源的瓶颈

    缺点

    • 部分表无法join,只能通过接口聚合方式解决,提升了开发的复杂度
    • 分布式事务处理复杂
    • 依然存在单表数据量过大的问题(需要水平切分)

    水平(横向)切分

    说明

            当一个应用难以再细粒度的垂直切分,或切分后数据量行数巨大,存在单库读写、存储性能瓶颈,这时候就需要进行水平切分了。

            水平切分分为库内分表分库分表,是根据表内数据内在的逻辑关系,将同一个表按不同的条件分散到多个数据库或多个表中,每个表中只包含一部分数据,从而使得单个表的数据量变小,达到分布式的效果。

    如图所示:

            库内分表只解决了单一表数据量过大的问题,但没有将表分布到不同机器的库上,因此对于减轻MySQL数据库的压力来说,帮助不是很大,大家还是竞争同一个物理机的CPU、内存、网络IO,最好通过分库分表来解决。

    优缺点

    水平分库优点

    • 不存在单库数据量过大、高并发的性能瓶颈,提升系统稳定性和负载能力
    • 应用端改造较小,不需要拆分业务模块

    水平分库缺点

    • 跨分片的事务一致性难以保证

    • 跨库的join关联查询性能较差

    • 数据多次扩展难度和维护量极大

    水平切分后同一张表会出现在多个数据库/表中,每个库/表的内容不同。

    分片规则

    简介

    1. 取余/取模
      1. 均匀存放数据
      2. 缺点: 不能扩容
    2. 按照数量范围
      1. 1-500万      501万-1000万
    3. 按照日期范围
      1. 日志 ,订单信息,统计
    4. 按照月份
    5. 按照枚举值
      1. 常量
    6. 二进制取模范围
      1. 类似HashMap
      2. 缺点:数据存放不均匀
    7. 一致性hash分片           
    8. 按照目标字段前缀指定的进行分区
    9. 按照前缀ASCII码和值进行取模范围分片

    几种典型的数据分片规则如下:

    (1)根据数值范围

            按照时间区间或ID区间来切分。
            某种意义上,某些系统中使用的"冷热数据分离",将一些使用较少的历史数据迁移到其他库中,业务功能上只提供热点数据的查询,也是类似的实践。
            例如:按日期将不同月甚至是日的数据分散到不同的库中;将userId为1~9999的记录分到第一个库,10000~20000的分到第二个库,以此类推。

    优点

    1. 单表大小可控
    2. 天然便于水平扩展,后期如果想对整个分片集群扩容时,只需要添加节点即可,无需对其他分片的数据进行迁移
    3. 使用分片字段进行范围查找时,连续分片可快速定位分片进行快速查询,有效避免跨分片查询的问题。

    缺点

            热点数据成为性能瓶颈。连续分片可能存在数据热点,例如按时间字段分片,有些分片存储最近时间段内的数据,可能会被频繁的读写,而有些分片存储的历史数据,则很少被查询

    (2)根据数值取模

            一般采用hash取模mod的切分方式,例如:将 Customer 表根据 cusno 字段切分到4个库中,余数为0的放到第一个库,余数为1的放到第二个库,以此类推。
            这样同一个用户的数据会分散到同一个库中,如果查询条件带有cusno字段,则可明确定位到相应库去查询。

    优点:数据分片相对比较均匀,不容易出现热点和并发访问的瓶颈

    缺点

    1. 后期分片集群扩容时,需要迁移旧的数据(使用一致性hash算法能较好的避免这个问题)
    2. 容易面临跨分片查询的复杂问题。比如上例中,如果频繁用到的查询条件中不带cusno时,将会导致无法定位数据库,从而需要同时向4个库发起查询,再在内存中合并数据,取最小集返回给应用,分库反而成为拖累。

    展开全文
  • MYSQL实现水平分表

    千次阅读 2021-08-06 14:20:17
    mysql水平分表 本人主要以Navicat实现,具体想要高端点,可以用Sharing JDBC、Mycat去实现 水平分表mysql水平分表分库分表原理是什么?为什么要分库分表?二、水平分表1.数据表2.触发器 分库分表原理是什么? ...

    mysql水平分表

    本人主要以Navicat实现,具体想要高端点,可以用Sharing JDBC、Mycat去实现


    分库分表原理是什么?

    按照字面意思:

    分库:从单个数据库拆分成多个数据库的过程,将数据散落在多个数据库中。
    分表:从单张表拆分成多张表的过程,将数据散落在多张表内。


    为什么要分库分表?

    提升性能、增加可用性。
    1. 从性能上看

    • 随着单库中的数据量越来越大、数据库的查询QPS越来越高,相应的,对数据库的读写所需要的时间也越来越多。数据库的读写性能可能会成为业务发展的瓶颈。对应的,就需要做数据库性能方面的优化。本文中我们只讨论数据库层面的优化,不讨论缓存等应用层优化的手段。
    • 如果数据库的查询QPS过高,就需要考虑拆库,通过分库来分担单个数据库的连接压力。比如,如果查询QPS为3500,假设单库可以支撑1000个连接数的话,那么就可以考虑拆分成4个库,来分散查询连接压力。
    • 如果单表数据量过大,当数据量超过一定量级后,无论是对于数据查询还是数据更新,在经过索引优化等纯数据库层面的传统优化手段之后,还是可能存在性能问题。这是量变产生了质变,这时候就需要去换个思路来解决问题,比如:从数据生产源头、数据处理源头来解决问题,既然数据量很大,那我们就来个分而治之,化整为零。这就产生了分表,把数据按照一定的规则拆分成多张表,来解决单表环境下无法解决的存取性能问题。

    2. 从可用性上看

    • 单个数据库如果发生意外,很可能会丢失所有数据。尤其是云时代,很多数据库都跑在虚拟机上,如果虚拟机/宿主机发生意外,则可能造成无法挽回的损失。因此,除了传统的
      Master-Slave、Master-Master 等部署层面解决可靠性问题外,我们也可以考虑从数据拆分层面解决此问题。

    分库分表实现方案:
    在这里插入图片描述

    二、水平分表

    1.数据表

    user1

    CREATE TABLE `user1` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `name` varchar(50) DEFAULT NULL,
      `sex` int(1) NOT NULL DEFAULT '0',
      PRIMARY KEY (`id`)
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
    

    在这里插入图片描述

    user2

    create table user2 like user1;
    

    在这里插入图片描述
    user

    CREATE TABLE `user` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `name` varchar(50) DEFAULT NULL,
      `sex` int(1) NOT NULL DEFAULT '0',
      KEY `id` (`id`)
    ) ENGINE=MRG_MyISAM DEFAULT CHARSET=utf8 INSERT_METHOD=LAST UNION=(`user1`,`user2`);
    

    在这里插入图片描述

    1. ENGINE = MERGE 和 ENGINE = MRG_MyISAM是一样的意思,都是代表使用的存储引擎是 Merge。
    2. INSERT_METHOD,表示插入方式,取值可以是:0 和 1,0代表不允许插入,1代表可以插入;
    3. FIRST插入到UNION中的第一个表,LAST插入到UNION中的最后一个表。

    2.触发器

    create table tb_ids(id int);
     
    insert into tb_ids values(1);
    

    如果user1和user2中有数据的话先清除

    delete from user1;
    delete from user2;
    

    然后在user1和user2表中分别建立一个触发器(tr_seq和tr_seq2),触发器的功能是
    当在user1或者user2表中增加一条记录时,取出tb_ids中的id值,赋给user1和user2的id,然后将tb_ids的id值加1

    user1的触发器:tr_seq

    DELIMITER $$
       CREATE TRIGGER tr_seq
       BEFORE INSERT on user1
       FOR EACH ROW BEGIN
          select id  into @testid from tb_ids limit 1;
          update tb_ids set id = @testid + 1;
       set new.id =  @testid;
       END$$
       DELIMITER;
    

    user2的触发器:tr_seq2

    DELIMITER $$
       CREATE TRIGGER tr_seq2
       BEFORE INSERT on user2
       FOR EACH ROW BEGIN
          select id  into @testid from tb_ids limit 1;
          update tb_ids set id = @testid + 1;
       set new.id =  @testid;
       END$$
       DELIMITER;
    

    在这里插入图片描述
    在这里插入图片描述

    直接扔进一个sql文件source执行的, 效果都一样.

    然后查询一下触发器

    select * from information_schema.triggers where TRIGGER_NAME=‘tr_seq’
    在这里插入图片描述

    此时已经分表成功, 查询一下所有数据库
    在这里插入图片描述
    插入数据,多插几下(这是什么虎狼之词emmm)

    mysql>  insert into user1(name,sex) values('王五',1);
    Query OK, 1 row affected (0.02 sec)
    mysql>  insert into user2(name,sex) values('张飞',2);
    Query OK, 1 row affected (0.01 sec)
    

    查询user1
    在这里插入图片描述
    查询user2 (刘备那条是我修改的,下面会说,不要在意这些细节)
    在这里插入图片描述
    再插入几条数据, 前面插入的太偏向了

    mysql>  insert into user1(name,sex) values('王五',1);
    Query OK, 1 row affected (0.01 sec)
    mysql>  insert into user2(name,sex) values('王五',1);
    Query OK, 1 row affected (0.01 sec)
    mysql>  insert into user2(name,sex) values('王五',4);
    Query OK, 1 row affected (0.04 sec)
    mysql>  insert into user1(name,sex) values('王五',4);
    Query OK, 1 row affected (0.01 sec)
    

    此时在查询user表

    select * from user order by id asc;
    

    在这里插入图片描述
    查询user1 / user2

    select * from user1 order by id asc;
    select * from user2 order by id asc;
    

    在这里插入图片描述
    在这里插入图片描述
    下面我们update一下 (就是刘备那条 ^ _ ^)

    mysql> update user set name='刘备' where id ='9';
    Query OK, 1 row affected (0.01 sec)
    Rows matched: 1  Changed: 1  Warnings: 0
    

    再看一下user , 刘备就出来了

    select * from user order by id asc;
    

    到这里,水平分表就完成啦 !! 实现了的话别忘了回来给弟弟一个赞吧(求求了)


    展开全文
  • 分库分表是什么 下边以电商系统中的例子来说明,下图是电商系统卖家模块的表结构: 通过以下SQL能够获取到商品相关的店铺信息、地理区域信息: SELECT p.*,r.[地理区域名称],s.[店铺名称],s.[信誉] FROM [商品信息...
  • Mycat实现单库水平分表、按月分表

    千次阅读 多人点赞 2022-06-21 17:34:27
    Mycat实现单库分表,实现按月分表,实现时间戳按月分表
  • MySQL水平分表原理讲解

    千次阅读 2021-10-09 19:34:59
    什么是水平分表? 当一张表到达一定的数据量后(如500万条数据),索引的成本也随之增加,使用主键索引查找数据时也显得十分吃力,数据检索效率低。 水平分表是将一个数据量大的表按照一定的规则拆分成多个结构相同...
  • 目录数据库的水平分表需求说明 数据库的水平分表 关于水平分表可以参考文章:https://blog.csdn.net/weixin_38192427/article/details/122441366 需求说明 创建两张表 t_order_1 和 t_order_2,这两张表是订单表水平...
  • 简单来说就是水平分表根据数据的条数进行分表,垂直分表是按照字段进行分表
  • Sharding-JDBC快速入门-水平分表 需求说明 创建两张表,t_order_1和t_order_2,这两张表是订单表拆分后的表,通过Sharding-Jdbc向订单表插入数据,按照一定的分片规则,主键为偶数的进入t_order_1,另一部分数据进入...
  • 更多内容关注微信公众号:fullstack888分库分表是什么下边以电商系统中的例子来说明,下图是电商系统卖家模块的表结构:通过以下SQL能够获取到商品相关的店铺信息、地理区域信息:SEL...
  • 关于tp5 水平分表分页查询解决方案
  • 水平分表 : 数据表行的拆分,通俗点就是把数据按照某些规则拆分成多张表或者多个库来存放。分为库内分表和分库。 比如一个表有400万数据,查询很慢,可以分到四个表,每个表有400万数据 垂直分表: 列的...
  • 分库分表是什么 下边以电商系统中的例子来说明,下图是电商系统卖家模块的表结构: 通过以下SQL能够获取到商品相关的店铺信息、地理区域信息: SELECT p.*,r.[地理区域名称],s.[店铺名称],s.[信誉] FROM [商品信息]...
  • 水平分表 把一个大表,拆分成多个小表,大表和小表的字段完全一致,只是小表的数据加一起才是大表的数据(如大表的资料有三个月的人员刷卡资料。小表分别会存一个月的刷卡资料) 垂直分表 把一个大表,拆分成多个小...
  • mysql语句的优化有局限性,mysql语句的优化都是围绕着索引去优化的,那么如果mysql中的索引也解决不了海量数据查询慢的状况,那么有了水平分表与垂直分表的出现(我就是记录一下自己的理解)水平分表:如上图所示:...
  • 注意事项 注意那个数据源的地方 注意springboottest @RunWith(SpringRunner.class) @SpringBootTest(classes = MySpringBootApplication.class) 分库分表有四种 水平分表:将同样的表格分成多个 垂直分表:将一个...
  • @Test void onlyProductSaveTest() { //单个库 水平分表 Random random = new Random(); for(int i = 0 ; i ; i ++){ ProductOrderDO productOrderDO = new ProductOrderDO(); // productOrderDO.setId(0L); ...
  • sharding-jdbc是轻量级的java框架,是增强版的JDBC驱动sharding-jdbc并不是做分库分表,是操作多个库多个表sharding-jdbc主要两个功能:数据分片和读写分离sharding-jdbc目的是:简化对分库分表之后的数据相关操作...
  • 根据实际项目分析两种分表 方案,介绍了水平分表及分区的使用方法。
  • 《Mysql水平分表–自动建表实现》 提示: 本材料只做个人学习参考,不作为系统的学习流程,请注意识别!!! 《Mysql水平分表--自动建表实现》《Mysql水平分表--自动建表实现》1. 业务背景2. Mysql事件2.1 事件概述2.2 ...
  • ShardingSphere——水平分表与数据迁移

    千次阅读 2021-12-07 08:22:01
    分库分表相关概念以及利用shardingsphere相关的一些产品我们在线上如何对数据进行迁移
  • mysql水平分表

    2021-01-12 14:22:44
    一般来说,当我们的数据库的数据超过了100w记录的时候就应该考虑分表或者分区了,这次我来详细说说分表的一些方法。目前我所知道的方法都是MYISAM的,INNODB如何做分表并且保留事务和外键,我还不是很了解。 首先,...
  • 垂直分表和水平分表

    2022-06-01 11:38:06
    (1) 什么是水平分表 水平分表就是指以行为单位对数据进行拆分,一般意义上的分库分表指的就是水平分表。 分表之后,所有表的结构都是一样的。(2) 为什么要水平分表 水平分表可以解决表中的数据量大的问题,如果一张...
  • 具体怎么用不太懂namespace app\index\model;...class Articles extends Model {/*** 链式操作-partition 方法用于是数据库水平分表*/public function partitionFun(){// 用于写入$data = ['articleId' => 20,'ar...
  • 最近在写水平分表,调研总结实践了一些比较普遍的方法,下面总结一下。 水平分表 所谓水平分表,顾名思义,就是由于某个单表数据过多,影响查询效率,于是选择分表,将原来的业务表按某个维度拆分成几个表,查询的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 38,687
精华内容 15,474
关键字:

水平分表