Bảng Tombstone vs Cờ đã xóa trong kịch bản đồng bộ hóa cơ sở dữ liệu & xóa mềm


17

Tôi cần theo dõi các mục đã xóa cho nhu cầu đồng bộ hóa máy khách.

Nói chung, tốt hơn là thêm bảng bia mộ và trình kích hoạt theo dõi khi một hàng bị xóa khỏi cơ sở dữ liệu máy chủ - về cơ bản thêm một hàng mới vào bảng mộ với dữ liệu từ mục đã xóa - hoặc để giữ các mục trong bảng gốc và gắn cờ chúng là đã xóa, thông thường với một cột loại bit, để chỉ ra rằng một hàng bị xóa và một cột khác để theo dõi khi xảy ra xóa?

Câu trả lời:


17

Nói chung, tốt hơn là nên biết các yêu cầu cụ thể và không đưa ra quyết định thiết kế dựa trên những gì hoạt động tốt nhất trong hầu hết các tình huống. Hoặc là có thể thích hợp hơn. Dưới đây là một số chi tiết cụ thể để thu thập:

  • Làm thế nào nhanh chóng để xóa cần phải được?
  • Làm thế nào nhanh chóng để xóa không cần phải được?
  • Tần suất xóa dữ liệu sẽ được truy vấn và nó sẽ được truy vấn với dữ liệu chưa bị xóa?
  • Làm thế nào nhanh chóng các truy vấn của dữ liệu bị xóa cần phải được?
  • Bạn có cần chỉ bảo quản các mục đã bị xóa hoặc thay đổi không?
  • Bạn có cần giữ bảng / chỉ mục trên bảng chính nhỏ không?
  • Những công nghệ phân vùng và / hoặc thay đổi theo dõi nào có sẵn trên nền tảng cơ sở dữ liệu?
  • Có bao nhiêu dung lượng đĩa trống?
  • Việc xóa sẽ xảy ra khi đang bay hoặc trong các hoạt động hàng loạt?

Tôi thấy, đó là vấn đề đánh đổi giữa các yêu cầu hệ thống khác nhau. Nếu tôi cần xóa / xóa nhanh, cờ sẽ thích hợp hơn, nhưng nếu tôi cần truy vấn nhanh trên các mục đã xóa và trên bảng chính và có thể tôi cần theo dõi bất kỳ loại thay đổi nào, cách tiếp cận bia mộ có thể tốt hơn.
Lorenzo Polidori

Bạn đã nhận nó. Thậm chí có thể có trường hợp tùy chọn khác sẽ thích hợp hơn. Ví dụ: nếu bạn chỉ cần các phần mềm xóa có sẵn trong 24 giờ, trong Oracle, bạn có thể xem xét đặt thời gian lưu giữ được bảo đảm và sau đó sử dụng truy vấn hồi tưởng để xem dữ liệu đã xóa.
Leigh Riffel

5

Có lẽ bạn nên kết hợp hai phương pháp trên mục đích. Tại sao ???

Hãy sử dụng bảng đó (phương ngữ MySQL)

CREATE TABLE mydata
(
    id int not null auto_increment
    firstname varchar(16) not null,
    lastname varchar(16) not null,
    zipcode char(5) not null,
    ...
    deleted tinyint not null default 0
    KEY (deleted,id),
    KEY (deleted,lastname,firstname,id),
    KEY (deleted,zipcode,id),
    KEY (lastname,firstname),
    KEY (zipcode),
    PRIMARY KEY (id)
);

Xin lưu ý rằng, ngoại trừ KHÓA CHÍNH, mọi chỉ số bạn thực hiện phải được đi trước bởi deleted cờ và kết thúc bằng dấu id.

Hãy tạo bảng bia mộ

CREATE TABLE mytomb SELECT id FROM mydata WHERE 1=2;
ALTER TABLE mytomb ADD PRIMARY KEY (id);

Nếu bảng của bạn đã có deleted cờ, bạn có thể điền vào bảng tommstone

INSERT INTO mytomb SELECT id FROM mydata WHERE deleted = 1;

OK bây giờ dữ liệu và bia mộ được chuẩn bị. Làm thế nào để bạn thực hiện xóa?

Giả sử bạn đang xóa mọi người trong mã zip 07305. Bạn sẽ chạy như sau:

INSERT IGNORE INTO mytomb SELECT id FROM mydata WHERE deleted=0 AND zipcode='07305';
UPDATE mydata SET deleted=1 WHERE deleted=0 AND zipcode='07305';

OK điều này có vẻ như rất nhiều chi phí cho dù bạn nhìn nó như thế nào.

Bây giờ, bạn có muốn xem tất cả các dữ liệu đã xóa? Đây là hai cách khác nhau:

  • SELECT * FROM mydata WHERE deleted=1;
  • SELECT B.* FROM mytomb A INNER JOIN mydata B USING (id);

Nếu số lượng id trong mytomb lớn hơn 5% số lượng hàng của mydata, thì đó là quét toàn bộ bảng. Mặt khác, quét chỉ mục với một tra cứu cho mỗi hàng. Lưu ý bất kỳ điểm chuẩn trong các khía cạnh này. Tra cứu các kế hoạch giải thích.

Bây giờ, bạn có muốn nhìn thấy mọi người trong mã zip 07304 không? Đây là hai cách khác nhau:

  • SELECT * FROM mydata WHERE deleted=1 AND zipcode='07304';
  • SELECT A.* FROM mydata A LEFT JOIN mytomb B USING (id) WHERE B.id IS NULL AND A.zipcode='07304'

Làm thế nào về xóa hàng loạt? Đây là hai cách khác nhau:

  • DELETE FROM mydata WHERE deleted=1;
  • DELETE B.* FROM mytomb A INNER JOIN mydata B USING (id); DELETE FROM mytomb;

PHẦN KẾT LUẬN

Bây giờ, tôi không nói để giữ cả hai phương pháp. Làm điều này theo thời gian cho thấy phương pháp nào nhanh hơn về khả năng hoạt động tổng thể. Bạn phải quyết định điểm chuẩn nào để truy vấn dữ liệu trực tiếp, truy vấn dữ liệu đã xóa và xóa hàng loạt hoạt động tốt nhất cho bạn.


Có một lợi thế để sử dụng cả hai kỹ thuật, trên cơ sở liên tục? Hoặc bạn đang đề xuất chỉ sử dụng chúng song song để đánh giá hiệu suất, và sau đó cam kết với cái này hay cái khác?
Jon của tất cả các giao dịch
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.