久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

mysql支持分區嗎

148次閱讀
沒有評論

共計 4002 個字符,預計需要花費 11 分鐘才能閱讀完成。

這篇文章主要介紹“mysql 支持分區嗎”,在日常操作中,相信很多人在 mysql 支持分區嗎問題上存在疑惑,丸趣 TV 小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”mysql 支持分區嗎”的疑惑有所幫助!接下來,請跟著丸趣 TV 小編一起來學習吧!

mysql 從 5.1 版本開始支持分區功能。MySQL5.1 中分區表達式必須是整數,或者返回整數的表達式;而 MySQL5.5 中提供了非整數表達式分區的支持。MySQL 數據庫的分區是局部分區索引,一個分區中既存了數據,又放了索引;也就是說,每個區的聚集索引和非聚集索引都放在各自區的(不同的物理文件)。MySQL 支持 4 種分區類型:RANGE 分區,LIST 分區,HASH 分區,KEY 分區。

本教程操作環境:windows7 系統、mysql8 版本、Dell G3 電腦。

mysql 支持分區。

mysql 分區概述

MySQL 在 5.1 時添加了對水平分區的支持。分區是將一個表或索引分解成多個更小,更可管理的部分。每個區都是獨立的,可以獨立處理,也可以作為一個更大對象的一部分進行處理。這個是 MySQL 支持的功能,業務代碼無需改動。要知道 MySQL 是面向 OLTP 的數據,它不像 TIDB 等其他 DB。那么對于分區的使用應該非常小心,如果不清楚如何使用分區可能會對性能產生負面的影響。

MySQL 數據庫的分區是局部分區索引,一個分區中既存了數據,又放了索引。也就是說,每個區的聚集索引和非聚集索引都放在各自區的(不同的物理文件)。目前 MySQL 數據庫還不支持全局分區。

無論哪種類型的分區,如果表中存在主鍵或唯一索引時,分區列必須是唯一索引的一個組成部分。

分區表的限制因素

(1)、一個表最多只能有 1024 個分區。

(2)、MySQL5.1 中,分區表達式必須是整數,或者返回整數的表達式。在 MySQL5.5 中提供了非整數表達式分區的支持。

(3)、如果分區字段中有主鍵或者唯一索引的列,那么多有主鍵列和唯一索引列都必須包含進來。即:分區字段要么不包含主鍵或者索引列,要么包含全部主鍵和索引列。

(4)、分區表中無法使用外鍵約束。

(5)、MySQL 的分區適用于一個表的所有數據和索引,不能只對表數據分區而不對索引分區,也不能只對索引分區而不對表分區,也不能只對表的一部分數據分區。

分區類型

目前 MySQL 支持一下幾種類型的分區,RANGE 分區,LIST 分區,HASH 分區,KEY 分區。如果表存在主鍵或者唯一索引時,分區列必須是唯一索引的一個組成部分。實戰十有八九都是用 RANGE 分區。

RANGE 分區

RANGE 分區是實戰最常用的一種分區類型,行數據基于屬于一個給定的連續區間的列值被放入分區。但是記住,當插入的數據不在一個分區中定義的值的時候,會拋異常。

RANGE 分區主要用于日期列的分區,比如交易表啊,銷售表啊等。可以根據年月來存放數據。如果你分區走的唯一索引中 date 類型的數據,那么注意了,優化器只能對 YEAR(),TO_DAYS(),TO_SECONDS(),UNIX_TIMESTAMP() 這類函數進行優化選擇。實戰中可以用 int 類型,那么只用存 yyyyMM 就好了。也不用關心函數了。

CREATE TABLE `m_test_db`.`Order` (
 `id` INT NOT NULL AUTO_INCREMENT,
 `partition_key` INT NOT NULL,
 `amt` DECIMAL(5) NULL,
 PRIMARY KEY (`id` , `partition_key`)
) PARTITION BY RANGE (partition_key) PARTITIONS 5 (PARTITION part0 VALUES LESS THAN (201901) , 
PARTITION part1 VALUES LESS THAN (201902) , 
PARTITION part2 VALUES LESS THAN (201903) , 
PARTITION part3 VALUES LESS THAN (201904) , 
PARTITION part4 VALUES LESS THAN (201905));

這時候我們先插入一些數據

