Mục tiêu phụ của tôi với bài viết này là giúp bạn quyết định xem Node. js + MySQL phù hợp với nhu cầu của bạn và để cung cấp trợ giúp triển khai giải pháp như vậy
Bạn có thể tìm thấy mã thực tế mà chúng tôi sẽ sử dụng trong suốt bài đăng trên blog này trên GitHub
Tại sao nút. js và MySQL?
Chúng tôi sử dụng MySQL để lưu trữ dữ liệu theo dõi phân tán của người dùng trên Nút của chúng tôi. js Công cụ theo dõi và gỡ lỗi được gọi là Trace
Chúng tôi chọn MySQL, vì tại thời điểm quyết định, Postgres không thực sự giỏi trong việc cập nhật hàng, trong khi đối với chúng tôi, việc cập nhật dữ liệu bất biến sẽ phức tạp một cách vô lý. Hầu hết mọi người đều nghĩ rằng nếu ai đó có hàng triệu/tỷ hàng thì nên sử dụng giải pháp NoSQL như Cassandra hoặc Mongo
Rất tiếc, các giải pháp này không tuân thủ ACID khiến chúng khó sử dụng khi tính nhất quán của dữ liệu là vô cùng quan trọng
Tuy nhiên, với việc lập chỉ mục tốt và lập kế hoạch phù hợp, MySQL có thể phù hợp với nhiệm vụ như các giải pháp thay thế NoSQL đã đề cập ở trên
MySQL có một số công cụ lưu trữ. InnoDB là ứng dụng mặc định, có nhiều tính năng nhất. Tuy nhiên, người ta nên tính đến việc các bảng InnoDB là bất biến, nghĩa là mọi câu lệnh
ALTER TABLE tbl
REORGANIZE PARTITION future INTO [
from20170517 VALUES LESS THAN [TO_DAYS['2017-05-18']],
from20170518 VALUES LESS THAN [TO_DAYS['2017-05-19']],
PARTITION future VALUES LESS THAN MAXVALUE
];
1 sẽ sao chép tất cả dữ liệu vào một bảng mới. Nó sẽ làm cho vấn đề trở nên tồi tệ hơn khi có nhu cầu di chuyển một cơ sở dữ liệu đã tồn tạiNếu bạn có các giá trị danh nghĩa, mỗi giá trị có nhiều dữ liệu liên quan — e. g. mỗi người dùng của bạn có hàng triệu sản phẩm và bạn có rất nhiều người dùng — có lẽ cách dễ nhất là tạo bảng cho từng người trong số họ và đặt tên cho họ như
ALTER TABLE tbl
REORGANIZE PARTITION future INTO [
from20170517 VALUES LESS THAN [TO_DAYS['2017-05-18']],
from20170518 VALUES LESS THAN [TO_DAYS['2017-05-19']],
PARTITION future VALUES LESS THAN MAXVALUE
];
2. Bằng cách này, bạn có thể giảm đáng kể kích thước của các bảng riêng lẻNgoài ra, việc xóa dữ liệu của người dùng trong trường hợp xóa tài khoản là thao tác O[1]. Điều này rất quan trọng, bởi vì nếu bạn cần xóa một lượng lớn giá trị khỏi các bảng lớn, MySQL có thể quyết định sử dụng chỉ mục sai hoặc hoàn toàn không sử dụng chỉ mục.
Việc bạn không thể sử dụng gợi ý chỉ mục cho
ALTER TABLE tbl
REORGANIZE PARTITION future INTO [
from20170517 VALUES LESS THAN [TO_DAYS['2017-05-18']],
from20170518 VALUES LESS THAN [TO_DAYS['2017-05-19']],
PARTITION future VALUES LESS THAN MAXVALUE
];
3s cũng chẳng ích gì. Bạn có thể cần phải ALTER TABLE tbl
REORGANIZE PARTITION future INTO [
from20170517 VALUES LESS THAN [TO_DAYS['2017-05-18']],
from20170518 VALUES LESS THAN [TO_DAYS['2017-05-19']],
PARTITION future VALUES LESS THAN MAXVALUE
];
4 bảng của mình để xóa dữ liệu, nhưng điều đó có nghĩa là sao chép từng hàng sang một bảng mớiTạo bảng cho mỗi người dùng rõ ràng làm tăng thêm độ phức tạp, nhưng nó có thể là một chiến thắng lớn khi loại bỏ người dùng hoặc các thực thể tương tự với lượng dữ liệu liên quan khổng lồ
Tuy nhiên, trước khi sử dụng các bảng được tạo động, bạn nên thử xóa các hàng theo khối vì nó cũng có thể hữu ích và dẫn đến ít phức tạp hơn. Tất nhiên, nếu bạn có dữ liệu đến nhanh hơn mức bạn có thể xóa, bạn có thể gặp khó khăn với giải pháp đã nói ở trên
Nhưng điều gì sẽ xảy ra nếu các bảng của bạn vẫn còn rất lớn sau khi phân vùng chúng theo người dùng và bạn cũng cần xóa các hàng đã lỗi thời? . Trong trường hợp này, bạn nên thử tính năng phân vùng bảng tích hợp sẵn của MySQL. Nó rất hữu ích khi bạn cần cắt các bảng của mình theo các giá trị được xác định theo thang thứ tự hoặc liên tục, chẳng hạn như dấu thời gian tạo
Phân vùng bảng với MySQL
Với MySQL, một bảng được phân vùng sẽ hoạt động như thể nó là nhiều bảng, nhưng bạn có thể sử dụng cùng một giao diện mà bạn đã quen, trong khi không cần logic bổ sung từ phía ứng dụng. Điều này cũng có nghĩa là bạn có thể loại bỏ các phân vùng như thể bạn loại bỏ các bảng
Tài liệu này rất hay, nhưng cũng khá dài dòng [xét cho cùng, đây không phải là một chủ đề đơn giản], vì vậy, hãy xem nhanh cách bạn nên tạo một bảng được phân vùng
Cách chúng tôi xử lý các phân vùng của mình được lấy từ bài đăng của Rick James về chủ đề này. Anh ấy cũng đưa ra một số thông tin chi tiết về cách bạn nên lập kế hoạch cho các bảng của mình
CREATE TABLE IF NOT EXISTS tbl [
id INTEGER NOT NULL AUTO_INCREMENT,
data VARCHAR[255] NOT NULL,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY [id, created_at]
]
PARTITION BY RANGE [TO_DAYS[created_at]] [
start VALUES LESS THAN [0],
from20170514 VALUES LESS THAN [TO_DAYS['2017-05-15']],
from20170515 VALUES LESS THAN [TO_DAYS['2017-05-16']],
from20170516 VALUES LESS THAN [TO_DAYS['2017-05-17']],
future VALUES LESS THAN MAXVALUE
];
Không có gì bất thường cho đến phần
ALTER TABLE tbl
REORGANIZE PARTITION future INTO [
from20170517 VALUES LESS THAN [TO_DAYS['2017-05-18']],
from20170518 VALUES LESS THAN [TO_DAYS['2017-05-19']],
PARTITION future VALUES LESS THAN MAXVALUE
];
5Trong MySQL, bạn có thể phân vùng theo ________ 06, ________ 07, ________ 08, ________ 09 và
ALTER TABLE tbl
REORGANIZE PARTITION future INTO [
from20170517 VALUES LESS THAN [TO_DAYS['2017-05-18']],
from20170518 VALUES LESS THAN [TO_DAYS['2017-05-19']],
PARTITION future VALUES LESS THAN MAXVALUE
];
00 bạn có thể đọc về chúng trong tài liệu. Lưu ý rằng khóa phân vùng phải là một phần của khóa chính hoặc bất kỳ chỉ mục duy nhất nàoNhững cái bắt đầu bằng
ALTER TABLE tbl
REORGANIZE PARTITION future INTO [
from20170517 VALUES LESS THAN [TO_DAYS['2017-05-18']],
from20170518 VALUES LESS THAN [TO_DAYS['2017-05-19']],
PARTITION future VALUES LESS THAN MAXVALUE
];
01 nên dễ hiểu. Mỗi phân vùng chứa các giá trị mà cột ALTER TABLE tbl
REORGANIZE PARTITION future INTO [
from20170517 VALUES LESS THAN [TO_DAYS['2017-05-18']],
from20170518 VALUES LESS THAN [TO_DAYS['2017-05-19']],
PARTITION future VALUES LESS THAN MAXVALUE
];
02 nhỏ hơn ngày của ngày hôm sau. Điều này cũng có nghĩa là ALTER TABLE tbl
REORGANIZE PARTITION future INTO [
from20170517 VALUES LESS THAN [TO_DAYS['2017-05-18']],
from20170518 VALUES LESS THAN [TO_DAYS['2017-05-19']],
PARTITION future VALUES LESS THAN MAXVALUE
];
03 chứa tất cả dữ liệu cũ hơn 2012-04-15, vì vậy đây là phân vùng mà chúng tôi sẽ loại bỏ khi thực hiện dọn dẹpPhân vùng
ALTER TABLE tbl
REORGANIZE PARTITION future INTO [
from20170517 VALUES LESS THAN [TO_DAYS['2017-05-18']],
from20170518 VALUES LESS THAN [TO_DAYS['2017-05-19']],
PARTITION future VALUES LESS THAN MAXVALUE
];
04 và ALTER TABLE tbl
REORGANIZE PARTITION future INTO [
from20170517 VALUES LESS THAN [TO_DAYS['2017-05-18']],
from20170518 VALUES LESS THAN [TO_DAYS['2017-05-19']],
PARTITION future VALUES LESS THAN MAXVALUE
];
05 cần được giải thích. ALTER TABLE tbl
REORGANIZE PARTITION future INTO [
from20170517 VALUES LESS THAN [TO_DAYS['2017-05-18']],
from20170518 VALUES LESS THAN [TO_DAYS['2017-05-19']],
PARTITION future VALUES LESS THAN MAXVALUE
];
04 giữ các giá trị cho những ngày chúng tôi chưa xác định. Vì vậy, nếu chúng tôi không thể chạy phân vùng lại kịp thời, thì tất cả dữ liệu đến vào ALTER TABLE tbl
REORGANIZE PARTITION future INTO [
from20170517 VALUES LESS THAN [TO_DAYS['2017-05-18']],
from20170518 VALUES LESS THAN [TO_DAYS['2017-05-19']],
PARTITION future VALUES LESS THAN MAXVALUE
];
07 hoặc muộn hơn sẽ kết thúc ở đó, đảm bảo rằng chúng tôi không bị mất bất kỳ dữ liệu nào. ALTER TABLE tbl
REORGANIZE PARTITION future INTO [
from20170517 VALUES LESS THAN [TO_DAYS['2017-05-18']],
from20170518 VALUES LESS THAN [TO_DAYS['2017-05-19']],
PARTITION future VALUES LESS THAN MAXVALUE
];
05 cũng đóng vai trò như một mạng lưới an toàn. Chúng tôi hy vọng tất cả các hàng có giá trị ALTER TABLE tbl
REORGANIZE PARTITION future INTO [
from20170517 VALUES LESS THAN [TO_DAYS['2017-05-18']],
from20170518 VALUES LESS THAN [TO_DAYS['2017-05-19']],
PARTITION future VALUES LESS THAN MAXVALUE
];
09 ALTER TABLE tbl
REORGANIZE PARTITION future INTO [
from20170517 VALUES LESS THAN [TO_DAYS['2017-05-18']],
from20170518 VALUES LESS THAN [TO_DAYS['2017-05-19']],
PARTITION future VALUES LESS THAN MAXVALUE
];
02, tuy nhiên, chúng tôi cần chuẩn bị cho các lỗi có thể xảy ra. Nếu vì lý do nào đó, một hàng kết thúc bằng ALTER TABLE tbl
REORGANIZE PARTITION future INTO [
from20170517 VALUES LESS THAN [TO_DAYS['2017-05-18']],
from20170518 VALUES LESS THAN [TO_DAYS['2017-05-19']],
PARTITION future VALUES LESS THAN MAXVALUE
];
11 ở đó, thì nó sẽ kết thúc ở phân vùng ALTER TABLE tbl
REORGANIZE PARTITION future INTO [
from20170517 VALUES LESS THAN [TO_DAYS['2017-05-18']],
from20170518 VALUES LESS THAN [TO_DAYS['2017-05-19']],
PARTITION future VALUES LESS THAN MAXVALUE
];
05 , đây là dấu hiệu cho thấy chúng tôi cần thực hiện một số sửa lỗiKhi bạn sử dụng phân vùng, MySQL sẽ giữ dữ liệu đó trên các phần riêng biệt của đĩa như thể chúng là các bảng riêng biệt và tự động sắp xếp dữ liệu của bạn dựa trên khóa phân vùng
Có một số hạn chế được đưa vào tài khoản mặc dù
- Bộ đệm truy vấn không được hỗ trợ
- Khóa ngoại không được hỗ trợ cho các bảng InnoDB được phân vùng
- Các bảng được phân vùng không hỗ trợ các chỉ mục hoặc tìm kiếm FULLTEXT
Còn rất nhiều thứ nữa, nhưng đây là những thứ mà chúng tôi cảm thấy hạn chế nhất sau khi áp dụng các bảng được phân vùng tại RisingStack
Nếu bạn muốn tạo một phân vùng mới, bạn cần sắp xếp lại một phân vùng hiện có và chia nhỏ nó để phù hợp với nhu cầu của bạn
ALTER TABLE tbl
REORGANIZE PARTITION future INTO [
from20170517 VALUES LESS THAN [TO_DAYS['2017-05-18']],
from20170518 VALUES LESS THAN [TO_DAYS['2017-05-19']],
PARTITION future VALUES LESS THAN MAXVALUE
];
Bỏ phân vùng mất một bảng thay đổi, nhưng nó chạy như thể bạn bỏ một bảng
ALTER TABLE tbl
REORGANIZE PARTITION future INTO [
from20170517 VALUES LESS THAN [TO_DAYS['2017-05-18']],
from20170518 VALUES LESS THAN [TO_DAYS['2017-05-19']],
PARTITION future VALUES LESS THAN MAXVALUE
];
0Như bạn có thể thấy, bạn phải bao gồm tên thực và mô tả của các phân vùng trong các câu lệnh. Chúng không thể được tạo động bởi MySQL, vì vậy bạn phải xử lý nó trong logic ứng dụng. Đó là những gì chúng tôi sẽ đề cập tiếp theo
Ví dụ phân vùng bảng với Node. js & MySQL
Hãy xem giải pháp thực tế. Đối với các ví dụ ở đây, chúng tôi sẽ sử dụng knex, một trình tạo truy vấn cho JavaScript. Trong trường hợp bạn đã quen thuộc với SQL, bạn sẽ không gặp vấn đề gì khi hiểu mã
Đầu tiên, hãy tạo bảng
ALTER TABLE tbl
REORGANIZE PARTITION future INTO [
from20170517 VALUES LESS THAN [TO_DAYS['2017-05-18']],
from20170518 VALUES LESS THAN [TO_DAYS['2017-05-19']],
PARTITION future VALUES LESS THAN MAXVALUE
];
1Thực tế nó giống như câu lệnh mà chúng ta đã thấy trước đó, nhưng chúng ta phải tạo tên và mô tả của các phân vùng một cách linh hoạt. Đó là lý do tại sao chúng tôi tạo ra phương thức
ALTER TABLE tbl
REORGANIZE PARTITION future INTO [
from20170517 VALUES LESS THAN [TO_DAYS['2017-05-18']],
from20170518 VALUES LESS THAN [TO_DAYS['2017-05-19']],
PARTITION future VALUES LESS THAN MAXVALUE
];
13 Hàng đầu tiên là
ALTER TABLE tbl
REORGANIZE PARTITION future INTO [
from20170517 VALUES LESS THAN [TO_DAYS['2017-05-18']],
from20170518 VALUES LESS THAN [TO_DAYS['2017-05-19']],
PARTITION future VALUES LESS THAN MAXVALUE
];
7ALTER TABLE tbl
REORGANIZE PARTITION future INTO [
from20170517 VALUES LESS THAN [TO_DAYS['2017-05-18']],
from20170518 VALUES LESS THAN [TO_DAYS['2017-05-19']],
PARTITION future VALUES LESS THAN MAXVALUE
];
14 tạo một chuỗi từ 5 đến -2 [không bao gồm giá trị cuối cùng] -> ALTER TABLE tbl
REORGANIZE PARTITION future INTO [
from20170517 VALUES LESS THAN [TO_DAYS['2017-05-18']],
from20170518 VALUES LESS THAN [TO_DAYS['2017-05-19']],
PARTITION future VALUES LESS THAN MAXVALUE
];
15, sau đó chúng tôi trừ các giá trị này khỏi thời điểm hiện tại và tạo tên của phân vùng [ALTER TABLE tbl
REORGANIZE PARTITION future INTO [
from20170517 VALUES LESS THAN [TO_DAYS['2017-05-18']],
from20170518 VALUES LESS THAN [TO_DAYS['2017-05-19']],
PARTITION future VALUES LESS THAN MAXVALUE
];
16] và giới hạn của nó [ALTER TABLE tbl
REORGANIZE PARTITION future INTO [
from20170517 VALUES LESS THAN [TO_DAYS['2017-05-18']],
from20170518 VALUES LESS THAN [TO_DAYS['2017-05-19']],
PARTITION future VALUES LESS THAN MAXVALUE
];
17]. Thứ tự rất quan trọng vì MySQL đưa ra lỗi nếu các giá trị để phân vùng không tăng liên tục trong câu lệnhVí dụ xóa dữ liệu quy mô lớn với MySQL và Node. js
Bây giờ chúng ta hãy từng bước xem xét việc xóa dữ liệu. Bạn có thể xem toàn bộ mã tại đây
Phương thức đầu tiên,
ALTER TABLE tbl
REORGANIZE PARTITION future INTO [
from20170517 VALUES LESS THAN [TO_DAYS['2017-05-18']],
from20170518 VALUES LESS THAN [TO_DAYS['2017-05-19']],
PARTITION future VALUES LESS THAN MAXVALUE
];
18 lấy danh sách các phân vùng hiện tại rồi chuyển nó cho ALTER TABLE tbl
REORGANIZE PARTITION future INTO [
from20170517 VALUES LESS THAN [TO_DAYS['2017-05-18']],
from20170518 VALUES LESS THAN [TO_DAYS['2017-05-19']],
PARTITION future VALUES LESS THAN MAXVALUE
];
19ALTER TABLE tbl
REORGANIZE PARTITION future INTO [
from20170517 VALUES LESS THAN [TO_DAYS['2017-05-18']],
from20170518 VALUES LESS THAN [TO_DAYS['2017-05-19']],
PARTITION future VALUES LESS THAN MAXVALUE
];
4Trước tiên, chúng tôi chọn tất cả các phân vùng hiện có từ bảng
ALTER TABLE tbl
REORGANIZE PARTITION future INTO [
from20170517 VALUES LESS THAN [TO_DAYS['2017-05-18']],
from20170518 VALUES LESS THAN [TO_DAYS['2017-05-19']],
PARTITION future VALUES LESS THAN MAXVALUE
];
70 được duy trì bởi MySQLSau đó, chúng tôi tạo tất cả các phân vùng sẽ tồn tại cho bảng. Nếu
ALTER TABLE tbl
REORGANIZE PARTITION future INTO [
from20170517 VALUES LESS THAN [TO_DAYS['2017-05-18']],
from20170518 VALUES LESS THAN [TO_DAYS['2017-05-19']],
PARTITION future VALUES LESS THAN MAXVALUE
];
71 là tập hợp các phân vùng tồn tại và ALTER TABLE tbl
REORGANIZE PARTITION future INTO [
from20170517 VALUES LESS THAN [TO_DAYS['2017-05-18']],
from20170518 VALUES LESS THAN [TO_DAYS['2017-05-19']],
PARTITION future VALUES LESS THAN MAXVALUE
];
72 là tập hợp các phân vùng nên tồn tại thìALTER TABLE tbl
REORGANIZE PARTITION future INTO [
from20170517 VALUES LESS THAN [TO_DAYS['2017-05-18']],
from20170518 VALUES LESS THAN [TO_DAYS['2017-05-19']],
PARTITION future VALUES LESS THAN MAXVALUE
];
73ALTER TABLE tbl
REORGANIZE PARTITION future INTO [
from20170517 VALUES LESS THAN [TO_DAYS['2017-05-18']],
from20170518 VALUES LESS THAN [TO_DAYS['2017-05-19']],
PARTITION future VALUES LESS THAN MAXVALUE
];
74ALTER TABLE tbl
REORGANIZE PARTITION future INTO [
from20170517 VALUES LESS THAN [TO_DAYS['2017-05-18']],
from20170518 VALUES LESS THAN [TO_DAYS['2017-05-19']],
PARTITION future VALUES LESS THAN MAXVALUE
];
75 tạo tập hợp ALTER TABLE tbl
REORGANIZE PARTITION future INTO [
from20170517 VALUES LESS THAN [TO_DAYS['2017-05-18']],
from20170518 VALUES LESS THAN [TO_DAYS['2017-05-19']],
PARTITION future VALUES LESS THAN MAXVALUE
];
72CREATE TABLE IF NOT EXISTS tbl [
id INTEGER NOT NULL AUTO_INCREMENT,
data VARCHAR[255] NOT NULL,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY [id, created_at]
]
PARTITION BY RANGE [TO_DAYS[created_at]] [
start VALUES LESS THAN [0],
from20170514 VALUES LESS THAN [TO_DAYS['2017-05-15']],
from20170515 VALUES LESS THAN [TO_DAYS['2017-05-16']],
from20170516 VALUES LESS THAN [TO_DAYS['2017-05-17']],
future VALUES LESS THAN MAXVALUE
];
2Việc tạo các đối tượng phân vùng khá giống với việc tạo câu lệnh
ALTER TABLE tbl
REORGANIZE PARTITION future INTO [
from20170517 VALUES LESS THAN [TO_DAYS['2017-05-18']],
from20170518 VALUES LESS THAN [TO_DAYS['2017-05-19']],
PARTITION future VALUES LESS THAN MAXVALUE
];
77 . Điều quan trọng nữa là kiểm tra xem phân vùng chúng ta sắp tạo có cũ hơn phân vùng cũ nhất hiện tại không. có thể chúng tôi cần thay đổi ALTER TABLE tbl
REORGANIZE PARTITION future INTO [
from20170517 VALUES LESS THAN [TO_DAYS['2017-05-18']],
from20170518 VALUES LESS THAN [TO_DAYS['2017-05-19']],
PARTITION future VALUES LESS THAN MAXVALUE
];
78 theo thời gianLấy kịch bản này làm ví dụ
Hãy tưởng tượng rằng người dùng của bạn bắt đầu với 7 ngày lưu giữ dữ liệu nhưng có tùy chọn nâng cấp lên 10 ngày. Ban đầu, người dùng có các phân vùng bao gồm các ngày theo thứ tự sau.
79. Sau khoảng một tháng, người dùng quyết định nâng cấp. Các phân vùng bị thiếu trong trường hợp này.ALTER TABLE tbl REORGANIZE PARTITION future INTO [ from20170517 VALUES LESS THAN [TO_DAYS['2017-05-18']], from20170518 VALUES LESS THAN [TO_DAYS['2017-05-19']], PARTITION future VALUES LESS THAN MAXVALUE ];
40ALTER TABLE tbl REORGANIZE PARTITION future INTO [ from20170517 VALUES LESS THAN [TO_DAYS['2017-05-18']], from20170518 VALUES LESS THAN [TO_DAYS['2017-05-19']], PARTITION future VALUES LESS THAN MAXVALUE ];
Khi dọn dẹp, tập lệnh hiện tại sẽ cố gắng sắp xếp lại phân vùng
04 cho các phân vùng bị thiếu nối thêm chúng sau phân vùng hiện tạiALTER TABLE tbl REORGANIZE PARTITION future INTO [ from20170517 VALUES LESS THAN [TO_DAYS['2017-05-18']], from20170518 VALUES LESS THAN [TO_DAYS['2017-05-19']], PARTITION future VALUES LESS THAN MAXVALUE ];
Việc tạo phân vùng cho các ngày cũ hơn -7 ngay từ đầu không có ý nghĩa gì vì dù sao thì dữ liệu đó cũng được dự định sẽ bị loại bỏ và nó cũng sẽ dẫn đến một danh sách phân vùng trông giống như
42 không tăng lên một cách đơn điệu, do đóALTER TABLE tbl REORGANIZE PARTITION future INTO [ from20170517 VALUES LESS THAN [TO_DAYS['2017-05-18']], from20170518 VALUES LESS THAN [TO_DAYS['2017-05-19']], PARTITION future VALUES LESS THAN MAXVALUE ];
Hàm
ALTER TABLE tbl
REORGANIZE PARTITION future INTO [
from20170517 VALUES LESS THAN [TO_DAYS['2017-05-18']],
from20170518 VALUES LESS THAN [TO_DAYS['2017-05-19']],
PARTITION future VALUES LESS THAN MAXVALUE
];
43 của MySQL tính toán số ngày đã trôi qua kể từ năm 0 ngày 1 tháng 1, vì vậy chúng tôi sao chép hàm này trong JavaScriptALTER TABLE tbl
REORGANIZE PARTITION future INTO [
from20170517 VALUES LESS THAN [TO_DAYS['2017-05-18']],
from20170518 VALUES LESS THAN [TO_DAYS['2017-05-19']],
PARTITION future VALUES LESS THAN MAXVALUE
];
0Bây giờ chúng ta có các phân vùng phải loại bỏ và các phân vùng phải được tạo, trước tiên hãy tạo phân vùng mới cho ngày mới
ALTER TABLE tbl
REORGANIZE PARTITION future INTO [
from20170517 VALUES LESS THAN [TO_DAYS['2017-05-18']],
from20170518 VALUES LESS THAN [TO_DAYS['2017-05-19']],
PARTITION future VALUES LESS THAN MAXVALUE
];
1Chúng tôi chỉ cần chuẩn bị một câu lệnh cho [các] phân vùng mới được tạo
Chúng tôi chạy tập lệnh này hàng giờ chỉ để đảm bảo không có gì sai sót và chúng tôi có thể thực hiện việc dọn dẹp đúng cách ít nhất một lần một ngày
Vì vậy, điều đầu tiên cần kiểm tra là liệu có phân vùng nào được tạo không. Điều này chỉ xảy ra ở lần chạy đầu tiên, sau đó là 23 lần một ngày
Chúng tôi cũng phải loại bỏ các phân vùng lỗi thời
ALTER TABLE tbl
REORGANIZE PARTITION future INTO [
from20170517 VALUES LESS THAN [TO_DAYS['2017-05-18']],
from20170518 VALUES LESS THAN [TO_DAYS['2017-05-19']],
PARTITION future VALUES LESS THAN MAXVALUE
];
2Phương thức này tạo câu lệnh
ALTER TABLE tbl
REORGANIZE PARTITION future INTO [
from20170517 VALUES LESS THAN [TO_DAYS['2017-05-18']],
from20170518 VALUES LESS THAN [TO_DAYS['2017-05-19']],
PARTITION future VALUES LESS THAN MAXVALUE
];
44 giống như chúng ta đã thấy trước đóVà cuối cùng, mọi thứ đã sẵn sàng cho việc tổ chức lại
ALTER TABLE tbl
REORGANIZE PARTITION future INTO [
from20170517 VALUES LESS THAN [TO_DAYS['2017-05-18']],
from20170518 VALUES LESS THAN [TO_DAYS['2017-05-19']],
PARTITION future VALUES LESS THAN MAXVALUE
];
0gói nó lên
Như bạn có thể thấy, trái ngược với niềm tin phổ biến, các giải pháp DBMS tuân thủ ACID như MySQL có thể được sử dụng khi bạn đang xử lý một lượng lớn dữ liệu, vì vậy bạn không nhất thiết phải từ bỏ các tính năng của cơ sở dữ liệu giao dịch
Tuy nhiên, việc phân vùng bảng đi kèm với khá nhiều hạn chế, nghĩa là bạn không thể sử dụng tất cả sức mạnh mà InnoDB cung cấp để giữ cho dữ liệu của bạn nhất quán. Bạn cũng có thể phải xử lý trong logic ứng dụng những gì khác sẽ có sẵn, chẳng hạn như ràng buộc khóa ngoại hoặc tìm kiếm toàn văn
Tôi hy vọng bài đăng này giúp bạn quyết định xem MySQL có phù hợp với nhu cầu của bạn hay không và giúp bạn triển khai giải pháp của mình. Cho đến lần sau. kỹ thuật vui vẻ