mysql-水平分表-垂直分表

本文详细介绍了Mysql的分表技术,包括水平分割技术,通过实例讲解了如何使用水平分割来处理大量用户数据,以及如何通过垂直分割优化表结构。文章还探讨了分表标准的选择,以及如何在查询界面上限制查询范围,以提高检索效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

https://blog.youkuaiyun.com/qq_17392301/article/details/45501597?utm_source=blogxgwz4

Mysql的分表技术 
水平分割技术:->以qq用户登录为例: 


创建uuid表
create table uuid (id int unsigned primary key auto_increment);

创建3张用户表
create table qqlogin0
(id int unsigned primary key,
name varchar(32) not null default '',
pwd char(32) not null default '')engine=myisam  charset utf8;

create table qqlogin1
(id int unsigned primary key,
name varchar(32) not null default '',
pwd char(32) not null default '')engine=myisam  charset utf8;

create table qqlogin2
(id int unsigned primary key,
name varchar(32) not null default '',
pwd char(32) not null default '')engine=myisam  charset utf8;

register.php

<?php

    //完成注册
    $name=$_GET['name'];
    $pwd=$_GET['pwd'];

    if(empty($name)||empty($pwd)){
        die('fail');
    }

    $con=mysql_connect('localhost','root','root');
    if(!$con){
        die('err');
    }
    mysql_select_db('temp');

    $sql="INSERT INTO uuid values(null)";

    if(mysql_query($sql,$con)){

        $id=mysql_insert_id();
        //确定把这个用户添加到哪个表
        $tabname='qqlogin'.$id%3;
        $pwd=md5($pwd);
        $sql="INSERT INTO $tabname values($id,'$name','$pwd')";

        if(mysql_query($sql,$con)){
            echo '编号为 '.$id.' 用户添加到'.$tabname;
        }else{
            echo '添加失败';
        }

    }

login.php

<?php

    //完成登录
    $id=$_GET['id'];
    $pwd=$_GET['pwd'];

    if(empty($id)||empty($pwd)){
        die('fail');
    }

    $con=mysql_connect('localhost','root','root');
    if(!$con){
        die('err');
    }
    mysql_select_db('temp');

    $tabname='qqlogin'.$id%3;

    $sql="SELECT pwd FROM $tabname WHERE id=$id";
    $res=mysql_query($sql,$con);
    if($row=mysql_fetch_assoc($res)){

        echo '在'.$tabname.'存在 id为='.$id;
    }else{
        echo '错误.或者用户不存在!';
    }

对水平分割的考虑. 
②其它的条件 
思考: 如果我们做的是一个平安保险公司的一个订单(8999999999000000条)查询功能. 
,如何处理海量表?->按时间. 
分表的标准是依赖业务逻辑(时间/地区/….) 
安装字符不同. a-z 
我们给用户提供的查询界面一定是有条件,不能让用户进行大范围.(世界),如果需要的可以根据不同的规则,对应多套分表. 
检索时候,带分页条件,减少返回的数据. 
项目中,灵活的根据需求来考虑->需求

垂直分割:

所谓垂直分割,就是把某表的大字段,并且不是经常查询,单独的放入到一张表去,比如下面案例: 

 

### MySQL 数据库中表的水平分表垂直分表方法及其应用场景 #### 水平分表 (Sharding) 水平分表是指将同一张表的数据按照一定的规则拆分成多份,每一份数据存储在一个独立的子表中。这种方式适用于当单个表的数据量非常庞大时。 - **实现方式** - 使用哈希算法或范围分区来决定哪些记录应该存放在哪个子表内。 - 可以通过特定字段(如用户ID)作为键来进行散列计算,从而分配至不同表格。 ```sql CREATE TABLE orders_shard_0 ( order_id INT NOT NULL, user_id INT NOT NULL, product_name VARCHAR(255), PRIMARY KEY(order_id) ); CREATE TABLE orders_shard_1 LIKE orders_shard_0; ``` - **优点** - 减少了单一表内的数据总量,提高了查询效率[^4]。 - 支持更大的并发读写操作,因为各个分片可以分布在不同的机器上运行。 - **缺点** - 跨分片的操作变得复杂,特别是涉及到跨分片连接查询的情况。 - 维护成本增加,包括备份恢复、迁移等方面的工作难度加大。 - **适用场景** - 当某类实体的数量极其巨大,并且存在明显的地域分布或其他可利用特征用于切分时适合采用此策略。 #### 垂直分表 (Vertical Partitioning) 垂直分表则是指对于某些具有大量字段的大宽表而言,将其划分为若干个小窄表的过程。这通常是为了优化频繁使用的少量核心字段与其他较少访问的辅助属性之间的关系而设计的一种模式。 - **实现方式** - 将原表中最常被一起检索出来的几个重要字段保留下来形成基础表; - 把其他不太常用或者占用空间较大(例如BLOB类型)的字段单独提取出来创建新的关联表。 ```sql -- 主要信息保存在基本信息表里 CREATE TABLE customer_basic_info( id BIGINT AUTO_INCREMENT, name VARCHAR(64), age TINYINT UNSIGNED, gender ENUM('male', 'female'), PRIMARY KEY(id) ); -- 较少使用的额外资料则放置于扩展表之中 CREATE TABLE customer_extra_details( cust_id BIGINT, address TEXT, profile_pic MEDIUMBLOB, -- 大型二进制对象 FOREIGN KEY(cust_id) REFERENCES customer_basic_info(id) ); ``` - **优点** - 提升了对热点数据项的快速定位能力,减少了不必要的I/O开销[^3]。 - 对于那些包含有大尺寸文本或多媒体内容的应用来说尤其有效果显著。 - **缺点** - 如果处理不当可能会导致过多的小规模JOIN操作影响整体性能表现。 - 设计初期需要充分考虑未来可能的变化趋势以免后期调整困难。 - **适用场景** - 表结构中含有许多低频率使用却占据较多磁盘空间的列时推荐实施该方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值