返回顶部
首页 > 资讯 > 数据库 >一文搞懂mysql的分区和分表知识
  • 335
分享到

一文搞懂mysql的分区和分表知识

2024-04-02 19:04:59 335人浏览 薄情痞子
摘要

下面一起来了解下Mysql的分区和分表,相信大家看完肯定会受益匪浅,文字在精不在多,希望mysql的分区和分表这篇短内容是你想要的。mysql分表和分区1.mysql分表什么是分表?分表是将一个大表按照一定

下面一起来了解下Mysql的分区和分表,相信大家看完肯定会受益匪浅,文字在精不在多,希望mysql的分区和分表这篇短内容是你想要的。

mysql分表和分区

1.mysql分表

什么是分表?

分表是将一个大表按照一定的规则分解成多张具有独立存储空间的实体表,每个表都对应三个文件,MYD数据文件,MYI索引文件,frm表结构文件。如果是Innodb存储引擎,索引文件和数据文件存放在同一个位置。这些表可以分布在同一块磁盘上,也可以在不同的机器上。

app读写的时候根据事先定义好的规则得到对应的的表明,然后去操作它。

将单个数据库表进行拆分,拆分成多个数据表,然后用户访问的时候,根据一定的算法(如用hash的方式,也可以用取余的方式),让用户访问不同的表,这样数据分散到多个数据表中,减少了单个数据表的访问压力。提升了数据库访问性能。

 

mysql分表分为垂直切分和水平切分

垂直切分是指数据表列的拆分,把一张列比较多的表拆分为多张表。

通常按一下原则进行垂直切分:

把不常用的字段单独放在一张表;

把text,blob(binary large object,二进制大对象)等大字段拆分出来放在附表中;

经常组合查询的列放在一张表中;

 

水平拆分是指数据表行的拆分,把一张表的数据拆分成多张表来存放。

水平拆分原则

通常情况下,我们使用hash、取模等方式来进行表的拆分

进行拆分后的表,这时我们就要约束用户查询行为。

 

分表的几种方式:

1)预先估计会出现大数据量并且访问频繁的表,将其分为若干个表

2)利用merge存储引擎来实现分表

创建一个完整表存储着所有的成员信息(表名为member)

并往里面插入点数据:

 一文搞懂mysql的分区和分表知识

 

mysql> select * from member;

+----+------+-----+

| id | name | sex |

+----+------+-----+

|  1 | tom  |   1 |

|  2 | tom  |   1 |

|  3 | tom  |   1 |

|  4 | tom  |   1 |

|  5 | tom  |   1 |

|  6 | tom  |   1 |

|  7 | tom  |   1 |

|  8 | tom  |   1 |

|  9 | tom  |   1 |

| 10 | tom  |   1 |

| 11 | tom  |   1 |

| 12 | tom  |   1 |

| 13 | tom  |   1 |

| 14 | tom  |   1 |

| 15 | tom  |   1 |

| 16 | tom  |   1 |

+----+------+-----+

下面我们进行分表,这里我们把member分两个表tb_member1,tb_member2

mysql> use test;

mysql> create table tb_member1(

    -> id bigint primary key,

    -> name varchar(20),

    -> sex tinyint not null default '0'

    -> )engine=myisam default charset=utf8;

用下面命令可以更简洁的创建出与tb_member1一样的表:

mysql>create table tb_member2 like tb_member1;        

创建主表tb_member

mysql> create table tb_member(

    -> id bigint primary key,

    -> name varchar(20),

    -> sex tinyint not null default '0'

    -> ) engine=merge uNIOn=(tb_member1,tb_member2) insert_method=last charset=utf8;

查看一下tb_member表的结构:

mysql> desc tb_member;                                                                 +-------+-------------+------+-----+---------+-------+

| Field | Type        | Null | Key | Default | Extra |

+-------+-------------+------+-----+---------+-------+

| id    | bigint(20)  | NO   | PRI | NULL    |       |

| name  | varchar(20) | YES  |     | NULL    |       |

| sex   | tinyint(4)  | NO   |     | 0       |       |

