欧美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)文章

  • Ubuntu18.04 安裝mysql8.0.11的圖文教程

    Ubuntu18.04 安裝mysql8.0.11的圖文教程

    本文通過圖文并茂的形式給大家介紹了Ubuntu18.04 安裝mysql8.0.11的方法,非常不錯,具有一定的參考借鑒價值,需要的的朋友參考下吧
    2018-07-07
  • MySQL主從同步、讀寫分離配置步驟

    MySQL主從同步、讀寫分離配置步驟

    根據(jù)要求配置MySQL主從備份、讀寫分離,結(jié)合網(wǎng)上的文檔,對搭建的步驟和出現(xiàn)的問題以及解決的過程做了如下筆記
    2012-03-03
  • Mysql雙主配置的詳細步驟

    Mysql雙主配置的詳細步驟

    雙主可以在一定程度上保證主庫的高可用,在一臺主庫down掉之后,可以在極短的時間內(nèi)切換到另一臺主庫上,減少了主從同步給線上主庫帶來的壓力,這篇文章主要給大家介紹了關(guān)于Mysql雙主配置的詳細步驟,需要的朋友可以參考下
    2022-06-06
  • MySQL入門(五) MySQL中的索引詳講

    MySQL入門(五) MySQL中的索引詳講

    之前寫到MySQL對表的增刪改查(查詢最為重要)后,就感覺MySQL就差不多學(xué)完了,沒有想繼續(xù)學(xué)下去的心態(tài)了,原因可能是由于別人的影響,覺得對于MySQL來說,知道了一些復(fù)雜的查詢,就夠了
    2018-07-07
  • MySQL存儲過程in、out和inout參數(shù)示例和總結(jié)

    MySQL存儲過程in、out和inout參數(shù)示例和總結(jié)

    這篇文章主要給大家介紹了關(guān)于MySQL存儲過程in、out和inout參數(shù)的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • Mysql如何在select查詢時追加(添加)一個字段并指定值

    Mysql如何在select查詢時追加(添加)一個字段并指定值

    這篇文章主要介紹了Mysql如何在select查詢時追加(添加)一個字段并指定值,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-09-09
  • mysql 報錯This function has none of DETERMINISTIC解決方案

    mysql 報錯This function has none of DETERMINISTIC解決方案

    這篇文章主要介紹了mysql 報錯This function has none of DETERMINISTIC解決方案的相關(guān)資料,需要的朋友可以參考下
    2016-11-11
  • MySQL刪除數(shù)據(jù),表文件大小依然沒變的原因

    MySQL刪除數(shù)據(jù),表文件大小依然沒變的原因

    這篇文章主要介紹了MySQL刪除數(shù)據(jù),表文件大小依然沒變的原因,幫助大家更好的理解MySQL中的數(shù)據(jù)表,感興趣的朋友可以了解下
    2020-10-10
  • Mysql多表關(guān)聯(lián)不走索引的原因及分析

    Mysql多表關(guān)聯(lián)不走索引的原因及分析

    這篇文章主要介紹了Mysql多表關(guān)聯(lián)不走索引的原因及分析,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • mysql oracle和sqlserver分頁查詢實例解析

    mysql oracle和sqlserver分頁查詢實例解析

    最近簡單的對oracle,mysql,sqlserver2005的數(shù)據(jù)分頁查詢作了研究,把各自的查詢的語句貼到腳本之家平臺供大家參考
    2017-10-10

最新評論