欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

MySQL中表分區(qū)技術(shù)詳細解析

 更新時間:2016年06月16日 10:19:09   投稿:hebedich  
數(shù)據(jù)庫分區(qū)是一種物理數(shù)據(jù)庫設(shè)計技術(shù)。雖然分區(qū)技術(shù)可以實現(xiàn)很多效果,但其主要目的是為了在特定的SQL操作中減少數(shù)據(jù)讀寫的總量以縮減sql語句的響應(yīng)時間,同時對于應(yīng)用來說分區(qū)完全是透明的。

MySQL 分區(qū)技術(shù)(是mysql 5.1以版本后開始用->是甲骨文mysql技術(shù)團隊維護人員以插件形式插入到mysql里面的技術(shù))

1、概述

數(shù)據(jù)庫單表到達一定量后,性能會有衰減,像mysql\sql server等猶為明顯,所以需要把這些數(shù)據(jù)進行分區(qū)處理。同時有時候可能出現(xiàn)數(shù)據(jù)剝離什么的,分區(qū)表就更有用處了!

MySQL 5.1 中新增的分區(qū)(Partition)功能就開始增加,優(yōu)勢也越來越明顯了:

  1. 與單個磁盤或文件系統(tǒng)分區(qū)相比,可以存儲更多的數(shù)據(jù)
  2. 很容易就能刪除不用或者過時的數(shù)據(jù)
  3. 一些查詢可以得到極大的優(yōu)化
  4. 涉及到 SUM()/COUNT() 等聚合函數(shù)時,可以并行進行
  5. IO吞吐量更大
  6. 分區(qū)允許可以設(shè)置為任意大小的規(guī)則,跨文件系統(tǒng)分配單個表的多個部分。實際上,表的不同部分在不同的位置被存儲為單獨的表。

2、分區(qū)技術(shù)支持

在5.6之前,使用這個參數(shù)查看當將配置是否支持分區(qū):

mysql> SHOW VARIABLES LIKE '%partition%';
+-----------------------+-------+
|Variable_name     | Value |
+-----------------------+-------+
| have_partition_engine | YES  |
+-----------------------+-------+

如果是yes表示你當前的配置支持分區(qū)。 在5.6及以采用后,則采用如下方式進行查看:

mysql> SHOW PLUGINS;
+----------------------------+----------+--------------------+---------+---------+
| Name            | Status  | Type        | Library | License |
+----------------------------+----------+--------------------+---------+---------+
| binlog           | ACTIVE  | STORAGE ENGINE   | NULL  | GPL   |
| mysql_native_password   | ACTIVE  | AUTHENTICATION   | NULL  | GPL   |
..................................................................................
| INNODB_LOCKS        | ACTIVE  | INFORMATION SCHEMA | NULL  | GPL   |
| INNODB_LOCK_WAITS     | ACTIVE  | INFORMATION SCHEMA | NULL  | GPL   |
| partition         | ACTIVE  | STORAGE ENGINE   | NULL  | GPL   |
+----------------------------+----------+--------------------+---------+---------+

42 rows in set (0.00 sec) 最后一行,可以看到partition是ACTIVE的,表示支持分區(qū)。

3、分區(qū)類型及舉例

3.1范圍分區(qū)

RANGE 分區(qū):基于屬于一個給定連續(xù)區(qū)間的列值,把多行分配給分區(qū)。如時間,連續(xù)的常量值等 --按年分區(qū)

mysql> use mytest;
Database changed
mysql> create table range_p( 
  -> perid int(11), 
  -> pername char(12) not null, 
  -> monsalary DECIMAL(10,2),
  -> credate datetime 
  -> ) partition by range(year(credate))( 
  -> partition p2011 values less than (2011), 
  -> partition p2012 values less than (2012), 
  -> partition p2013 values less than (2013), 
  -> partition p2014 values less than (2014),
  -> partition p2015 values less than maxvalue 
  -> );
Query OK, 0 rows affected (0.12 sec)

3.2列舉分區(qū)

LIST 分區(qū):類似于按RANGE分區(qū),區(qū)別在于LIST分區(qū)是基于列值匹配一個離散值集合中的某個值來進行選擇。比如說類似性別(1,2)等屬性值。

mysql> create table list_p( 
  -> perid int(11), 
  -> pername char(12) not null,
  -> sex int(1) not null,
  -> monsalary DECIMAL(10,2),
  -> credate datetime 
  -> ) partition by list(sex) (
  -> partition psex1 values in(1),
  -> partition psex2 values in(2));
Query OK, 0 rows affected (0.06 sec)

注意,list只能是數(shù)字,使用字符會報錯ERROR 1697 (HY000): VALUES value for partition 'psex1' must have type INT。

3.3離散分區(qū)