+-------+-------------+------+-----+---------+-------+

注:查看子表与主表的字段定义要一致

接下来,把数据分到两个分表中去:

mysql> insert into tb_member1(id,name,sex) select id,name,sex from member where id%2=0;

mysql> insert into tb_member2(id,name,sex) select id,name,sex from member where id%2=1;

查看两个子表的数据:

mysql> select * from tb_member1;

+----+------+-----+

| id | name | sex |

+----+------+-----+

|  2 | tom  |   1 |

|  4 | tom  |   1 |

|  6 | tom  |   1 |

|  8 | tom  |   1 |

| 10 | tom  |   1 |

| 12 | tom  |   1 |

| 14 | tom  |   1 |

| 16 | tom  |   1 |

+----+------+-----+

8 rows in set (0.00 sec)

 

 

mysql> select * from tb_member2;

+----+------+-----+

| id | name | sex |

+----+------+-----+

|  1 | tom  |   1 |

|  3 | tom  |   1 |

|  5 | tom  |   1 |

|  7 | tom  |   1 |

|  9 | tom  |   1 |

| 11 | tom  |   1 |

| 13 | tom  |   1 |

| 15 | tom  |   1 |

+----+------+-----+

8 rows in set (0.00 sec)

查看一下主表的数据:

 

mysql> select * from tb_member;

+----+------+-----+

| id | name | sex |

+----+------+-----+

|  2 | tom  |   1 |

|  4 | tom  |   1 |

|  6 | tom  |   1 |

|  8 | tom  |   1 |

| 10 | tom  |   1 |

| 12 | tom  |   1 |

| 14 | tom  |   1 |

| 16 | tom  |   1 |

|  1 | tom  |   1 |

|  3 | tom  |   1 |

|  5 | tom  |   1 |

|  7 | tom  |   1 |

|  9 | tom  |   1 |

| 11 | tom  |   1 |

| 13 | tom  |   1 |

| 15 | tom  |   1 |

+----+------+-----+

16 rows in set (0.00 sec)

 

总结:每个子表都有自己独立的表文件,主表只是一个壳,并没有完整的表文件。

 

[root@localhost ~]# ls -l /usr/local/mysql/data/test/tb_member*

-rw-r----- 1 mysql mysql 8614 Feb 13 21:44 /usr/local/mysql/data/test/tb_member1.frm

-rw-r----- 1 mysql mysql  160 Feb 13 21:47 /usr/local/mysql/data/test/tb_member1.MYD

-rw-r----- 1 mysql mysql 2048 Feb 13 21:47 /usr/local/mysql/data/test/tb_member1.MYI

-rw-r----- 1 mysql mysql 8614 Feb 13 21:44 /usr/local/mysql/data/test/tb_member2.frm

-rw-r----- 1 mysql mysql  160 Feb 13 21:47 /usr/local/mysql/data/test/tb_member2.MYD

-rw-r----- 1 mysql mysql 2048 Feb 13 21:47 /usr/local/mysql/data/test/tb_member2.MYI

-rw-r----- 1 mysql mysql 8614 Feb 13 21:46 /usr/local/mysql/data/test/tb_member.frm

-rw-r----- 1 mysql mysql   42 Feb 13 21:46 /usr/local/mysql/data/test/tb_member.MRG

 

2.分区

什么是分区?

分区与分表区别:分表将大表分解为若干个独立的实体表,而分区是将数据分段划分在多个位置存放,分区后,表还是一张大表,但数据散列到多个位置了。

app读写的时候操作的还是表名字,db自动去组织分区的数据。

 

分区主要有两种形式:

水平分区:对表的行进行分区,所有在表中定义的列在每个数据集中都能找到,所以表的特性得以保持。

垂直分区:通过对表的垂直划分来减少目标表的宽度,使某些特定的列被划分到特定的分区,每个分区都包含了其中的列所对应的行。

 

分区技术支持

在5.6之前,使用以下参数查看当前配置是否支持分区

mysql> show variables like '%partition%';

显示have_partition_engine选项后为YES

