Về partition trong table MySQL
Database
20
Mysql
40
White

ShinaBR2 viết ngày 06/07/2017

Mọi việc bắt đầu khi mình có hứng muốn xây dựng một trang web cho riêng mình. Hoạch định tổng thời gian làm xong là n ngày thì n/2 ngày mình sẽ dành cho database. Sau khi dạo một vòng database thì cũng rút ra được một vài những thứ hay ho, tích góp lại kẻo quên.

Vì một vài lý do, mình chọn MySQL và bắt đầu rà soát lại hết những kiến thức mình biết về nó, và chợt nhận ra một thứ hay ho được gọi là phân vùng bảng (partition), dĩ nhiên ngoài nó cũng sẽ có những thứ hay ho khác, trong Kipalog cũng có 1 bài viết về vấn đề này. Tuy nhiên, theo kinh nghiệm cá nhân đọc trên document chính thống của MySQL, cũng như tìm kiếm trên mạng, mình thấy đa phần đều trình bày một cách rất giáo điều và không khác nhiều từ trong document chính thống viết ra. Bởi thế, đọc từ document chính thống luôn tốt và sạch sẽ hơn rất nhiều. Mình sẽ không trình bày lại những gì có thể tìm được một cách dễ dàng qua StackOverflow hay đại loại thế, cái mình muốn nói đó là TẠI SAO lại sinh ra cái partion này, dùng nó KHI NÀO. Còn lại, dùng thế nào hay chi tiết cụ thể hơn, bạn có thể đọc tài liệu chính thống của MySQL, hoặc nếu lười, google phát là ra.

Để giải quyết được 2 câu hỏi này, bạn hãy đặt mình vào thực tế, khi mà dữ liệu trong bảng của MySQL không đơn thuần là một hay vài chục ngàn dòng, dù muốn hay không, thì tương lai bạn cũng sẽ phải đối mặt vấn đề này, chỉ là sớm hay muộn thôi.

TẠI SAO

Là một người lập trình viên, có bao giờ bạn tự hỏi mình câu hỏi này khi áp dụng một thuật toán, hoặc một design pattern, hoặc đơn giản như chọn một framework để code? Tôi thì luôn tự đặt cho mình câu hỏi này và đó là sự khởi đầu cho cách để nhớ mọi thứ, nó sẽ không tốn quá nhiều bộ não như bạn nghĩ.
Quay lại vấn đề, khi số lượng dòng quá lớn, hãy lấy ví dụ một bảng Transaction lưu lại thông tin về các giao dịch của một hệ thống ngân hàng. Làm sao bạn có thể lấy ra 1 dòng tùy ý với điều kiện cho trước khi số lượng bản ghi quá nhiều? Bạn có thể trả lời, đơn giản là đánh index. Vâng, câu trả lời không sai. Nhưng vấn đề là liệu còn có cách nào khác để tối ưu tốc độ truy vấn thêm nữa? Thì partition được sinh ra như một giải pháp bổ sung cho vấn đề hiệu năng khi truy vấn. Dĩ nhiên, tăng tốc được chừng nào hay chừng đó, với hệ thống càng lớn, điều này sẽ càng thấy rõ. Ý tưởng của partition đó chính là chia 1 bảng (ở đây là bảng Transaction) thành nhiều bảng con về mặt logic theo một điều kiện nào đó, mục đích là để giảm thiểu số lượng dòng cần truy vấn cho câu truy vấn. Thay vì quét 1 triệu dòng để tìm kết quả thì ta sẽ chia 1 triệu dòng đó thành 10 phần, mỗi phần 100 ngàn dòng, và hiển nhiên, kết quả truy vấn sẽ nhanh hơn rất nhiều, rất đơn giản. Dĩ nhiên, cách chia như thế nào là ở chúng ta. Nói tóm lại một cách đơn giản, partition chính là chia để trị.
Bạn có thể tự nghĩ thêm về những lợi ích của việc chia để trị, nó rất dễ.

KHI NÀO

Đến đây, chắc bạn cũng trả lời được câu hỏi này cho mình. Hãy tưởng tượng bảng Transaction ở trên lưu tất cả các giao dịch từ 10 năm về trước cho tới giờ, việc truy vấn sẽ trở thành một cơn ác mộng. Tuy nhiên nếu chúng ta chia nó thành nhiều partition, cụ thể lấy theo từng tháng, mỗi tháng là một partition, mặc dù dữ liệu vẫn còn rất lớn, tuy nhiên sẽ giảm đáng kể thời gian dành cho truy vấn. Và use-case thường dùng nhất cho partition đó là gom nhóm các dòng của một bảng theo một đại lượng nào đó, ví dụ thời gian. Đây chỉ là trường hợp đơn giản nhất, tùy vào nhu cầu của mình, bạn sẽ cần biết mình sẽ gom nhóm theo cái nào. Hãy xem lại câu hỏi 1 để biết.

TÓM LẠI

Việc sử dụng partition là cần thiết. Và ý tưởng này không chỉ áp dụng cho database mà còn cho nhiều chỗ khác, ví dụ tổ chức cấu trúc thư mục cho file upload của người dùng. Hãy tưởng tượng hệ thống của bạn có hàng triệu người dùng, mỗi người dùng lại upload rất rất nhiều thứ lên, và nếu như tất cả đều được upload vào cùng một thư mục, thì chuyện gì sẽ xảy ra?

Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

ShinaBR2

10 bài viết.
88 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
55 16
Đây là một vấn đề kinh điển, và có rất nhiều bài viết về nó, tuy nhiên đa phần là dịch từ bản gốc ra và sao chép lại một vài câu lệnh, và câu hỏi t...
ShinaBR2 viết 8 tháng trước
55 16
White
32 10
Vào một ngày đẹp trời, khi bạn nhận được yêu cầu phải thiết kế database cho một hệ thống, câu hỏi đầu tiên được đặt ra, quy trình làm ra nó sẽ cụ t...
ShinaBR2 viết 8 tháng trước
32 10
White
30 8
Bàn về code thối Hãy tự đặt câu hỏi cho bạn, khi bắt đầu lập trình, bạn nghĩ tới điều gì? Đi phỏng vấn Điều đầu tiên tôi muốn nói về những câu hỏ...
ShinaBR2 viết 3 tháng trước
30 8
Bài viết liên quan
White
3 0
Bài viết này sẽ giới thiệu về phân vùng bảng và chỉ mục trong Oracle Database. Phân vùng giải quyết vấn đề quan trọng trong việc hỗ trợ các bảng r...
Dương Đức Đạt viết hơn 1 năm trước
3 0
White
22 4
Tạo dummy data với Faker và Mockaroo – Xa rồi những ngày nhập tay nhàm chán Cuộc đời một thằng developer có rất nhiều việc rất chán nhưng phải làm...
Huy Hoàng Phạm viết hơn 2 năm trước
22 4
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
10 bài viết.
88 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!