2013-06-07 27 views
5

Tôi có bảng MYSQL chỉ yêu cầu dữ liệu tối đa 30 ngày trước ngày đến ngày. Nó có dữ liệu có thể tối đa một vài năm sau ngày hôm nay. Để truy vấn nhanh hơn, tôi thường xóa các bản ghi cũ vì tôi không thấy điểm tìm kiếm thông qua các bản ghi cũ. Tuy nhiên, tôi vẫn duy trì một bản sao lưu các bản ghi nếu chúng tôi cần nó để phân tích. Bảng ban đầu là thế này:Xóa bản ghi cũ khỏi bảng mysql nhưng vẫn giữ bản sao lưu

CREATE TABLE featured_deal (
    id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, 
     fsa VARCHAR(10), 
     poster_id int(11), 
     dealid bigint(20), 
     bookedDate date, 
     createDate timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, 
    UNIQUE KEY `featured_unique`(fsa, bookedDate) 
    ) 

Và tôi có thể tạo một bảng mà là một bản sao của bảng này được gọi là lịch sử:

CREATE TABLE featured_deal_history (
      id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, 
       fsa VARCHAR(10), 
       poster_id int(11), 
       dealid bigint(20), 
       bookedDate date, 
       createDate timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, 
      UNIQUE KEY `featured_unique`(fsa, bookedDate) 
      ) 

Tôi có một kích hoạt để cư bảng lịch sử bất cứ khi nào một chèn xảy ra trên bảng gốc:

CREATE TRIGGER `featured_to_history` 
      AFTER INSERT ON lst_enmasse_featured_deal 
      FOR EACH ROW 
      INSERT INTO lst_enmasse_featured_deal_history (fsa,poster_id,dealid,bookedDate,createDate) 
      VALUES (NEW.fsa,NEW.poster_id,NEW.dealid,NEW.bookedDate,NEW.createDate) 

Cuối cùng, tôi lau bảng bằng cách sử dụng một công việc định kỳ và lệnh:

DELETE * FROM featured_deal WHERE bookedDate < DATE_SUB(CURDATE(), INTERVAL 30 DAY) 

Có cách nào tốt hơn để thực hiện tác vụ trên không? Tôi nghĩ về phân vùng MYSQL. Tuy nhiên, tôi không có một phân vùng cố định. Ngày thay đổi và do đó tôi cần hai phân vùng mới mỗi ngày.

Trả lời

1

Về nguyên tắc aproach của bạn là OK, tuy nhiên, khái niệm này được dựa trên ý tưởng rằng một bảng nhỏ hơn có hiệu suất cao hơn. Điều này cho thấy rằng các truy vấn của bạn đang chạy quét toàn bộ bảng so với dữ liệu - tức là bạn đã không định cấu hình các chỉ mục của mình một cách chính xác.

Tôi khuyên rằng điều đầu tiên bạn khắc phục là hiệu suất truy vấn của bạn.

Nếu bạn vẫn cần lưu giữ dữ liệu trong bảng dữ liệu nóng, bạn nên tìm cách chèn bất kỳ chèn nào vào bảng lịch sử dưới dạng thao tác hàng loạt KHÔNG phải một hàng tại một thời điểm - điều này sẽ giữ cho bảng và chỉ mục trong trạng thái khỏe mạnh tiểu bang. Điều này có thể được thực hiện trong một hoạt động hàng loạt theo đề nghị của Cristian, hoặc bạn có thể sử dụng một phương pháp ngẫu nhiên (với một biến trạng thái trong bảng nguồn). ví dụ. một cái gì đó như ...

AFTER INSERT ON mytable 
IF (0.95<RAND()) THEN 
    UPDATE mytable SET control=CONNECTION_ID() 
    WHERE control IS NULL; 
    INSERT INTO backuptable (...) 
    SELECT .... FROM mytable 
    WHERE control=CONNECTION_ID(); 
    UPDATE mytable SET control=-1 
    WHERE control=CONNECTION_ID(); 
END IF; 

Một xem xét thêm nữa là bạn tạo id mới khi bạn viết vào bảng lịch sử: tại sao?

+0

Tôi thực sự đã xóa id mới khỏi bảng lịch sử vì nó không phục vụ mục đích. –

0

Tôi sẽ làm cho nó đơn giản hơn. Tạo một cron hàng ngày thực hiện hai truy vấn này với "TODAY_DATE":

create table if not exists featured_deal_new like featured_deal 
rename table featured_deal to featured_deal_history_TODAY_DATE, featured_deal_new to featured_deal 

Điều gì sẽ xảy ra: (đổi tên bảng rất nhanh). Bạn sẽ có một bảng lịch sử cho mỗi ngày.

Hãy thoải mái kết hợp các bảng lịch sử sau đó

insert into featured_deal_history... select * from featured_deal_history_TODAY_DATE

Drop table featured_deal_history_TODAY_DATE 

Bằng cách này bạn không thực hiện lỏng lẻo trên chèn trong bảng chính.

Các vấn đề liên quan