INSERT INTO `m_test_db`.`Order` (`id`, `partition_key`, `amt`) VALUES ( 1 ,  201901 ,  1000 
INSERT INTO `m_test_db`.`Order` (`id`, `partition_key`, `amt`) VALUES ( 2 ,  201902 ,  800 
INSERT INTO `m_test_db`.`Order` (`id`, `partition_key`, `amt`) VALUES (3 ,  201903 ,  1200

現在我們查詢一下,通過 EXPLAIN PARTITION 命令發現 SQL 優化器只需搜對應的區,不會搜索所有分區

如果 sql 語句有問題,那么會走所有區。會很危險。所以分區表后,select 語句必須走分區鍵。

以下 3 種不是太常用,就一筆帶過了。

LIST 分區

LIST 分區和 RANGE 分區很相似,只是分區列的值是離散的,不是連續的。LIST 分區使用 VALUES IN,因為每個分區的值是離散的,因此只能定義值。

HASH 分區

說到哈希,那么目的很明顯了,將數據均勻的分布到預先定義的各個分區中,保證每個分區的數量大致相同。

KEY 分區

KEY 分區和 HASH 分區相似,不同之處在于 HASH 分區使用用戶定義的函數進行分區,KEY 分區使用數據庫提供的函數進行分區。

分區和性能

一項技術,不是用了就一定帶來益處。比如顯式鎖功能比內置鎖強大,你沒玩好可能導致很不好的情況。分區也是一樣,不是啟動了分區數據庫就會運行的更快,分區可能會給某些 sql 語句性能提高,但是分區主要用于數據庫高可用性的管理。

數據庫應用分為 2 類,一類是 OLTP(在線事務處理),一類是 OLAP(在線分析處理)。對于 OLAP 應用分區的確可以很好的提高查詢性能,因為一般分析都需要返回大量的數據,如果按時間分區,比如一個月用戶行為等數據,則只需掃描響應的分區即可。在 OLTP 應用中,分區更加要小心,通常不會獲取一張大表的 10% 的數據,大部分是通過索引返回幾條數據即可。

比如一張表 1000w 數據量,如果一句 select 語句走輔助索引,但是沒有走分區鍵。那么結果會很尷尬。如果 1000w 的 B + 樹的高度是 3,現在有 10 個分區。那么不是要 (3+3)*10 次的邏輯 IO?(3 次聚集索引,3 次輔助索引,10 個分區)。所以在 OLTP 應用中請小心使用分區表。

在日常開發中,如果想查看 sql 語句的分區查詢結果可以使用 explain partitions + select sql 來獲取,partitions 標識走了哪幾個分區。

mysql  explain partitions select * from TxnList where startTime 2016-08-25 00:00:00  and startTime 2016-08-25 23:59:00  
+----+-------------+-------------------+------------+------+---------------+------+---------+------+-------+-------------+ 
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | Extra | 
+----+-------------+-------------------+------------+------+---------------+------+---------+------+-------+-------------+ 
| 1 | SIMPLE | ClientActionTrack | p20160825 | ALL | NULL | NULL | NULL | NULL | 33868 | Using where | 
+----+-------------+-------------------+------------+------+---------------+------+---------+------+-------+-------------+ 
1 row in set (0.00 sec)

注:

1.MySQL Workbench 下添加分區的截圖

2. Table has no partition for value 12

在 12 月的某一天,我查看了生產的日志文件,忽然發現系統一直在報錯:Table has no partition for value 12。仔細檢查分區 sql 發現分區的時候用的是 less than

也就是說我在注釋 1 截圖里面的分區是不包括 12 月的區的。執行以下命令增加分區:

ALTER TABLE table_name ADD PARTITION (PARTITION p_12 VALUES LESS THAN (13));

如果沒有進行適當的處理,將會報錯。所以在進行 RANGE 分區時,要思考這種情況。一般情況下,就時在最后添加一個 MAXVALUE 分區,如下:

PARTITION p_max VALUES LESS THAN MAXVALUE

到此,關于“mysql 支持分區嗎”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注丸趣 TV 網站,丸趣 TV 小編會繼續努力為大家帶來更多實用的文章!

正文完
 
丸趣
版權聲明:本站原創文章,由 丸趣 2023-07-13發表,共計4002字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 武鸣县| 伊宁县| 潜江市| 古蔺县| 宁陵县| 平远县| 扶绥县| 廉江市| 昆山市| 安达市| 遂昌县| 万全县| 布拖县| 麻栗坡县| 安丘市| 阳原县| 光山县| 志丹县| 土默特左旗| 敦化市| 高台县| 芮城县| 红原县| 同心县| 斗六市| 湟中县| 馆陶县| 延寿县| 苏尼特左旗| 三门峡市| 蓬莱市| 南昌市| 鲁山县| 金门县| 大田县| 元氏县| 永平县| 潢川县| 称多县| 上思县| 广德县|