1.1 概述

数据库分区是一种物理数据库设计技术。虽然分区技术可以实现很多效果,但其主要目的是为了在特定的SQL操作中减少数据读写的总量以缩减SQL语句的响应时间,同时对于应用来说分区完全是透明的。

MySQL分区详解_主键

使用myisam引擎的一张表主要对应着三个文件,一个是frm存放表结构的,一个是myd存放表数据的,一个是myi存表索引的。如果一张表的数据量太大的话,那么myd、myi就会变的很大,查找数据就会变的很慢,这个时候我们可以利用mysql的分区功能,在物理上将这一张表对应的三个文件,分割成许多个小块,这样我们查找一条数据时,就不用全部查找了,只要知道这条数据在哪一块,然后在那一块找就行了。如果表的数据太大,可能一个磁盘放不下,我们可以把数据分配到不同的磁盘里面去。


使用innoDB引擎的/mysql/data/数据库名目录下一张表有一个frm文件存放数据结构,其他的数据部分全部都存在在/mysql/data目录下的ibdata文件中。


MYSQL 5.1之后支持分区。


1.2 分区的优势

1)与单个磁盘或文件系统分区相比,可以存储更多的数据。

2)对于不用或者过时的数据很容易给删除掉。

3)对于一些查询有极大的优化,给定WHERE语句的数据可以只保存在一个或多个分区内,这样就不需要查找剩余的数据。

4)涉及到例如SUM()和COUNT()这样聚合函数的查询,可以很容易地进行并行处理。

5)通过跨多个磁盘来分散数据查询,来获得更大的查询吞吐量。


二、分区的类型

2.1 检查MySQL是否支持分区

//查看mysql5.6以下是否支持分区

show variables like '%partition%';

  
//查看mysql5.6以上是否支持分区

show plugins;


2.2 类型

使用分区的前提:分区键必须是主键的一部分。


解释:分区键必须是主键的一部分并不是 MySQL 的限制,而是索引组织表的限制。之所以对索引组织表有这样的限制,个人认为还是基于性能考虑。假设分区键和主键是两个不同的列,在进行插入操作时,虽然也指定了分区键,但还是需要扫描所有分区才能判断插入的主键值是否违反了唯一性约束。这样的话,效率会比较低下,违背了分区表的初衷。而对于堆表则没有这样的限制,下面是堆表和索引组织表的定义。


堆表:数据存储在表中,索引存储在索引里,两者分开的。数据在堆中是无序的,索引让键值有序,但数据还是无序的。堆表中主键索引和普通索引一样的,都是存放指向堆表中数据的指针。


索引组织表:数据存储在聚簇索引中,或者说,数据按照主键的顺序来组织数据,两者合二为一。主键索引,叶子节点存放整行数据。其他索引称为辅助索引(二级索引),叶子节点存放键值和主键值。