1 Câu hỏi: ActiveRecord tăng tốc truy vấn `where.not`

câu hỏi được tạo ra tại Wed, May 8, 2019 12:00 AM

Tôi có một truy vấn đang bị chậm lại đáng kể khi một mệnh đề not được thêm vào truy vấn.

# query is 13.6ms
FbGroupApplication.select(
:fb_id
).group(:fb_id
).having('count(fb_id) <= 6'
)


# 3,468ms with `where.not` clause. the array is large (5-10k)
FbGroupApplication.where.not(
fb_id: ids
).select(:fb_id
).group(:fb_id
).having('count(fb_id) <= 6'
)

Tôi đã thêm một chỉ mục vào fb_id. Tuy nhiên, một điều cần lưu ý là đó là trường văn bản và các giá trị là khoảng 12 chuỗi ký tự số

Làm cách nào tôi có thể tăng tốc truy vấn này?

    
0
  1. Làm thế nào để bạn xác định id nào sẽ bao gồm trong mảng? Chúng luôn giống nhau hay nó sẽ phụ thuộc?
    2019-05-08 16: 12: 00Z
  2. @ CarlosAlvesJorge luôn khác nhau. đã kết thúc việc so sánh các id trong ruby ​​và nó nhanh hơn nhiều
    2019-05-08 18: 29: 30Z
1 Câu trả lời                              1                         

Giả sử rằng các id là biến và do số lượng lớn chúng, tôi đoán cách tiếp cận tốt nhất của bạn sẽ là tạo một bảng tạm thời và chèn các id bạn muốn loại trừ ở đó.

Sau đó truy vấn bằng LEFT THAM GIA, CHỌN các id không tồn tại trên bảng tạm thời và DROP bảng sau đó

    
0
2019-05-08 16: 17: 47Z
  1. Cũng đáng để đảm bảo các ID đó được đặt làm khóa chính hoặc được tăng thêm bằng chỉ số UNIQUE.
    2019-05-08 16: 21: 23Z
  2. cảm ơn. đã kết thúc việc so sánh các id trong ruby ​​và nó nhanh hơn nhiều
    2019-05-08 18: 29: 14Z
nguồn đặt đây