2012-01-06 43 views
22

Tôi có một cơ sở dữ liệu được sử dụng để thống kê, với hơn 2000 bảng, mỗi bảng có ~ 100 triệu hàng.tối ưu hóa và kiểm tra bảng mysql

Tôi nghĩ rằng một vài lần một tuần sẽ tốt hơn nếu bạn kiểm tra các bảng để đảm bảo chúng khỏe mạnh, và nếu không, hãy sửa chữa và tối ưu hóa chúng.

60% các bảng được cập nhật hàng ngày và phần còn lại là các bản lưu trữ.

Câu hỏi của tôi là về check(repair)/optimize: Bạn có thể kiểm tra sức khỏe của bảng và tối ưu hóa chúng một vài lần trong tuần để đảm bảo hệ thống chạy trơn tru?

+0

Các bảng được cập nhật hàng ngày: Có phải họ MyISAM hoặc InnoDB ??? – RolandoMySQLDBA

Trả lời

24

Nói chung, bạn cần để tối ưu hóa bảng khi datafile của nó là quá nhiều phân mảnh trên đĩa (các công cụ sử dụng cho hệ thống tập tin của bạn để kiểm tra - kịch bản liên quan bởi GiantRobot không tính toán phân mảnh), khi có nhiều hàng được cập nhật và thay đổi kích thước của chúng (có thể tạo ra phân đoạn hàng) hoặc sau khi xóa nhiều bản ghi khi bạn sẽ không thêm lại chúng sớm. Bởi vì không gian trống được MySQL sử dụng cho các hàng mới, khi các bản ghi đã xóa và mới có cùng kích thước hàng, không cần OPTIMIZE.

CHECK TABLE chỉ được sử dụng khi bạn nghi ngờ tham nhũng dữ liệu (không nên xảy ra trong khi chạy bình thường). Một số bản phân phối Linux (ví dụ Debian) có các kịch bản khởi động chạy CHECK TABLE cho tất cả các bảng khởi động máy chủ MySQL. REPAIR TABLE sau đó được sử dụng để sửa chữa các bảng bị hỏng.

BẢNG ANALYZE có thể được sử dụng để cập nhật cardinality chỉ mục, được sử dụng để xác định kế hoạch thực hiện truy vấn. Thông thường nó là cần thiết chỉ trong trường hợp đặc biệt.

Nó không phải là rõ ràng từ câu hỏi của bạn như thế nào là bảng thống kê của bạn được sử dụng ... bao nhiêu viết, xóa và đọc? Bảng thống kê của tôi đã viết tất cả các thời gian, và một lần một ngày nó được đọc, dữ liệu hợp nhất và ghi vào bảng khác, sau đó xóa. Trong trường hợp này, không cần chạy OPTIMIZE vì dữ liệu không được đọc thường xuyên và không gian trống được sử dụng lại cho dữ liệu mới. Tôi đang sử dụng phân vùng theo ngày, vì vậy thay vì xóa các bản ghi (mà là khá chậm), tôi chỉ DROP PARTITION (mất tối đa 1 giây)

0

2000 bảng và 100 triệu hàng trông rất lớn! nếu bạn cố gắng tối ưu hóa mỗi bảng vài lần một tuần, trong khi tối ưu hóa, các bảng sẽ bị khóa để bạn không thể viết các bảng đó cho đến khi bạn hoàn thành công việc đây là một tập lệnh chỉ kiểm tra các bảng bị phân mảnh (% 60) của các bảng của bạn có thể) và chỉ tối ưu hóa các bảng bị phân mảnh, hãy cho chúng tôi biết nếu nó hoạt động.

Lưu ý: Tôi không thể kiểm tra tập lệnh vì tôi sử dụng máy tính Windows cho dự án hiện tại của mình. Đọc các ý kiến ​​và ghi chú bên dưới kịch bản cho các liên kết tôi cung cấp

Optimize only fragmented tables in MySQL

0

Sửa chữa rất chậm với các bảng lớn; bạn có lẽ nên tránh các bảng rất lớn, đặc biệt là với rất nhiều chỉ mục, với MyISAM. Ưu tiên phân vùng chúng để giảm thời gian sửa chữa. Điều này có thể yêu cầu thay đổi lớn đối với mã ứng dụng của bạn.

Bạn cũng có thể thấy vấn đề với sửa chữa here

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