分区的一些优点包括:
      1)、与单个磁盘或文件系统分区相比,可以存储更多的数据。
      2)、对于那些已经失去保存意义的数据,通常可以通过删除与那些数据有关的分区,很容易地删除那些数据。相反地,在某些情况下,添加新数据的过程又可以通过为那些新数据专门增加一个新的分区,来很方便地实现。通常和分区有关的其他优点包括下面列出的这些。MySQL分区中的这些功能目前还没有实现,但是在我们的优先级列表中,具有高的优先级;我们希望在5.1的生产版本中,能包括这些功能。
      3)、一些查询可以得到极大的优化,这主要是借助于满足一个给定WHERE语句的数据可以只保存在一个或多个分区内,这样在查找时就不用查找其他剩余的分区。因为分区可以在创建了分区表后进行修改,所以在第一次配置分区方案时还不曾这么做时,可以重新组织数据,来提高那些常用查询的效率。
      4)、涉及到例如SUM()和COUNT()这样聚合函数的查询,可以很容易地进行并行处理。这种查询的一个简单例子如 “SELECT salesperson_id, COUNT (orders) as order_total FROM sales GROUP BY salesperson_id;”。通过“并行”,这意味着该查询可以在每个分区上同时进行,最终结果只需通过总计所有分区得到的结果。
      5)、通过跨多个磁盘来分散数据查询,来获得更大的查询吞吐量。

分区类型:
· RANGE分区:基于属于一个给定连续区间的列值,把多行分配给分区。
· LIST分区:类似于按RANGE分区,区别在于LIST分区是基于列值匹配一个离散值集合中的某个值来进行选择。
· HASH分区:基于用户定义的表达式的返回值来进行选择的分区,该表达式使用将要插入到表中的这些行的列值进行计算。这个函数可以包含MySQL 中有效的、产生非负整数值的任何表达式。
· KEY分区:类似于按HASH分区,区别在于KEY分区只支持计算一列或多列,且MySQL 服务器提供其自身的哈希函数。必须有一列或多列包含整数值。

range类型分区简介——这些区间要连续且不能相互重叠,使用VALUES LESS THAN操作符来进行定义。

分区前的表结构:

