Xem How MySQL Uses Indexes.
Đồng thời xác thực xem liệu MySQL vẫn thực hiện một full table scan sau khi bạn thêm một hàng bổ sung 2000 vào bảng user_metrics
của mình. Trong các bảng nhỏ, truy cập theo chỉ mục thực sự đắt hơn (I/O-wise) so với quét bảng và trình tối ưu hóa của MySQL có thể tính đến điều này.
Trái với bài trước của tôi, nó chỉ ra rằng MySQL cũng là using a cost-based optimizer, đó là tin rất tốt - có nghĩa là, với điều kiện bạn chạy bạn ANALYZE
ít nhất một lần khi bạn tin rằng khối lượng dữ liệu trong cơ sở dữ liệu của bạn là đại diện sử dụng hàng ngày trong tương lai.
Khi xử lý các trình tối ưu hóa dựa trên chi phí (Oracle, Postgres, v.v.), bạn cần đảm bảo chạy định kỳ ANALYZE
trên các bảng khác nhau khi kích thước của chúng tăng hơn 10-15%. (Postgres sẽ tự động làm điều này cho bạn, theo mặc định, trong khi các RDBMS khác sẽ để lại trách nhiệm này cho một DBA, tức là bạn.) Thông qua phân tích thống kê, ANALYZE
sẽ giúp trình tối ưu hóa hiểu rõ hơn về I/O (và các liên kết khác) tài nguyên, chẳng hạn như CPU, cần thiết, ví dụ như để sắp xếp) sẽ được tham gia khi lựa chọn giữa các kế hoạch thực thi ứng cử viên khác nhau. Thất bại trong việc chạy ANALYZE
có thể dẫn đến những quyết định lên kế hoạch rất kém, đôi khi thảm hại (ví dụ như millisecond-truy vấn lấy, đôi khi, giờ vì vòng lồng nhau xấu trên JOIN
s.)
Nếu hiệu suất là vẫn không đạt yêu cầu sau khi chạy ANALYZE
, sau đó bạn thường sẽ có thể giải quyết vấn đề bằng cách sử dụng các gợi ý, ví dụ FORCE INDEX
, trong khi trong các trường hợp khác, bạn có thể gặp phải lỗi MySQL (ví dụ: older one, có thể đã cắn bạn là bạn sử dụng Rails 'nested_set
).
Bây giờ, kể từ khi bạn đang ở trong một ứng dụng Rails, nó sẽ được cồng kềnh (và đánh bại các mục đích của ActiveRecord
) phát hành các truy vấn tùy chỉnh của bạn với những gợi ý thay vì tiếp tục sử dụng ActiveRecord
những -generated.
tôi đã đề cập rằng trong ứng dụng Rails của chúng tôi tất cảSELECT
truy vấn giảm xuống dưới 100ms sau khi chuyển sang Postgres, trong khi một số khu phức hợp tham gia tạo ra bởi ActiveRecord
thỉnh thoảng sẽ mất càng nhiều càng 15s hoặc nhiều hơn với MySQL 5.1 vì vòng lồng nhau với quét bảng bên trong, ngay cả khi chỉ mục có sẵn. Không có trình tối ưu hóa nào là hoàn hảo và bạn nên biết các tùy chọn. Các vấn đề hiệu suất tiềm năng khác cần lưu ý, ngoài việc tối ưu hóa kế hoạch truy vấn, đang khóa. Điều này nằm ngoài phạm vi của vấn đề của bạn mặc dù.
Ý của bạn là gì? Chúng có phải là hằng số, cột hoặc biến không? Đó là quan trọng. – Quassnoi
Xin lỗi, những người đã được dán từ đầu ra của plugin query_reviewer của tôi. Các truy vấn thực tế có số nguyên ở đó - tức là. IN (25, 26, 27) – jasonlong
@blackant: bạn có chạy phân tích trên các bảng của mình không? – vladr