HASH分區(qū):基于用戶定義的表達式的返回值來進行選擇的分區(qū),該表達式使用將要插入到表中的這些行的列值進行計算。這個函數(shù)可以包>含MySQL中有效的、產(chǎn)生非負整數(shù)值的任何表達式。

--以int字段hash分區(qū)

create table hash_p( 
perid int(11), 
pername char(12) not null,
sex int(1) not null,
monsalary DECIMAL(10,2),
credate datetime 
) partition by hash (perid) 
partitions 8;

--以時間函數(shù)hash分區(qū)

mysql> create table hash_p( 
  -> perid int(11), 
  -> pername char(12) not null,
  -> sex int(1) not null,
  -> monsalary DECIMAL(10,2),
  -> credate datetime 
  -> ) partition by hash (year(credate)) 
  -> partitions 8;
Query OK, 0 rows affected (0.11 sec)

3.4鍵值分區(qū)

KEY分區(qū):類似于按HASH分區(qū),區(qū)別在于KEY分區(qū)只支持計算一列或多列,且MySQL服務(wù)器提供其自身的哈希函數(shù)。必須有一列或多列包含>整數(shù)值。 其分區(qū)方法與hash很相似:

mysql> create table key_p( 
  -> perid int(11), 
  -> pername char(12) not null,
  -> sex int(1) not null,
  -> monsalary DECIMAL(10,2),
  -> credate datetime 
  -> ) partition by key (perid) 
  -> partitions 8;
Query OK, 0 rows affected (0.12 sec)

3.5其它說明

mysql-5.5開始支持COLUMNS分區(qū),可視為RANGE和LIST分區(qū)的進化,COLUMNS分區(qū)可以直接使用非整形數(shù)據(jù)進行分區(qū)。COLUMNS分區(qū)支持以下數(shù)據(jù)類型: 所有整形,如INT SMALLINT TINYINT BIGINT。FLOAT和DECIMAL則不支持。 日期類型,如DATE和DATETIME。其余日期類型不支持。 字符串類型,如CHAR、VARCHAR、BINARY和VARBINARY。BLOB和TEXT類型不支持。 COLUMNS可以使用多個列進行分區(qū)。

mysql> create table range_p( 
  -> perid int(11), 
  -> pername char(12) not null, 
  -> monsalary DECIMAL(10,2),
  -> credate datetime 
  -> ) PARTITION BY RANGE COLUMNS (credate)( 
  -> partition p20151 values less than ('2015-04-01'), 
  -> partition p20152 values less than ('2015-07-01'), 
  -> partition p20153 values less than ('2015-10-01'), 
  -> partition p20154 values less than ('2016-01-01'),
  -> partition p20161 values less than ('2016-04-01'),
  -> partition partlog values less than maxvalue 
  -> );
Query OK, 0 rows affected (0.12 sec)

總結(jié):

分區(qū)表是在MySQL5.1中新增的的功能,截止到MySQL5.1.22-rc,分區(qū)技術(shù)并不很成熟,很多分區(qū)的維護和管理功能未實現(xiàn)。如,分區(qū)內(nèi)數(shù)據(jù)存儲空間的回收、分區(qū)的修復(fù)、分區(qū)的優(yōu)化等,MySQL的分區(qū)可以用在可以按分區(qū)刪除的表中,且對數(shù)據(jù)庫的修改操作不大,且頻繁按照分區(qū)字段進行查詢的表中(如惡意代碼中的統(tǒng)計表按天分區(qū),經(jīng)常按照時間進行查詢、分組等,且可以按天刪除分區(qū))。此外,由于MySQL無全局索引只有分區(qū)索引,當一張有2個唯一索引[z5] 的時候,不能將此表分區(qū),分區(qū)列中必須包含主鍵。否則MySQL會報錯。

總之,MySQL對于分區(qū)的限制很多,且個人認為hash和key的分區(qū)實際意義不是太大。

分區(qū)引入了一種新的優(yōu)化查詢的方式(當然,也有相應(yīng)的缺點)。優(yōu)化器可以使用分區(qū)函數(shù)修整分區(qū),或者把分區(qū)從查詢中完全移除掉。它通過推斷是否可以在特定的分區(qū)上找到數(shù)據(jù)來達成這種優(yōu)化。因此在最好的情況下,修整可以讓查詢訪問更少的數(shù)據(jù)。重要的是要在WHERE子句中定義分區(qū)鍵,即使它看上去像是多余的。通過分區(qū)鍵,優(yōu)化器就可以去掉不用的分區(qū),否則的話,執(zhí)行引擎就會像合并表那樣訪問表的所有分區(qū),這在大表上會非常慢。分區(qū)數(shù)據(jù)比非分區(qū)數(shù)據(jù)更好維護,并且可以通過刪除分區(qū)來移除老的數(shù)據(jù)。分區(qū)數(shù)據(jù)可以被分布到不同的物理位置,這樣服務(wù)器可以更有效地使用多個硬盤驅(qū)動器。

