MySQL Partitioning – Nói chung là cũng nhàn

Tram Ho

Mysql Partitioning theo đúng như tên của nó là việc phân chia một table thành những phần nhỏ theo một logic nhất định, được phân biệt bằng key, key này thường là tên column trong table.
Như chúng ta đã biết mysql và nhiều hệ quản trị cơ sở dữ liệu khác, lưu trữ dữ liệu dưới dạng bảng gồm các hàng và cột. Mỗi lần truy vấn DB engine phải duyệt qua toàn bộ bảng để lấy dữ liệu, điều này tạo ra vấn đề về performance khi bản ghi trong table quá lớn, vấn đề này sẽ được giải quyết khá đơn giản bằng partition, nhờ kỹ thuật này chúng ta sẽ chỉ lấy dữ liệu tại vùng nhất định thay vì toàn bộ table như trước đây. Cùng xem một ví dụ để hiểu hơn về các hoạt động của partition nhé.
Ví dụ chúng ta có table persons chưa hề được tạo partition, và có các trường dữ liệu cụ thể như sau:

Table này khi tạo ra mặc định sẽ được lưu trữ thành 1 chunk trong file system

Khi sử dụng partition, table sẽ được phân chia thành nhiều chunk với key mà chúng ta đã định nghĩa. Ví dụ ở đây mình dùng trường age làm key.

Chúng ta có thể test độ hiệu quả của partition bằng câu truy vấn đơn giản như sau:

Trong trường hợp chưa dùng partition thời gian thực thi query là 0.00064 sec.

Với partition thì kết quả khác biệt rõ rệt, thời gian thực thi chỉ còn 0.0016 sec.

Do table của chúng ta đang có ít dữ liệu nên độ hiệu quả khó có thể cảm nhận được, tuy nhiên với những cơ sở dữ liệu có hàng triệu bản ghi thì đây thực sự là một giải pháp tuyệt vời.
Như vậy qua ví dụ trên bạn đã phần nào hiểu về Partition là gì và tác dụng của nó như nào, bây giờ chúng ta cùng đi vào chi tiết hơn nhé.

1. Cách tạo partition

Trước khi tạo partition bạn phải chắc chắn column mà bạn sử dụng được sử dụng thường xuyên trong các truy vấn, thì việc tạo partition mới thực sự có ý nghĩa.

Bạn có thể tạo partition bằng việc sử dụng CREATE TABLE hoặc ALTER TABLE

Ví dụ :

2. Các kiểu partition chính

  • Range partitioning
  • List partitioning
  • Columns partitioning
  • Hash partitioning
  • Key partitioning
  • Subpartitioning
    Trong phạm vi bài viết và sự hiểu biết mình sẽ tập trung làm rõ 2 loại partition là Range partitioning, List partitioning. Các loại còn lại hẹn các bạn trong một bài viết khác.

2.1. Range partitioning

Range partitioning hiểu đơn giản là phân vùng theo khoảng mà bạn muốn sử dụng, tức là chia table ra thành nhiều khoảng giá trị, các khoảng giá trị này phải liên tiếp và không chồng chéo lên nhau, ví dụ trong 1 năm bạn có 12 tháng, chúng ta có thể chia thành 12 khoảng liên tiếp nhau như

p1: 01-01-2020 đến 31-01-2020
p2: 01-02-2020 đến 29-02-2020
p3: 01-03-2020 đến 30-03-2020
….
Mục đích của chia vùng theo khoảng sẽ giúp việc insert và tìm kiếm nhanh hơn rất nhiều, khi insert nếu có giá trị nằm trong khoảng nào thì nó sẽ được insert vào trong đúng khoảng đã định nghĩa, và khi tìm kiếm cũng vậy. Việc tạo range partitioning yêu cầu từ khóa VALUE LESS THAN để chỉ định phạm vi cần sử dụng . Cùng xem ví dụ cụ thể sau:

Ở đây chúng ta đã tạo ra một table sales cùng với 4 partition được chỉ định rõ phạm vi sử dụng, p0 là sẽ lưu trữ những record có amount < 100. p2 sẽ có 100 <= amount < 300 Tương tự với các partition còn lại. Bây giờ chúng ta cùng insert vào table này

và khi select ra chúng ta cùng xem kết quả

Lưu ý trước khi tạo range partioning chúng ta cần xác định rõ các khoảng cần thiết cho nhu cầu, giả sử nếu giờ mình insert một row có amount > 1000 thì sẽ như thế nào nhỉ? Các bạn thử test và tự trả lời nhé

2.2. List partitioning

Loại này khác với loại range một chút là nó không phân chia theo khoảng nữa mà nó nhặt những phần tử được chỉ định tạo thành 1 danh sách, loại này chúng ta sẽ dùng từ khóa VALUES IN (list_value) để tạo partition. cũng lấy ví dụ trên nhưng thêm một chút trong bảng sales chúng ta có thêm cột mã nhân viên sale là saler_id để biết là nhân viên nào đã bán, và ví dụ trong một công ty chúng ta có 10 nhân viên sale, cùng với 3 nhóm sale, Mỗi nhóm làm việc ở một đoạn đường do cấp trên yêu cầu.

Ví dụ:

  • Nhóm A làm việc ở Phạm Văn Đồng
  • Nhóm B làm việc ở Trần Duy Hưng
  • Nhóm C làm việc ở Láng

Bây giờ cùng tạo table sales như sau

Và như vậy là sau này khi muốn tìm kiếm thống kê theo nhóm cũng sẽ nhanh hơn, thống kê nhân viên nào bán được bao nhiêu hàng cũng sẽ nhanh hơn là duyệt toàn bộ table.

3. Delete partition

Nếu trong quá trình vận hàng hệ thống bạn không cần một lượng data nào đó nữa thì có thể xóa đi bằng cách xóa chính partition đã định nghĩa

4. Kết luận

Như vậy trong bài viết này mình đã giới thiệu cho các bạn khái niệm, mục đích sử dụng của Mysql partition, và 2 loại partition chính hay được sử dụng là Range partition và List partition. Hy vọng đây sẽ là kiến thức bổ ích giúp các bạn tối ưu truy vấn trong quá trình làm dự án với những database lơn. Bài viết có thể còn nhiều thiếu sót , cũng như việc sử dụng từ ngữ partitionpartitioning còn nhầm lẫn mong các bạn đóng góp và hẹn các bạn trong bài viết sớm nhất về 4 loại mysql partitioning còn lại.

Chia sẻ bài viết ngay

Nguồn bài viết : Viblo