在5.6之后,则采用以下方式查看

mysql> show plugins;

显示结果中,可以看到partition是active的,表示支持分区

  

下面演示一个按照范围(range)方式的表分区

创建range分区表

 

mysql> create table user(

    -> id int not null auto_increment,

    -> name varchar(30) not null default'',

    -> sex int(1) not null default'0',

    -> primary key(id)

    -> )default charset=utf8 auto_increment=1

    -> partition by range(id)(

    -> partition p0 values less than (3),

    -> partition p1 values less than (6),

    -> partition p2 values less than (9),

    -> partition p3 values less than (12),

    -> partition p4 values less than maxvalue);

插入数据:

mysql> insert into user(name,sex) values('tom1','0');

mysql> insert into user(name,sex) values('tom2','1');

mysql> insert into user(name,sex) values('tom3','2');

mysql> insert into user(name,sex) select name,sex from user;(多重复几遍得到双倍数据)

 

到存放数据库表文件的地方看一下

[root@localhost ~]# ls -l /usr/local/mysql/data/test/user*

-rw-r----- 1 mysql mysql  8614 Feb 13 21:59 /usr/local/mysql/data/test/user.frm

-rw-r----- 1 mysql mysql 98304 Feb 13 22:00 /usr/local/mysql/data/test/user#P#p0.ibd

-rw-r----- 1 mysql mysql 98304 Feb 13 22:00 /usr/local/mysql/data/test/user#P#p1.ibd

-rw-r----- 1 mysql mysql 98304 Feb 13 22:00 /usr/local/mysql/data/test/user#P#p2.ibd

-rw-r----- 1 mysql mysql 98304 Feb 13 22:00 /usr/local/mysql/data/test/user#P#p3.ibd

-rw-r----- 1 mysql mysql 98304 Feb 13 22:00 /usr/local/mysql/data/test/user#P#p4.ibd

 

从系统数据库中的partition表中查看分区信息

mysql> select * from infORMation_schema.partitions where table_schema='test' and table_name='user'\G;

合并分区:

Eg:将p1 - p3合并为2个p01 - p02

mysql> alter table user

    -> reorganize partition p1,p2,p3 into

    -> (partition p01 values less than (8),

    -> partition p02 values less than (12)

    -> );

再次查看数据库表文件:

[root@localhost ~]# ls -l /usr/local/mysql/data/test/user*

-rw-r----- 1 mysql mysql  8614 Feb 13 22:03 /usr/local/mysql/data/test/user.frm

-rw-r----- 1 mysql mysql 98304 Feb 13 22:03 /usr/local/mysql/data/test/user#P#p01.ibd

-rw-r----- 1 mysql mysql 98304 Feb 13 22:03 /usr/local/mysql/data/test/user#P#p02.ibd

-rw-r----- 1 mysql mysql 98304 Feb 13 22:00 /usr/local/mysql/data/test/user#P#p0.ibd

-rw-r----- 1 mysql mysql 98304 Feb 13 22:00 /usr/local/mysql/data/test/user#P#p4.ibd

 

未分区表和分区表性能测试

创建一个未分区的表

mysql> create table tab2(c1 int,c2 varchar(30),c3 date)

    -> partition by range(year(c3))(partition p0 values less than (1995),

    -> partition p1 values less than (1996),

    -> partition p2 values less than (1997),

    -> partition p3 values less than (1998),

    -> partition p4 values less than (1999),

    -> partition p5 values less than (2000),

    -> partition p6 values less than (2001),

    -> partition p7 values less than (2002),

    -> partition p8 values less than (2003),

    -> partition p9 values less than (2004),

    -> partition p10 values less than (2010),

    -> partition p11 values less than maxvalue);

通过存储过程插入10万条数据

创建存储过程:

mysql> delimiter $$

mysql> create procedure load_part_tab()

    -> begin

    -> declare v int default 0;

    -> while v < 10000

    -> do

    -> insert into tab1

    -> values (v,'testing partitions',aDDDate('1995-01-01',(rand(v)*36520) mod 3652));

    -> set v = v + 1;

    -> end while;

    -> end

    -> $$

