MySQL Partition
What is table partitioning
- Table partitioning is a way to divide a large table into smaller, more manageable parts without having to create separate tables for each part.
- Partitioning can be achieved without splitting tables by physically putting tables on individual disk drives
- Partitioning is not visible to end users, a partitioned table behaves like one logical table when queried.
Why wee need partitioning
- Help speed up loading and archiving of data
- Perform maintenance operations on individual partitions instead of the whole table
- Improve query formance. Instead of scanning the whole table, now you only need to scan only one or a few partitions to find the expected record
Hash partitioning
Được sử dụng khi bạn muốn phân bố đồng đều data cho các
partition
Để tạo
HASH
partition, thêm vào câu lệnhPARTITION BY HASH (expr)
sau lệnhCREATE TABLE
.expr
là 1 expression trả về 1 integer. Ví dụ:PARTITION BY HASH (YEAR(date_created))
- Khi 1 record được insert, hệ thống sẽ chọn partition mà record sẽ được lưu dựa trên phép chia dư như sau:
N = MOD(expr, num)
.num
là số partition. Ví dụ:
Nếu chúng ta thêm 1 record mà giá trị của col3
là 2005-09-15
thì vị trí partition mà record sẽ được lưu được đánh giá như sau:
Vậy record sẽ được lưu vào partition số 1
- Khi truy vấn hệ thống sẽ tìm partition
k
cho giá trị hash tương ứngk = MOD(expr, n)
của record và tìm record trong parttionk
đó thay vìscan
toàn bộ bảng để tìm
Tìm thấy record trong parttion p0
Linear Hash Partition
- Về cơ bản giống
HASH PARTITION
nhưngLINEAR HASH PARTITION
sử dụng thuật toánlinear powers-of-two
thay vìmodulus
như thông thường
Vị trí N
partition mà record sẽ được lưu vào được mô tả dưới thuật toán sau:
Giả sử chúng ta có bảng t1 với schema
như sau
Chúng ta muốn insert record t1 có giá trị của col3
là '2003-04-14'
. Thì partition N
mà record được lưu được xác định như sau:
- The advantage in partitioning by linear hash is that the adding, dropping, merging, and splitting of partitions is made much faster, which can be beneficial when dealing with tables containing extremely large amounts (terabytes) of data. The disadvantage is that data is less likely to be evenly distributed between partitions as compared with the distribution obtained using regular hash partitioning.
Key partitioning
- Hoạt động tương tự như
HASH
nhưng thay vì sử dụngexpr
do người dùng cung cấp,key partition
sử dụng hàmhash
được cung cấp bời hệ thống, thông thường làMD5
KEY()
có thể nhận 0 hoặc nhiều giá trị tên cột. Bất cứ tên cột nào được sư dụng phải là 1 thành phần trong các PRIMARY KEY
của bảng. Nếu không có tên cột nào được cung cấp cho hàm KEY()
thì PRIMARY KEY
của bảng sẽ được sử dụng
Range partitioning
Được sử dụng khi muốn nhóm các giá record nằm trong 1 khoảng nào đó lại với nhau.
Giả sử số lượng đơn hàng của 1 cửa hàng trong những năm quá lớn khiến việc truy vấn thông tin của 1 đơn hàng mất rất nhiều thời gian. Vì vậy chúng ta đề ra giải pháp phân chia bảng đơn hàng thành 10 partition để khi truy vấn thông tin 1 đơn hàng, ta chỉ cần tìm thông tin đơn hàng trong partition tương ứng mà đơn hàng đó được lưu
List partitioning
Continental | CountryID |
---|---|
Asia | 3, 5, 6, 9, 17 |
Europe | 1, 2, 10, 11, 19, 20 |
Africa | 4, 12, 13, 14, 18 |
North America | 7, 8, 15, 16 |
South America | 20, 25, 30, 44, 50 |
- Giả sử chúng ta cần partition một bảng dữ liệu
user
theo vị trí địa lý lục địa củauser
Giả sử chúng ta cần insert 1 user
User này sẽ được lưu vào partition pEurope
vì có country_id = 20
nằm trong (1, 2, 10, 11, 19, 20)
Reference
https://www.cathrinewilhelmsen.net/2015/04/12/table-partitioning-in-sql-server/