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'

在這裏插入圖片描述


記錄生活中問題,以後就不會有問題

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