Mysql性能优化-7.分区

1.分区的概念

  • 均匀分区,hash,key
  • 条件分区,range,list

将一张表中的数据和索引,分散到不同的文件中进行存储,称之为分区操作。

Innodb:xx.idb
myisam:xx.myd,xx.myi

通常一个表对应一组数据和索引文件。一个表的数据和索引集中存储在这组文件中。

当一个表出现了大量的记录时,可以将其分布到不同的数据和索引文件中进行存储。

Innodb来说:一个表对应多个ibd文件。
myisam:一个表对应多个myi,myd文件。

分布之后,每个文件中包含的记录数量显著减少,保证单独文件的执行效率。

演示如下:最常见的分区语法,使用id,将数据分不到10个分区中:
id,主键最主要的检索要素。
在设计表时,使用partition选项,可以完成分区的配置:
需要提供分区算法和算法参数,完成分区操作。


mysql分区.png

分区完毕后,客户端看到的还是一张表,而服务器端,将数据分散到不同的分区中存储。

当前的例子使用id,作为hash算法的参数。hash算法,就是一个利用id值求余的算法,通过余数将记录分布到某个分区中。 (很明显,p1时间有变化)


mysql分区插入数据后.png

hash(id)算法,是最常用最通用的分区算法。逻辑上表示将记录均匀分布到不同的区域中。当数据表中的数据量很大,同时没有明显的逻辑区分时,使用该算法。

2.hash算法

使用一个整数的值,将记录分布到分区中,采用求余方案。
hash:哈希,一类算法的总称。求余,md5,sha,都是哈希算法。只要可以使用某个输入,得到某个特定的输出的算法就是哈希算法,要求,相同的输入应该得到相同的输出。
hash-table,哈希表。特殊的数据结构,关联数组既是哈希表,key就是输入,value就是输出。
hash分区算法,在业余逻辑层面,表示均匀分配。

mysql> create table articles(
    -> id int unsigned auto_increment primary key,
    -> subject varchar(255),
    -> context text
    -> ) engine=innodb charset=utf8
    -> partition by hash(id) partitions 10;
Query OK, 0 rows affected (0.33 sec)

3.key算法

也是一个hash算法,更加通用的hash算法。在hash中,仅仅可以针对于整数进行求与运算。而在key算法中,可以使用非整型字段,输入数据不一定为整数。
也可以使用标题,将文章均匀分布到10个区中
subject,字符串型字段,需要key算法:
核心是先通过subject计算出一个整型值,在完成求余操作。
分区字段必须为主键的一部分,分区字段一定是强检索字段。

mysql> create table articles_key(
    -> id int unsigned auto_increment primary key,
    -> subject varchar(255),
    -> context text
    -> ) engine=innodb charset=utf8
    -> partition by key(subject) partitions 10;
ERROR 1503 (HY000): A PRIMARY KEY must include all columns in the table's partitioning function
mysql> create table articles_key(
    -> id int unsigned auto_increment,
    -> subject varchar(255),
    -> context text,
    -> primary key (id, subject)      //分区字段必须为主键的一部分
    -> ) engine=innodb charset=utf8
    -> partition by key(subject) partitions 10;
Query OK, 0 rows affected (0.33 sec)
根据key算法分区.png

4.range算法

范围条件算法,主要使用<小于来实现条件,分区时严格制定每个分区的条件,不能仅仅指定分区的数量了。
利用文章的发布时间,将其分布到不同的区域中:

mysql> create table articles_range(
    -> id int unsigned auto_increment,
    -> subject varchar(255),
    -> context text,
    -> publish_time int,
    -> primary key (id, publish_time)
    -> ) engine=innodb charset=utf8
    -> partition by range(publish_time)(
    -> partition p201903 values less than (1554047999),
    -> partition p201904 values less than (1556639999),
    -> partition p201905 values less than (1559318399)
    -> );
Query OK, 0 rows affected (0.06 sec)

mysql> select unix_timestamp('2019-05-31 23:59:59');
+---------------------------------------+
| unix_timestamp('2019-05-31 23:59:59') |
+---------------------------------------+
|                            1559318399 |
+---------------------------------------+
1 row in set (0.00 sec)
range分区.png

range分区是一种条件分区算法。指的是,将数据使用某种条件分散到不同的区中。

5.list算法

另一种条件分区,表示列表值条件。
条件使用in(值列表)来表示。

mysql> create table articles_list(
    -> id int unsigned auto_increment,
    -> subject varchar(255),
    -> context text,
    -> publish_time int,
    -> status tinyint,
    -> primary key (id, status)
    -> ) engine=innodb charset=utf8
    -> partition by list(status)(
    -> partition pwriting values in (1, 2),
    -> partition ppublished values in(3)
    -> );
Query OK, 0 rows affected (0.04 sec)
list分区.png

6.分区管理语法

list,range,可以删除或者新增分区。
删除分区后,相应的分区数据一并删除。

hash,key,可以修改分区数量。
减少分区不影响数据。

mysql> alter table articles_range add partition(
    -> partition p201902 values less than (1551369599)
    -> );
ERROR 1493 (HY000): VALUES LESS THAN value must be strictly increasing for each partition

mysql> alter table articles_range add partition(
    -> partition p201906 values less than (1561910399),
    -> partition p201907 values less than (1564588799)
    -> );
Query OK, 0 rows affected (0.05 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> alter table articles_range drop partition p201906;
Query OK, 0 rows affected (0.04 sec)
Records: 0  Duplicates: 0  Warnings: 0
range增.png

range删.png
mysql> alter table articles add partition partitions 3;
Query OK, 0 rows affected (0.53 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> alter table articles coalesce partition 5;
Query OK, 0 rows affected (0.42 sec)
Records: 0  Duplicates: 0  Warnings: 0
hash增.png

hash删.png

7.分区的使用

在客户端程序不变的情况下,将服务器端的数据分布到不同的物理文件中,进而做到提供数据表的处理能力。
当数据表中数据量很大时(相对很大,千万,亿),分区可以提升效率。
只有检索字段,为分区字段时,分区效率才会比较明显。因此分区字段的选择很重要。你的业务逻辑应该根据分区字段做出调整。
分区可以将分区文件部署到不同的磁盘上,充分利用磁盘的性能。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,874评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,102评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,676评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,911评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,937评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,935评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,860评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,660评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,113评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,363评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,506评论 1 346
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,238评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,861评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,486评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,674评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,513评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,426评论 2 352

推荐阅读更多精彩内容