执行存储过程:

mysql> call load_part_tab();

向tab2表中插入数据

Insert into tab2 select * from tab1;

测试SQL性能

mysql> select count(*) from tab1 where c3 > '1995-01-01' and c3 < '1995-12-31';

+----------+

| count(*) |

+----------+

|      990 |

+----------+

1 row in set (0.11 sec)

 

mysql> select count(*) from tab2 where c3 > '1995-01-01' and c3 < '1995-12-31';

+----------+

| count(*) |

+----------+

|        0 |

+----------+

1 row in set (0.03 sec)

 

分区表比未分区表的执行时间少很多。

 

创建索引后情况测试

 

mysql> create index idx_of_c3 on tab1(c3);

Query OK, 0 rows affected (0.28 sec)

Records: 0  Duplicates: 0  Warnings: 0

 

mysql> create index idx_of_c3 on tab2(c3);

Query OK, 0 rows affected (0.22 sec)

Records: 0  Duplicates: 0  Warnings: 0

 

mysql> select count(*) from tab1 where c3 > '1996-01-01' and c3 < '1996-12-31';

+----------+

| count(*) |

+----------+

|     1006 |

+----------+

1 row in set (0.11 sec)

 

重启mysql服务

mysql> select count(*) from tab1 where c3 > '1996-01-01' and c3 < '1996-12-31';

+----------+

| count(*) |

+----------+

|     1006 |

+----------+

1 row in set (0.00 sec)

创建索引后分区表和未分区表相差不大(数据量越大差别会明显些)

看完mysql的分区和分表这篇文章后,很多读者朋友肯定会想要了解更多的相关内容,如需获取更多的行业信息,可以关注我们的数据库栏目。

您可能感兴趣的文档:

--结束END--

本文标题: 一文搞懂mysql的分区和分表知识

