Làm thế nào tôi có thể tối ưu hóa các truy vấn SQL của tôi, để bỏ qua những tình huống như thế này:counter_cache has_many_through sql tối ưu hóa, làm giảm số lượng các truy vấn SQL
Meeting.find (5) .users.size => SELECT COUNT (*) tỪ ... WHERE ...
User.find (123) .meetings.size => SELECT COUNT (*) FROM ... WHERE ...
tôi không có ý tưởng làm thế nào để sử dụng counter_cache ở đây.
Đây là mối quan hệ mô hình của tôi:
class Meeting < ActiveRecord::Base
has_many :meeting_users
has_many :users, :through => meeting_users
end
class User < ActiveRecord::Base
has_many :meeting_users
has_many :meetings, :through => meeting_users
end
class Meeting_user < ActiveRecord::Base
belongs_to :meeting
belongs_to :user
end
các giải pháp tối ưu nhất là gì?
Và cách thực hiện counter_cache tại đây?
Mọi thứ ở đây có ngăn cản bạn thực hiện điều gì đó như MeetingUser.where (: meeting_id => 5,: user_id => 123) .size cho cả hai trường hợp? Ít nhất trong trường hợp đó bạn sẽ có thể tận dụng bộ nhớ đệm truy vấn SQL. Việc thực thi mặc định của counter_cache sẽ không thực sự giúp bạn trong tình huống này. – jmcnevin
Tôi nghĩ bạn sai. counter_cache sẽ trợ giúp ở đây. Ví dụ: Khi bạn hiển thị danh sách người dùng trong chế độ xem và Bạn sẽ hiển thị trong mỗi dòng có bao nhiêu cuộc họp mà mỗi người dùng có? Với counter_cache đây sẽ là một truy vấn SQL, không có nó sẽ là 1 + n * Users.size – astropanic