一、前言
大數據量的查詢,不僅查詢速度非常慢,而且還會導致數據庫經常宕機,在嘗試添加索引及查詢方式修改后,還有沒有更有效的解決方案呢?
分庫、分表、分區這些概念咱就應該了解一下。
二、分表
假如一個大型商城有一個訂購關系表,每個用戶的訂單都落在這個表里面,那么時間一長,要進行查詢的時候,肯定慢得要死,這樣的系統給客戶用,那就涼涼思密達了...
拆分思想
咱可以對這個總表進行拆分,例如對年進行拆分,每個年表只存一年的記錄,那么這樣數據就分散開來了,每個表的數據就少很多,根據具體情況還可以按月分,按日分等等...
PS:注意,分表使用時,查詢語句里要進行動態拼裝查詢的表名。
三、分區
簡介
年表創建過后,查詢就是查詢年表中的數據,可是雖然分表了,但是年表中的數據量仍然很大,查詢速度雖然有提升,但並不能滿足用戶的要求,此時考慮在年表中再根據月份進行分區。
定義
表分區后,邏輯上仍然是一張表,只不過將表中的數據在物理上存放到多個表空間上。
目的
這樣在查詢數據時,會查詢相應分區的數據,減少SQL操作的數據量,避免了全表掃描,從而提升查詢效率。
水平分區
對行進行分區,舉個例子來說,就是一個表中有1000萬條數據,每100萬條數據划一個分區,這樣就將表中數據分到10個分區中去。
PS:水平分區要通過某個特定的屬性列進行分區,如用時間先orderBy后再分區。
垂直分區
對列進行分區,減少表的寬度,從而提升查詢效率。
比如一個學生表中,有他相關的信息列,還有論文列以CLOB存儲,可以把這些不經常使用的CLOB划分到另一個分區,需要訪問時再調用它。
代碼樣例
--水平分區 --按照訂單時間進行水平分區 CREATE TABLE ORDER_ACTIVITIES ( ORDER_ID NUMBER(7) NOT NULL, ORDER_DATE DATE, TOTAL_AMOUNT NUMBER, CUSTOTMER_ID NUMBER(7), PAID CHAR(1) ) PARTITION BY RANGE (ORDER_DATE) ( PARTITION ORD_ACT_PART01 VALUES LESS THAN (TO_DATE('01- MAY -2003','DD-MON-YYYY')) TABLESPACE ORD_TS01, PARTITION ORD_ACT_PART02 VALUES LESS THAN (TO_DATE('01-JUN-2003','DD-MON-YYYY')) TABLESPACE ORD_TS02, PARTITION ORD_ACT_PART02 VALUES LESS THAN (TO_DATE('01-JUL-2003','DD-MON-YYYY')) TABLESPACE ORD_TS03 ); --按省份進行分區 CREATE TABLE ListTable ( id INT PRIMARY KEY , name VARCHAR (20), area VARCHAR (10) ) PARTITION BY LIST (area) ( PARTITION part1 VALUES ('guangdong','beijing') TABLESPACE Part1_tb, PARTITION part2 VALUES ('shanghai','nanjing') TABLESPACE Part2_tb ); --垂直分區 PS:垂直分區思路是將寫入操作比較頻繁的數據表,把這個兩個表分離出來,放在不同的服務器
PS:可以理解為外鍵的關聯方式(不知道准不准確...)
--查詢分區數據
select * from 表 partition(分區名) where 條件;
參考資料:
- Oracle億級數據查詢處理 (特此感謝!)
- Oracle 分區表使用和查詢 (特此感謝!)
- 垂直分區+水平分區(特此感謝!)