成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

一文徹底搞懂MySQL分區

數據庫 MySQL
這里講的分區,此“區”非彼“區”,這里講的分區的意思是指將同一表中不同行的記錄分配到不同的物理文件中,幾個分區就有幾個.idb文件。

 一.InnoDB邏輯存儲結構

首先要先介紹一下InnoDB邏輯存儲結構和區的概念,它的所有數據都被邏輯地存放在表空間,表空間又由段,區,頁組成。

段就是上圖的segment區域,常見的段有數據段、索引段、回滾段等,在InnoDB存儲引擎中,對段的管理都是由引擎自身所完成的。

區就是上圖的extent區域,區是由連續的頁組成的空間,無論頁的大小怎么變,區的大小默認總是為1MB。

為了保證區中的頁的連續性,InnoDB存儲引擎一次從磁盤申請4-5個區,InnoDB頁的大小默認為16kb,即一個區一共有64(1MB/16kb=16)個連續的頁。

每個段開始,先用32頁(page)大小的碎片頁來存放數據,在使用完這些頁之后才是64個連續頁的申請。這樣做的目的是,對于一些小表或者是undo類的段,可以開始申請較小的空間,節約磁盤開銷。

頁就是上圖的page區域,也可以叫塊。頁是InnoDB磁盤管理的最小單位。默認大小為16KB,可以通過參數innodb_page_size來設置。

常見的頁類型有:數據頁,undo頁,系統頁,事務數據頁,插入緩沖位圖頁,插入緩沖空閑列表頁,未壓縮的二進制大對象頁,壓縮的二進制大對象頁等。  

二.分區概述

分區

這里講的分區,此“區”非彼“區”,這里講的分區的意思是指將同一表中不同行的記錄分配到不同的物理文件中,幾個分區就有幾個.idb文件,不是我們剛剛說的區。MySQL在5.1時添加了對水平分區的支持。

分區是將一個表或索引分解成多個更小,更可管理的部分。

每個區都是獨立的,可以獨立處理,也可以作為一個更大對象的一部分進行處理。這個是MySQL支持的功能,業務代碼無需改動。要知道MySQL是面向OLTP的數據,它不像TIDB等其他DB。

那么對于分區的使用應該非常小心,如果不清楚如何使用分區可能會對性能產生負面的影響。

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

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

三.分區類型

目前MySQL支持一下幾種類型的分區,RANGE分區,LIST分區,HASH分區,KEY分區。

如果表存在主鍵或者唯一索引時,分區列必須是唯一索引的一個組成部分。實戰十有八九都是用RANGE分區。

RANGE分區

RANGE分區是實戰最常用的一種分區類型,行數據基于屬于一個給定的連續區間的列值被放入分區。

但是記住,當插入的數據不在一個分區中定義的值的時候,會拋異常。RANGE分區主要用于日期列的分區,比如交易表啊,銷售表啊等。可以根據年月來存放數據。

如果你分區走的唯一索引中date類型的數據,那么注意了,優化器只能對YEAR(),TO_DAYS(),TO_SECONDS(),UNIX_TIMESTAMP()這類函數進行優化選擇。實戰中可以用int類型,那么只用存yyyyMM就好了。也不用關心函數了。 

  1. CREATE TABLE `m_test_db`.`Order` (  
  2.   `id` INT NOT NULL AUTO_INCREMENT,  
  3.   `partition_key` INT NOT NULL,  
  4.   `amt` DECIMAL(5) NULL,  
  5.   PRIMARY KEY (`id`, `partition_key`))   
  6.  PARTITION BY RANGE(partition_key)   
  7.   PARTITIONS 5(   
  8.    PARTITION part0 VALUES LESS THAN (201901),    
  9.    PARTITION part1 VALUES LESS THAN (201902),    
  10.    PARTITION part2 VALUES LESS THAN (201903),    
  11.    PARTITION part3 VALUES LESS THAN (201904),   
  12.    PARTITION part4 VALUES LESS THAN (201905)) ; 

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

  1. INSERT INTO `m_test_db`.`Order` (`id`, `partition_key`, `amt`) VALUES ('1', '201901', '1000');  
  2. INSERT INTO `m_test_db`.`Order` (`id`, `partition_key`, `amt`) VALUES ('2', '201902', '800');  
  3. 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標識走了哪幾個分區。 

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

 

責任編輯:龐桂玉 來源: 民工哥技術之路
相關推薦

2021-07-08 10:08:03

DvaJS前端Dva

2020-12-07 06:19:50

監控前端用戶

2021-06-30 08:45:02

內存管理面試

2022-06-07 10:13:22

前端沙箱對象

2019-11-06 17:30:57

cookiesessionWeb

2022-04-11 10:56:43

線程安全

2024-08-08 14:57:32

2023-11-23 06:50:08

括號

2020-12-18 09:36:01

JSONP跨域面試官

2021-03-04 00:09:31

MySQL體系架構

2022-03-24 08:51:48

Redis互聯網NoSQL

2021-08-05 06:54:05

觀察者訂閱設計

2023-04-12 08:38:44

函數參數Context

2021-10-20 08:49:30

Vuexvue.js狀態管理模式

2024-04-12 12:19:08

語言模型AI

2021-01-06 13:52:19

zookeeper開源分布式

2020-05-11 14:35:11

微服務架構代碼

2024-10-15 17:12:38

代碼父子線程開源

2023-09-08 08:20:46

ThreadLoca多線程工具

2021-03-22 10:05:59

netstat命令Linux
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久久免费毛片 | 亚洲综合国产 | 国产成人免费视频网站视频社区 | 免费看日韩视频 | 国产男女猛烈无遮掩视频免费网站 | 欧美在线视频二区 | 国内精品99 | 亚洲日本激情 | 日韩精品久久一区二区三区 | 日韩成人中文字幕 | 一区中文字幕 | 亚洲精品二区 | 国产精品五月天 | 欧美成人猛片aaaaaaa | 一区二区三区视频 | 激情 一区 | 中文字幕乱码亚洲精品一区 | 超碰在线播 | 国产精品www | 久久黄色 | av免费电影在线 | 欧美精品一区二区三区在线播放 | 国产一级黄色网 | 精品欧美一区二区在线观看视频 | 中文字幕色站 | 久热精品在线 | 精区3d动漫一品二品精区 | 一级一级毛片免费看 | 国产视频一区在线 | 日本精品视频在线观看 | 成人伊人 | 欧美极品在线播放 | 日本精品国产 | 国产精品久久久久久久粉嫩 | 亚洲精品456| 欧美精品一区二区免费 | 黄色亚洲网站 | 9191在线播放| 狠狠色综合久久丁香婷婷 | 浴室洗澡偷拍一区二区 | 日韩精品视频在线 |