Xem Cách MySQL sử dụng chỉ mục .
Đồng thời xác thực xem MySQL vẫn thực hiện quét toàn bộ bảng sau khi bạn thêm khoảng hơn 2000 hàng vào user_metrics
của mình bàn. Trong các bảng nhỏ, truy cập theo chỉ mục thực sự đắt hơn (I / O-khôn ngoan) hơn 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 ngược với bài đăng trước của tôi , hóa ra MySQL cũng đang sử dụng trình tối ưu hóa dựa trên chi phí
, đó là một tin rất tốt - nghĩa là bạn chạy ANALYZE
của mình í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 của bạn khi kích thước của chúng tăng hơn 10-15%. (Theo mặc định, Postgres sẽ tự động thực hiện việc này cho bạn, trong khi các RDBMS khác sẽ giao trách nhiệm này cho 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ề lượng I / O (và các tài nguyên liên quan khác, chẳng hạn như CPU, cần thiết, ví dụ:để phân loại) sẽ tham gia khi lựa chọn giữa các kế hoạch thực thi ứng viên khác nhau. Không thể chạy ANALYZE
có thể dẫn đến các quyết định lập kế hoạch rất kém, đôi khi là tai hại (ví dụ:các truy vấn mili giây, đôi khi, hàng giờ do các vòng lặp lồng nhau không hợp lệ trên JOIN
s.)
Nếu hiệu suất vẫn không đạt yêu cầu sau khi chạy ANALYZE
, thì bạn thường 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ụ: lỗi cũ hơn này , điều này có thể khiến bạn khó chịu nếu bạn sử dụng nested_set
của Rails ).
Bây giờ, vì bạn đang ở trong ứng dụng Rails , nó sẽ cồng kềnh (và đánh bại mục đích của ActiveRecord
) để đưa ra các truy vấn tùy chỉnh của bạn với các gợi ý thay vì tiếp tục sử dụng ActiveRecord
-được tạo ra.
Tôi đã đề cập đến điều đó trong ứng dụng Rails của chúng tôi tất cả SELECT
các truy vấn giảm xuống dưới 100ms sau khi chuyển sang Postgres, trong khi một số liên kết phức tạp được tạo bởi ActiveRecord
Đôi khi sẽ mất đến 15 giây hoặc hơn với MySQL 5.1 do các vòng lặp lồng nhau với các lần quét bảng bên trong, ngay cả khi có sẵn các chỉ mục. 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 bị khóa. Tuy nhiên, điều này nằm ngoài phạm vi vấn đề của bạn.