mysql表分区 COLUMNS分区的一次经历

前言:

由于前两天刚换项目组,需要尝试下表分区,经过和项目经理的沟通,明白了如果要想结果数据库查询慢的问题,加索引,SQL优化,只是在逻辑层面进行的优化,要想再根本解决问题,是去表分区来进行物理层面的优化。

表分区的含义:
mysql数据库中的数据是以文件的形势存在磁盘上的,默认放在/mysql/data下面 (可以通过my.cnf中的datadir来查看),一张表主要对应着三个文件,一个是frm存放表 结构的,一个是myd存放表数据的,一个是myi存表索引的。如果一张表的数据量太大的 话,那么myd,myi就会变的很大,查找数据就会变的很慢,这个时候我们可以利用mysql 的分区功能,在物理上将这一张表对应的三个文件,分割成许多个小块,这样呢,我们查找 一条数据时,就不用全部查找了,只要知道这条数据在哪一块,然后在那一块找就行了。如 果表的数据太大,可能一个磁盘放不下,这个时候,我们可以把数据分配到不同的磁盘里面 去。 表分区,是指根据一定规则,将数据库中的一张表分解成多个更小的,容易管理的 部分。从逻辑上看,只有一张表,但是底层却是由多个物理分区组成。

表分区的限制:
一个表最多只能有1024个分区。 MySQL5.1中,分区表达式必须是整数,或者返回整数的表达式。在MySQL5.5中提供了 非整数表达式分区的支持。
如果分区字段中有主键或者唯一索引的列,那么多有主键列和唯一索引列都必须包含进来。 即:分区字段要么不包含主键或者索引列,要么包含全部主键和索引列。 分区表中无法使用外键约束。 MySQL的分区适用于一个表的所有数据和索引,不能只对表数据分区而不对索引分区,也 不能只对索引分区而不对表分区,也不能只对表的一部分数据分区。todo 待验证
MySQL分区的类型:
(1)、RANGE分区:基于属于一个给定连续区间的列值,把多行分配给分区。 (2)、LIST分区:类似于按RANGE分区,区别在于LIST分区是基于列值匹配一个离散值 集合中的某个值来进行选择。
(3)、HASH分区:基于用户定义的表达式的返回值来进行选择的分区,该表达式使用将 要插入到表中的这些行的列值进行计算。这个函数可以包含MySQL 中有效的、产生非负整 数值的任何表达式。
(4)、KEY分区:类似于按HASH分区,区别在于KEY分区只支持计算一列或多列,且 MySQL服务器提供其自身的哈希函数。必须有一列或多列包含整数值。 (5)、COLUMNS分区:COLUMN分区是5.5开始引入的分区功能,只有RANGE COLUMN和LIST COLUMN这两种分区;支持整形、日期、字符串;RANGE和LIST 的分区方式非常的相似。


我们使用到了 COLUMNS分区

先看下表信息:我们要根据channel来进行分区:
在这里插入图片描述

1.查看mysql版本是否支持表分区

show variables like '%partition%'

在这里插入图片描述
如果没有看到变量 have_partition_engine 的值为 YES 则说明当前mysql的版本就 不支持分区。mysql从5.1开始支持分区功能。

我们可以使用 SELECT VERSION();来查看数据库版本。
在这里插入图片描述
– mysql5.6及以上版本检查是否支持分区表的方法一


SHOW PLUGINS

– mysql5.6及以上版本检查是否支持分区表的方法二

SELECT 	PLUGIN_NAME AS NAME, 
       	PLUGIN_VERSION AS VERSION, 
    	PLUGIN_STATUS AS STATUS 
    	FROM INFORMATION_SCHEMA.PLUGINS 
    	WHERE PLUGIN_TYPE='STORAGE ENGINE';

在这里插入图片描述

2.开始分区

alter table test PARTITION BY RANGE COLUMNS(channel)(
	PARTITION pedu VALUES LESS THAN ('f'),
	PARTITION psequip VALUES LESS THAN ('t'),
	PARTITION ptour VALUES LESS THAN ('u'),
	PARTITION pmax VALUES LESS THAN (MAXVALUE)
)

如上图 THAN() 括号内的字母必须是按照顺序来的 , 不然会报错 , 如匹配字符串 “edu” 则括号内取首字母e按顺序后面一个字母f

在这里插入图片描述

3.分区后查询

SELECT * from test PARTITION(pedu)

SELECT * from test PARTITION(psequip)

SELECT * from test PARTITION(ptour)

在这里插入图片描述– 查看每个分区的数量

-- 查看每个分区的数量
SELECT
	PARTITION_NAME,  #分区名称
	PARTITION_METHOD, #分区方法
	PARTITION_EXPRESSION, #分区表达式
	PARTITION_DESCRIPTION, # 分区描述
	TABLE_ROWS,
	SUBPARTITION_NAME,
	SUBPARTITION_METHOD,
	SUBPARTITION_EXPRESSION 
FROM
	information_schema.PARTITIONS 
WHERE
	TABLE_SCHEMA = SCHEMA ( ) 
	AND TABLE_NAME = 'test'

在这里插入图片描述


记录生活中问题,以后就不会有问题

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章