2010-05-07 29 views
7

Tôi đã thành công trong quá khứ lưu trữ các kết quả xử lý cơ sở dữ liệu (mem) nặng nề, sử dụng thời gian cập nhật cuối cùng của (các) bảng bên dưới như một phần của khóa bộ nhớ cache. Đối với các bảng MyISAM, thời gian thay đổi lần cuối có sẵn trong SHOW TABLE STATUS. Thật không may, đó thường là NULL cho các bảng InnoDB.Làm cách nào để xác định khi nào bảng InnoDB được thay đổi lần cuối?

Trong MySQL 4.1, thời gian cho một InnoDB trong dòng SHOW TABLE STATUS thường là thời gian cập nhật cuối cùng thực tế, nhưng điều đó dường như không đúng đối với MySQL 5.1.

Có trường DATETIME trong bảng, nhưng nó chỉ hiển thị khi một hàng đã được sửa đổi - nó không thể hiển thị thời gian xóa của hàng không còn ở đó nữa! Vì vậy, tôi thực sự không thể sử dụng MAX(update_time).

Đây là phần thực sự phức tạp. Tôi có một số bản sao mà tôi đọc từ đó. Tôi có thể tìm ra trạng thái của bảng không phụ thuộc vào thời điểm các thay đổi đã thực sự được áp dụng không?

Kết luận của tôi sau khi làm việc này một lúc là không thể có được thông tin này với giá rẻ như tôi muốn. Tôi có thể sẽ lưu dữ liệu vào bộ nhớ cache cho đến khi tôi mong đợi bảng thay đổi (nó được cập nhật một lần một ngày) và để cho bộ nhớ cache truy vấn giúp đỡ nơi có thể.

Trả lời

8

Đây là MySQL bug 14374, 15438 và bên dưới InnoDB bug 2681.

Tôi có hai đề xuất (ngoài việc vá MySQL).

  1. Nếu bạn đang sử dụng một bảng cho mỗi tệp (innodb_file_per_table), hãy chỉ định tệp cơ bản. Bạn có thể viết một hàm/mở rộng của MySQL để làm điều này. Điều này có thể tụt hậu một chút, do bộ đệm ẩn cơ sở dữ liệu.
  2. Bạn có thể sử dụng sau khi cập nhật, xóa và chèn trình kích hoạt để giữ bảng siêu dữ liệu của riêng bạn với thời gian cập nhật cuối cùng cho mỗi bảng mà bạn quan tâm.

Cá nhân tôi đề xuất thứ hai, vì nó di động hơn nhiều và không phụ thuộc vào chi tiết triển khai (chẳng hạn như innodb_file_per_table).

+2

Hãy ghi nhớ nếu đi con đường 2.nd về InnoDB gây nên: "Lưu ý Hiện tại, các tác vụ khóa ngoại vi xếp tầng không kích hoạt trình kích hoạt". (từ [13.2.2.5. Ràng buộc KEY NGOÀI] (http://dev.mysql.com/doc/refman/5.6/en/innodb-foreign-key-constraints.html)) –

11

Nếu bạn không thực sự quan tâm khi cơ sở dữ liệu đã được thay đổi, nhưng muốn biết thời tiết hay không một bảng cơ sở dữ liệu đã được thay đổi, bạn nên nhìn vào MySQL CHECKSUM TABLE

Hope this helps.

+0

Tuyệt vời, chính xác những gì tôi cần! – astgtciv

-1

tôi sẽ đề nghị bổ sung thêm cột khác để bàn và để MySQL theo dõi khi bảng đã được sửa đổi lần cuối, một cái gì đó như thế này:

ADD COLUMN `last_update` TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL 
+0

Điều này chỉ hiển thị khi một hàng cụ thể được cập nhật. Trong khi bạn có thể làm một "SELECT MAX (last_update) FROM bảng", điều này có thể thêm một số tiền rất lớn của chi phí cho một bảng với một số lượng lớn các hàng chỉ để có được thời gian sửa đổi gần đây nhất –

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