本文链接: https://lsjlt.com/news/34895.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 一文搞懂mysql的分区和分表知识
    下面一起来了解下mysql的分区和分表,相信大家看完肯定会受益匪浅,文字在精不在多,希望mysql的分区和分表这篇短内容是你想要的。mysql分表和分区1.mysql分表什么是分表?分表是将一个大表按照一定...
    99+
    2024-04-02
  • 一文读懂MySQL 表分区
    目录1. 什么是表分区2. 分区的两种方式2.1 水平切分2.2 垂直切分3. 为什么需要表分区4. 分区实践4.1 RANGE 分区4.2 LIST 分区4.3 HASH 分区4....
    99+
    2024-04-02
  • MySql分表、分库、分片和分区知识点有哪些
    这篇文章主要介绍了MySql分表、分库、分片和分区知识点有哪些,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、前言   ...
    99+
    2024-04-02
  • MySql分表、分库、分片和分区知识深入详解
    一、前言 数据库的数据量达到一定程度之后,为避免带来系统性能上的瓶颈。需要进行数据的处理,采用的手段是分区、分片、分库、分表。 二、分片(类似分库) 分片是把数据库横向扩展(Scal...
    99+
    2024-04-02
  • 一文搞懂MySQL列类型中的日期时间型知识
    下面一起来了解下MySQL列类型中的日期时间型,相信大家看完肯定会受益匪浅,文字在精不在多,希望MySQL列类型中的日期时间型这篇短内容是你想要的。 列类型(数据类型)所谓的列类型,其实就是指数据...
    99+
    2024-04-02
  • 一篇文章带你搞懂VUE基础知识
    目录VUE是什么Vue中的核心插件  VueRouterVuexaxioselement-uiVue前端整体架构 总结VUE是什么 Vue (读音 /v...
    99+
    2024-04-02
  • 一文搞懂Python中is和==的区别
    目录==比较操作符和is同一性运算符区别哪些情况下is和==结果是完全相同的?为什么256时相同, 而1000时不同?结论==比较操作符和is同一性运算符区别哪些情况下is和==结果...
    99+
    2023-01-10
    Python中is和==的区别 Python中is用法
  • MySQL分区表有哪些知识点
    本篇内容介绍了“MySQL分区表有哪些知识点”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!MySQL分区表...
    99+
    2024-04-02
  • 一篇文章带你搞懂Python类的相关知识
    目录一、什么是类二、类的方法三、类的特性四、总结一、什么是类 类(class),作为代码的父亲,可以说它包裹了很多有趣的函数和方法以及变量,下面我们试着简单创建一个吧。 这样就算创...
    99+
    2024-04-02
  • 一文搞懂Spring中@Autowired和@Resource的区别
    目录1.来源不同2.依赖查找顺序不同2.1 @Autowired 查找顺序2.2 @Resource 查找顺序2.3 查找顺序小结3.支持的参数不同4.依赖注入的支持不同5.编译器提...
    99+
    2024-04-02
  • 一篇文章搞懂 push_back 和 emplace_back 的区别
    push_back 和 emplace_back 本来以为自己对 push_back 和 emplace_back 的理解还行,直到我室友伦伦问了一个关于 push_back 和 emplace_back 的问题。死去的 modern ef...
    99+
    2023-08-20
    c++ java 算法
  • 一文带你搞懂Redis分布式锁
    目录1、分布式锁简介2、setnx3、Redis-分布式锁-阶段14、Redis-分布式锁-阶段25、Redis-分布式锁-阶段36、Redis-分布式锁-阶段47、Redis-分布...
    99+
    2024-04-02
  • 一文读懂navicat for mysql基础知识
    目录一、数据库的操作二、数据类型三、备份和恢复三、操作动作四、高级五、知识补充一、数据库的操作 新建数据库 打开数据库 右键或者双击就可以了。 删除数据库 右键>删除数据库 修改数据库 右键>数据库属性...
    99+
    2022-05-13
    navicat mysql基础 navicat for mysql
  • 一文搞懂MySQL XA如何实现分布式事务
    目录前言XA 协议如何通过MySQL XA实现分布式事务前言 MySQL支持单机事务的良好表现毋庸置疑,那么在分布式系统中,涉及多个节点,MySQL又是如何实现分布式事务的呢?比如开...
    99+
    2024-04-02
  • 一文搞懂Mybatis-plus的分页查询操作
    目录1. 简单说明2. 介绍说明3. 完整配置类代码4. 示例代码5. 最后总结1. 简单说明 嗨,大家好!今天给大家分享的是Mybatis-plus 插件的分页机制,说起分页机制,...
    99+
    2024-04-02
  • 一文搞懂SpringAOP的五大通知类型
    目录一、通知类型二、环境准备添加AOP依赖创建目标接口和实现类创建通知类创建Spring核心配置类编写运行程序三、添加通知普通通知环绕通知(重点)一、通知类型 Advice 直译为通...
    99+
    2024-04-02
  • mysql分区及分表(一)
                                 ...
    99+
    2024-04-02
  • MySQL-如何分库分表?一看就懂
    一、为什么要分库分表 如果一个网站业务快速发展,那这个网站流量也会增加,数据的压力也会随之而来,比如电商系统来说双十一大促对订单数据压力很大,Tps十几万并发量,如果传统的架构(一主多从),主库容量肯...
    99+
    2023-09-04
    mysql java
  • 【SQL应知应会】表分区(一)• MySQL版
    欢迎来到爱书不爱输的程序猿的博客, 本博客致力于知识分享,与更多的人进行学习交流 本文收录于SQL应知应会专栏,本专栏主要用于记录对于数据库的一些学习,有基础也有进阶,有MySQL也有Oracle 分区表 • MySQ...
    99+
    2023-08-20
    sql mysql 数据库 oracle 大数据 数据分析 分区
  • 初步了解Mysql 分区知识
    本文主要给大家介绍Mysql 分区知识,文章内容都是笔者用心摘选和编辑的,具有一定的针对性,对大家的参考意义还是比较大的,下面跟笔者一起了解下Mysql 分区知识吧。一、分区类型1. RANGE类型(范围分...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作