一个少妇满足三个老头在线观看,锕锕锕锕锕锕锕好痛视频,亚洲人成网站在线播放2019

<center id="pt2l2"></center>
<tr id="pt2l2"></tr>
  • <big id="pt2l2"></big>

        深入了解MySQL中分區表的原理與企業級實戰

        本文導讀

        本文詳細講解什么是分區表,分區表增刪改查的工作原理以及分區表的實戰,分區表的場景有哪些,哪些場景不建議用分區表,并列舉出六點使用分區表的誤區。

        一、什么是分區表

        分區表是一個獨立的邏輯表,底層由多個物理子表組成。

        分區的代碼實際上是底層表的一組處理程序對象的封裝。分區表的請求將通過句柄對象(Handler Object)轉換為對存儲引擎的接口調用。

        因此,分區完全封裝了SQL層的底層實現,對應用程序是透明的,對SQL層是黑盒的。然而,從底層文件系統的角度來看,很容易發現每個分區表都有一個用#分隔的表文件。

        MySQL實現分區表的方式——封裝底層表——意味著索引也是根據分區子表定義的,并且沒有全局索引。

        MySQL在創建表時使用 PARTITION BY 子句定義存儲在每個分區中的數據(在第四節詳細說明)。

        在執行查詢時,優化器將根據分區定義篩選沒有所需數據的分區。這樣,查詢不需要掃描所有分區——只需找到包含我們需要的數據的分區。

        分區的主要目的之一是以更粗的粒度將數據劃分為不同的表。通過這種方式,可以將相關數據存儲在一起。此外,可以方便地批量刪除整個分區的數據。

        二、分區表的工作原理

        1、分區表增刪改查原理

        分區表上的操作遵循以下操作邏輯:

        SELECT

        查詢分區表時,分區層首先打開并鎖定所有底層表。優化器首先確定是否可以過濾部分分區,然后調用相應的存儲引擎接口來訪問每個分區的數據。

        INSERT

        寫入記錄時,分區層首先打開并鎖定所有底層表,然后確定哪個分區接收記錄,然后將記錄寫入相應的底層表。

        DELETE

        刪除記錄時,分區層首先打開并鎖定所有底層表,然后確定與數據對應的分區,最后刪除相應的底層表。

        UPDATE

        更新記錄時,分區層首先打開并鎖定所有底層表。MySQL首先確定要更新的記錄的分區,然后取出數據并對其進行更新,然后確定更新后的數據應該放在哪個分區中,最后寫入基礎表并刪除原始數據所在的基礎表。

        2、分區表工作原理

        分區表由多個相關的底層表實現,這些底層表也由處理程序對象表示,因此我們也可以直接訪問每個分區。

        存儲引擎管理分區的所有基礎表,就像管理公共表一樣(所有基礎表必須使用相同的存儲引擎)。分區表的索引僅向每個基礎表添加相同的索引。

        從存儲引擎的角度來看,基礎表與公共表沒有區別,存儲引擎不需要知道它是公共表還是分區表的一部分。

        盡管每個操作都將”“首先打開并鎖定所有基礎表”,但這并不意味著分區表將在處理期間鎖定整個表。

        如果存儲引擎可以自己實現行級鎖,例如InnoDB,它將在分區層釋放相應的表鎖。這個鎖定和解鎖過程類似于普通InnoDB上的查詢。

        我們在第四節詳細說明,使用一些示例來了解在訪問分區表時打開和鎖定所有基礎表的成本和后果。

        三、分區表使用實戰

        1、分區表企業級實戰

        MySQL支持多個分區表。我們看到的最常見的分區是基于范圍的。每個分區存儲一個范圍內的記錄。分區表達式可以是列或包含列的表達式。

        例如,下表?按年創建分區表 # 存儲在不同的分區中:

        CREATE TABLE `***` (
        	`ID` BIGINT ( 20 ) NOT NULL AUTO_INCREMENT COMMENT '主鍵id',
        	`LOG_ID` VARCHAR ( 32 ) NOT NULL COMMENT '交易流水號',
        	`ODR_ID` VARCHAR ( 32 ) NOT NULL COMMENT '父單號',
        	`SUB_ODR_ID` VARCHAR ( 32 ) NOT NULL COMMENT '子單號',
        	`CREATE_TIME` datetime ( 0 ) NOT NULL COMMENT '創建時間',
        	`CREATE_BY` VARCHAR ( 32 ) NOT NULL COMMENT ' 創建人',
        	`UPDATE_TIME` datetime ( 0 ) NOT NULL DEFAULT CURRENT_TIMESTAMP ( 0 ) ON UPDATE CURRENT_TIMESTAMP ( 0 ) COMMENT '更新時間',
        	`UPDATE_BY` VARCHAR ( 32 ) NOT NULL COMMENT '更新人',
        
        	PRIMARY KEY ( `ID`, `CREATE_TIME` ) USING BTREE,
        	UNIQUE INDEX `UNQ_LOG_SUBODR_ID` ( `LOG_ID`, `SUB_ODR_ID`, `CREATE_TIME` ) USING BTREE,
        
        	INDEX `IDX_ODR_ID` ( `ODR_ID` ) USING BTREE,
        	INDEX `IDX_SUB_ID` ( `SUB_ODR_ID` ) USING BTREE,
        	INDEX `IDX_CREATE_TIME` ( `CREATE_TIME` ) USING BTREE,
        	INDEX `IDX_UPDATE_TIME` ( `UPDATE_TIME` ) USING BTREE 
        	) ENGINE = INNODB COMMENT = '***業務明細表' 
        
        PARTITION BY RANGE ( YEAR ( `CREATE_TIME` ) ) (
        	PARTITION p_2021 VALUES LESS THAN ( 2021 ),
        	PARTITION p_2022 VALUES LESS THAN ( 2022 ),
        	PARTITION p_2023 VALUES LESS THAN ( 2023 ),
        	PARTITION p_2024 VALUES LESS THAN ( 2024 ),
        	PARTITION p_catchall VALUES LESS THAN MAXVALUE )  ;
        

        PARTITION分區子句中可以使用各種函數。但是,表達式返回的值必須是一個確定的整數,而不是常數。這里我們使用函數 YEAR() 或任何其他函數。

        2、分區表的使用場景

        一、表太大,無法存儲在內存中,或者只有表的最后一部分有熱數據,其余部分是歷史數據。

        二、分區表數據更易于維護。例如,如果要批量刪除大量數據,可以使用清除整個分區的方法。此外,可以優化、檢查和修復獨立的分區。

        三、分區表的數據可以分布在不同的物理設備上,從而可以有效地使用多個硬件設備。

        四、分區表可以用來避免一些特殊的瓶頸,例如獨占訪問InnoDB的單個索引和ext3文件系統的索引節點鎖競爭。

        五、備份和恢復獨立的分區,大的數據集場景。

        3、分區表自身限制

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

        二、在MySQL 5.1中,分區表達式必須是整數或返回整數的表達式。在MySOL 5.5中在某些情況下,列可以直接用于分區。

        三、如果分區字段中有主鍵列或唯一索引列,則必須包括所有主鍵列和唯一索引列。

        四、分區表中不能使用外鍵約

        4、分區表的誤區

        4.1 性能提升

        許多人會認為分區表將一個大表劃分為多個小表,因此MySQL數據庫的性能將大大提高。

        這是錯誤的理解!分區表技術并不是用來提高MySQL數據庫的性能,而是為了方便數據管理。

        分區表的創建需要主鍵包含分區列;在分區表中唯一索引僅在當前分區文件唯一,而不是全局唯一;分區表唯一索引推薦使用類似 UUID 的全局唯一實現;

        分區表不解決性能問題,如果使用非分區列查詢,性能反而會更差;推薦分區表用于數據管理、速度快、日志小。

        4.2?null值會使分區過濾無效

        檢查第一個分區,因為 YEAR() 函數在接收非法值時可能返回NULL值,因此該范圍的值可能返回NULL并存儲在第一個分區中。如果第一個分區非常大,特別是當使用“完全掃描數據,無索引”策略時,成本將非常高。?

        4.3?分區列和索引列不匹配

        如果定義的索引列和分區列不匹配,查詢將無法執行分區篩選。?

        4.4?選擇分區的成本可能更高

        不同類型的分區以不同的方式實現,因此它們的性能不同。當我們在行中寫入大量數據時。每次將一行數據寫入范圍分區表時,都需要掃描分區定義列表以找到合適的目標分區。

        這個問題可以通過限制分區的數量來緩解。根據實際經驗,對于大多數系統,大約100個分區沒有問題。

        4.5?鎖住所有表的成本可能更高

        當查詢和訪問分區表時,MySQL需要打開并鎖定所有底層表,這是分區表的另一個成本。

        單個操作,例如使用批插入或LOAD DATA INFILE一次刪除多行數據。

        4.6?維護分區的成本可能更高

        分區重組的原理類似于ALTER,首先,創建一個臨時分區,然后將數據復制到其中,最后刪除原始分區。這樣會使維護分區的成本可能更高

        到此這篇關于深入了解MySQL中分區表的原理與企業級實戰的文章就介紹到這了,更多相關MySQL分區表內容請搜索以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持!

        若文章對您有幫助,幫忙點個贊!

        0
        0
        發布時間 2022-11-14 06:09:38
        0 條回復(回復會通過微信通知作者)
        點擊加載更多評論
        登錄 后再進行評論
        (微信掃碼即可登錄,無需注冊)
        一个少妇满足三个老头在线观看,锕锕锕锕锕锕锕好痛视频,亚洲人成网站在线播放2019