mysql> show create table ca_tophitsdata;
+----------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table          | Create Table                                                                                                                                                                                                                                           |
+----------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| ca_tophitsdata | CREATE TABLE `ca_tophitsdata` (
  `defid` int(10) unsigned NOT NULL,
  `urldefid` int(10) unsigned NOT NULL,
  `count` int(10) unsigned NOT NULL,
  `day` date NOT NULL,
  PRIMARY KEY (`defid`,`day`,`urldefid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+----------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

为这个表分区:

mysql> alter table ca_tophitsdata

PARTITION BY RANGE (YEAR(day))

(PARTITION P07 VALUES LESS THAN (2008) ENGINE = InnoDB,

PARTITION P08 VALUES LESS THAN (2009) ENGINE = InnoDB,

PARTITION P09 VALUES LESS THAN (2010) ENGINE = InnoDB,

PARTITION P10 VALUES LESS THAN (2011) ENGINE = InnoDB,

PARTITION PMAX VALUES LESS THAN MAXVALUE ENGINE = InnoDB);
Query OK, 1328977 rows affected (10.88 sec)
Records: 1328977  Duplicates: 0  Warnings: 0

分区后的表结构:

mysql> show create table ca_tophitsdata;
+----------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table          | Create Table                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |
+----------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| ca_tophitsdata | CREATE TABLE `ca_tophitsdata` (
  `defid` int(10) unsigned NOT NULL,
  `urldefid` int(10) unsigned NOT NULL,
  `count` int(10) unsigned NOT NULL,
  `day` date NOT NULL,
  PRIMARY KEY (`defid`,`day`,`urldefid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 /*!50100 PARTITION BY RANGE (YEAR(day)) (PARTITION P07 VALUES LESS THAN (2008) ENGINE = InnoDB, PARTITION P08 VALUES LESS THAN (2009) ENGINE = InnoDB, PARTITION P09 VALUES LESS THAN (2010) ENGINE = InnoDB, PARTITION P10 VALUES LESS THAN (2011) ENGINE = InnoDB, PARTITION PMAX VALUES LESS THAN MAXVALUE ENGINE = InnoDB) */ |
+----------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

分区前后的数据表文件对比:

ca_tophitsdata.frm

ca_tophitsdata.ibd

---------------------

ca_tophitsdata.frm

ca_tophitsdata.par

ca_tophitsdata#P#P07.ibd

ca_tophitsdata#P#P08.ibd

ca_tophitsdata#P#P09.ibd

ca_tophitsdata#P#P10.ibd

ca_tophitsdata#P#PMAX.ibd

list类型分区简介——LIST分区通过使用“PARTITION BY LIST(expr)”来实现,其中“expr” 是某列值或一个基于某个列值、并返回一个整数值的表达式,然后通过“VALUES IN (value_list)”的方式来定义每个分区,其中“value_list”是一个通过逗号分隔的整数列表。

CREATE TABLE employees (
    id INT NOT NULL,
    fname VARCHAR(30),
    lname VARCHAR(30),
    hired DATE NOT NULL DEFAULT '1970-01-01',
    separated DATE NOT NULL DEFAULT '9999-12-31',
    job_code INT,
    store_id INT
)

PARTITION BY LIST(store_id)
    PARTITION pNorth VALUES IN (3,5,6,9,17),
    PARTITION pEast VALUES IN (1,2,10,11,19,20),
    PARTITION pWest VALUES IN (4,12,13,14,18),
    PARTITION pCentral VALUES IN (7,8,15,16)
);

HASH分区简介——要使用HASH分区来分割一个表,要在CREATE TABLE 语句上添加一个“PARTITION BY HASH (expr)”子句,其中“expr”是一个返回一个整数的表达式。它可以仅仅是字段类型为MySQL 整型的一列的名字。此外,你很可能需要在后面再添加一个“PARTITIONS num”子句,其中num 是一个非负的整数,它表示表将要被分割成分区的数量。

CREATE TABLE employees (
    id INT NOT NULL,
    fname VARCHAR(30),
    lname VARCHAR(30),
    hired DATE NOT NULL DEFAULT '1970-01-01',
    separated DATE NOT NULL DEFAULT '9999-12-31',
    job_code INT,
    store_id INT
)
PARTITION BY HASH(store_id)
PARTITIONS 4;

KEY分区简介——类似于按HASH分区,区别在于KEY分区只支持计算一列或多列,且MySQL 服务器提供其自身的哈希函数。必须有一列或多列包含整数值。

CREATE TABLE tk (
    col1 INT NOT NULL,
    col2 CHAR(5),
    col3 DATE
)
PARTITION BY LINEAR KEY (col1)
PARTITIONS 3;

在KEY分区中使用关键字LINEAR和在HASH分区中使用具有同样的作用,分区的编号是通过2的幂(powers-of-two)算法得到,而不是通过模数算法。

转载于:https://blog.51cto.com/zhangxingnan/1435249

mysql innodb表分区相关推荐

  1. mysql myisam表分区_MySQL 表分区详解MyiSam引擎和InnoDb 区别(实测)

    一.什么是表分区 通俗地讲表分区是将一大表,根据条件分割成若干个小表.mysql5.1开始支持数据表分区了. 如:某用户表的记录超过了1000万条,那么就可以根据入库日期将表分区,也可以根据所在地将表 ...

  2. mysql创建表分区详细介绍及示例

    mysql创建表分区详细介绍及示例 1. 基本概念 1.1 什么是表分区? 1.2 表分区与分表的区别 1.3 表分区有什么好处? 1.4 分区表的限制因素 2. 如何判断当前MySQL是否支持分区? ...

  3. mysql 重建分区_详解mysql重建表分区并保留数据的相关方法

    本文介绍mysql重建表分区并保留数据的方法,mysql的表分区(partition)可以把一个表的记录分开多个区去存储,查询时可根据查询的条件在对应的分区搜寻,而不需要整表查询,提高查询效率. 有分 ...

  4. mysql 数据表分区与分表介绍

    什么是分表? 分表是将一个大表按照一定的规则分解成多张具有独立存储空间的实体表,我们可以称为子表,每个表都对应三个文件,MYD数据文件,MYI索引文件,frm表结构文件.这些子表可以分布在同一块磁盘上 ...

  5. MySQL InnoDB表压缩

    MySQL InnoDB表压缩 文件大小减小(可达50%以上) ==> 查询速度变快(count * 约减少20%以上时间) 如何设置mysql innodb 表的压缩: 第一,mysql的版本 ...

  6. mysql —— 分表分区

    面对当今大数据存储,设想当mysql中一个表的总记录超过1000W,会出现性能的大幅度下降吗? 答案是肯定的,一个表的总记录超过1000W,在操作系统层面检索也是效率非常低的 解决方案: 目前针对海量 ...

  7. MySQL数据库表分区功能详解

    1.什么是表分区? mysql数据库中的数据是以文件的形势存在磁盘上的,默认放在/mysql/data下面(可以通过my.cnf中的datadir来查看),一张表主要对应着三个文件,一个是frm存放表 ...

  8. mysql 分区表 外键_【MySQL】表分区

    MySQL表分区是MySQL提供的一种简单的数据表水平拆分方法. 分区表是一个逻辑表,它由多个物理子表组成. 目前只有 InnoDB 和 NDB 正式支持表分区. 注:表分区虽然可以缓解单表数据量过大 ...

  9. mysql myisam表分区_MySQL分区表的局限和限制详解

    禁止构建 分区表达式不支持以下几种构建: 存储过程,存储函数,UDFS或者插件 声明变量或者用户变量 可以参考分区不支持的SQL函数 算术和逻辑运算符 分区表达式支持+,-,*算术运算,但是不支持DI ...

最新文章

  1. 白盒测试实践-任务完成
  2. linux 搭建dns
  3. Python yield 斐波那契数列
  4. return、break、continue区别以及作用范围
  5. 显示部分x_Linux 黑话解释:什么是显示服务器,用来做什么? | Linux 中国
  6. android版记账本
  7. 电脑无法连接到系统服务器,请问怎么客户端的电脑连接不到服务器?这是什么原因?...
  8. OpenCV训练分类器
  9. 影之刃3服务器维护,影之刃3手游2021年3月11日维护公告_影之刃3手游2021年3月11日更新了什么_玩游戏网...
  10. nginx 80端口重定向到443端口
  11. web前端时间戳转时间类型显示
  12. AWT_Swing_图片Icon
  13. html设计网页板块,网页设计
  14. linux 查看端口
  15. WaitForSingleObject的使用
  16. 超好用epub阅读器分享
  17. 小程序中的flex_在Flex应用程序中启用辅助功能
  18. 【解决思路】当前不会命中断点,还未为文档加载任何符号
  19. 人类基因编辑技术及背后的伦理问题 【个人观点,仅供参考】
  20. 淘宝商品采集上架拼多多店铺(无货源数据采集接口,拼多多商品详情数据,淘宝商品详情数据,京东商品详情数据)接口代码对接教程

热门文章

  1. 推荐算法——基于协同过滤CF
  2. SAP WM LQ02 事务代码界面里不能为指定仓库号选择移动类型的问题对策
  3. 对于量子计算来说,99%的准确度足够吗?
  4. 登上Science子刊,神经科学再次启发DNN设计!中科院揭秘介观自组织反向传播机制...
  5. MEMS传感器的未来在哪?
  6. 【科普】AI的分类与演进
  7. 脑内世界模型:脑科学基础上的意识问题哲学解说
  8. 关于自动驾驶汽车法律政策的十点思考
  9. 工业机器人发展现状:硬件制造大同小异,视觉感知绘新蓝图
  10. 智能语音简史:这场技术革命从哪开始?