[z1]分區(qū)函數(shù)的返回值必須是整數(shù),新增分區(qū)的分區(qū)函數(shù)返回值應(yīng)大于任何一個現(xiàn)有分區(qū)的分區(qū)函數(shù)的返回值。
 [z2]對于有主鍵的表錯誤提示:#1503
 A PRIMARY KEY MUST INCLUDE ALL COLUMNS INTHE TABLE'S PARTITIONING FUNCTION,沒有主鍵的則無此約束
 [z3]注意:對于通過RANGE分區(qū)的表,只可以使用ADD PARTITION添加新的分區(qū)到分區(qū)列表的高端。即不能添加比這個分區(qū)的范圍小的分區(qū)。
 [z4] 對于按照RANGE分區(qū)的表,只能重新組織相鄰的分區(qū);不能跳過RANGE分區(qū)。不能使用REORGANIZEPARTITION來改變表的分區(qū)類型;也就是說,例如,不能把RANGE分區(qū)變?yōu)镠ASH分區(qū),反之亦然。也不能使用該命令來改變分區(qū)表達式或列。
 [z5]注意主鍵和唯一索引的區(qū)別

官方資料:https://dev.mysql.com/doc/refman/5.5/en/partitioning.html

相關(guān)文章

  • Mysqlslap MySQL壓力測試工具 簡單教程

    Mysqlslap MySQL壓力測試工具 簡單教程

    Mysqlslap是從5.1.4版開始的一個MySQL官方提供的壓力測試工具。通過模擬多個并發(fā)客戶端訪問MySQL來執(zhí)行壓力測試,同時詳細的提供了“高負荷攻擊MySQL”的數(shù)據(jù)性能報告。并且能很好的對比多個存儲引擎在相同環(huán)境下的并發(fā)壓力性能差別
    2011-10-10
  • mysql數(shù)據(jù)庫安裝和卸載方式

    mysql數(shù)據(jù)庫安裝和卸載方式

    這篇文章主要介紹了mysql數(shù)據(jù)庫安裝和卸載方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • MySQL索引失效十種場景與優(yōu)化方案

    MySQL索引失效十種場景與優(yōu)化方案

    這篇文章主要介紹了MySQL索引失效十種場景與優(yōu)化方案,文中有詳細的代碼示例供參考閱讀,感興趣的朋友可以看一下
    2023-05-05
  • centos6.5中rpm包安裝mysql5.7初始化出錯的解決方法

    centos6.5中rpm包安裝mysql5.7初始化出錯的解決方法

    這篇文章主要介紹了centos6.5中rpm包安裝mysql5.7初始化出錯的解決方法,需要的朋友可以參考下
    2017-09-09
  • MySQL中建表時可空(NULL)和非空(NOT NULL)的用法詳解

    MySQL中建表時可空(NULL)和非空(NOT NULL)的用法詳解

    這篇文章主要介紹了MySQL中建表時可空(NULL)和非空(NOT NULL)的用法詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • Mysql5升級到Mysql5.5的方法

    Mysql5升級到Mysql5.5的方法

    這篇文章主要介紹了Mysql5升級到Mysql5.5的方法的相關(guān)資料,需要的朋友可以參考下
    2016-01-01
  • mysql滑動聚合/年初至今聚合原理與用法實例分析

    mysql滑動聚合/年初至今聚合原理與用法實例分析

    這篇文章主要介紹了mysql滑動聚合原理與用法,結(jié)合實例形式分析了mysql滑動聚合的相關(guān)功能、原理、使用方法及操作注意事項,需要的朋友可以參考下
    2019-12-12
  • Mybatis多表查詢與動態(tài)SQL特性詳解

    Mybatis多表查詢與動態(tài)SQL特性詳解

    動態(tài)SQL可以省略很多拼接SQL的步驟,使用類似于JSTL方式,下面這篇文章主要給大家介紹了關(guān)于Mybatis多表查詢與動態(tài)SQL特性的相關(guān)資料,文字通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-11-11
  • MySql添加新用戶及為用戶創(chuàng)建數(shù)據(jù)庫和給用戶分配權(quán)限方法介紹

    MySql添加新用戶及為用戶創(chuàng)建數(shù)據(jù)庫和給用戶分配權(quán)限方法介紹

    這篇文章主要介紹了MySql添加新用戶及為用戶創(chuàng)建數(shù)據(jù)庫和給用戶分配權(quán)限方法介紹,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • JDBC連接的六步實例代碼(與mysql連接)

    JDBC連接的六步實例代碼(與mysql連接)

    這篇文章主要給大家介紹了關(guān)于JDBC連接的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05

最新評論