mysql分区

mysql的分区概念

在mysql 5.1.3之后引入和partition(分区)的概念。这个是个好东东。以前遇到一个大表的时候,我们会手动将其分为几个小表(就是分表操作)。但是分表操作有几个缺点:1 麻烦,这里指的麻烦是不仅对于调用分表的sql语句的处理上,也是分表的具体操作步骤上。2 当一个表从单表变为分表的时候,上层sql逻辑也需要进行修改,而且是大范围的修改!

 

引入分区的概念就简单多了。强调一点,一个表分区了,它还是一个表!一个表分表了,它就不是一个表了!这实际上是个会让你不得不使用分区的理由,当你对一个表分区的时候,上层的代码逻辑是不用变的。

分区就是一个表分割在不同的磁盘文件中。

 

你可以使用mysql> SHOW VARIABLES LIKE '%partition%'; 确定mysql是否支持partition

分区类型

分区的关键词就是partition,它分为Range, List, Hash, Key这几种分割方法

Range partition: 按照某个字段的范围进行分区。这种常用在时间字段上。

比如使用场景是论坛的文章表,论坛的文章最经常进行的查询也不过就是在最近几个月的论坛文章中进行操作。所以这样的文章内容使用时间进行分区是最好不过的了。


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

CREATE TABLE article (

 

article_id int NOT NULL AUTO_INCREMENT,

 

article_content varchar(1000),

 

article_time DATE NOT NULL DEFAULT '1970-01-01',

 

key(article_id)

 

)

 

ENGINE=INNODB

 

PARTITION BY RANGE (YEAR(article_time)) (

 

PARTITION p0 VALUES LESS THAN (1991),

 

PARTITION p1 VALUES LESS THAN (1996),

 

PARTITION p2 VALUES LESS THAN (2001),

 

PARTITION p3 VALUES LESS THAN MAXVALUE

 

) ;

上面的语句就是按照年份将文章分为4个分区

List partition:按照某个字段有哪些值分在一个分区内

直接拿官网的一个sql语句做例子


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

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 partition: 按照表中任意个int类型的字段进行分割

 

CREATE TABLE part_table (

 

id int NOT NULL AUTO_INCREMENT,

 

name varchar(30),

 

store_id int,

 

key(id)

 

)

 

ENGINE=INNODB

 

PARTITION BY HASH(store_id)

 

PARTITIONS 4;

Key partition: Hash partition的进阶版,将主键作为分割的标准

比如


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

CREATE TABLE part_table2 (

 

id int NOT NULL AUTO_INCREMENT PRIMARY KEY,

 

name varchar(30),

 

store_id int

 

)

 

ENGINE=INNODB

 

PARTITION BY KEY()

 

PARTITIONS 4;

恰当的分区当然比单表是好多的,不仅利于管理,也利于提高查询效率。分区由于代价非常小,所以在一般的使用上应该先考虑使用它。但是它也不是万能钥匙,分区说到底还是在一个mysql上进行的操作,如果数据量达到一定程度,还是会需要分库分表来进行操作的。

时间: 2024-10-04 00:45:03

mysql分区的相关文章

mysql分区之RANGE分区讲解

  mysql分区之RANGE分区讲解 按照RANGE分区的表是通过如下一种方式进行分区的,每个分区包含那些分区表达式的值位于一个给定的连续区间内的行.这些区间要连续且不能相互重叠,使用VALUES LESS THAN操作符来进行定义.在下面的几个例子中,假定你创建了一个如下的一个表,该表保存有20家音像店的职员记录,这20家音像店的编号从1到20. CREATE TABLE employees ( id INT NOT NULL, fname VARCHAR(30), lname VARCHA

mysql分区之LIST分区讲解

  mysql分区之LIST分区讲解 MySQL中的LIST分区在很多方面类似于RANGE分区.和按照RANGE分区一样,每个分区必须明确定义.它们的主要区别在于,LIST分区中每个分区的定义和选择是基于某列的值从属于一个值列表集中的一个值,而RANGE分区是从属于一个连续区间值的集合.LIST分区通过使用"PARTITION BY LIST(expr)"来实现,其中"expr" 是某列值或一个基于某个列值.并返回一个整数值的表达式,然后通过"VALUES

MySQL分区技术

原文:MySQL分区技术 针对海量数据的优化主要有两种: 大表拆小表的方式:SQL语句的优化   分区技术: 与水平分割类似,但它是在逻辑层进行的水平分表,对于应用程序而言它还是一张表   一.range方式 1.创建一张分区表   可以到/usr/local/mysql/var/test/下看到生成这么多文件(26个)    2.创建一张未分区表  可以到/usr/local/mysql/var/test/下看到生成3个对应的文件   3.建立load_part_tab存储   4.添加800

mysql分区方案的研究

   笔者觉得,分库分表确实好的.但是,动不动搞分库分表,太麻烦了.分库分表虽然是提高数据库性能的常规办法,但是太麻烦了.所以,尝试研究mysql的分区到底如何.  之前写过一篇文章,http://www.cnblogs.com/wangtao_20/p/7115962.html 讨论过订单表的分库分表,折腾起来工作量挺大的,需要多少技术去折腾.做过的人才知道有多麻烦      要按照什么字段切分,切分数据后,要迁移数据;分库分表后,会涉及到跨库.跨表查询,为了解决查询问题,又得用其他方案来弥补

Mysql分区技术的实例

一.查看当前MySQL是否支持分区技术 二.使用HASH实现一个简单测试案例 1.建立一个分区表 2.查看数据库文件初始状态 计算实例"> 3.写一个存储过程生成100万条记录 4.查看存储后的数据文件,可以看到数据均匀分布

Mysql分区技术的理论

一.基本理论 在mysql大数据处理上,水平分表技术是很常用的,但是分表技术带来了PHP处理的很大开销,为了解决这个弊端Mysql5.1以后以插件的方式增加了一个新的技术--分区技术. 分区技术是在逻辑层进行的水平分表,对于应用程序而言还是一张表,Mysql5.1有4种分区类型 1.RANGE:基于属于一个给定连续区间的列值,把多行分配给分区. 2.LIST :类似于RANGE分区,区别在于LIST分区是基于列值匹配一个离散值集合中的某个值来进行 选择 3.HASH :基于用户定义的表达式的返回

mysql 分区类型详解

RANGE分区 基于属于一个给定连续区间的列值,把多行分配给分区. 这些区间要连续且不能相互重叠,使用VALUES LESS THAN操作符来进行定义.以下是实例. 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′,

mysql 分区的真正作用?

在mysql 表中 建立分区 很多人都说能够提供查询效率 如果是以主键id分区可以减少查询的范围! 但是也有人说 分区更重要的对数据的管理(清除) 比如保留三个月有效数据 可以将 可以根据时间字段 分区讲三个月前的 数据清除!直接清除分区!想问一下大神 分区到底在哪方面发挥的优势大!应该怎么用? 两种说法都是对的,并且实际上是一回事.数据库分区实际上是提供了数据在物理上的隔离.你可以这样理解:你把每天的日记写在了一本无限页数的本子上.有一次,你想回味其中某一篇的日记,你需要打开这个本子逐页查询(

MYSQL分区管理

--在mysql5.6之后查看分区采用 show plugins; --不论创建何种类型的分区,如果表中存在主键或唯一索引时,分区列必须是唯一索引的一个组成部分 mysql> create table t1(id int not null,id2 int not null,unique key(id)) partition by hash(id2) partitions 4;     ERROR 1503 (HY000): A PRIMARY KEY must include all colum