MySQL
Bạn sẽ có hiệu suất tốt nhất nếu bạn quên mệnh đề where và đặt tất cả các điều kiện trong biểu thức ON.
Tôi nghĩ điều này là do truy vấn trước tiên phải tham gia các bảng sau đó chạy mệnh đề where trên đó, vì vậy nếu bạn có thể giảm những gì được yêu cầu để tham gia thì đó là cách nhanh nhất để có kết quả / thực hiện udpate.
Thí dụ
Kịch bản
Bạn có một bảng người dùng. Họ có thể đăng nhập bằng tên người dùng hoặc email hoặc account_number. Các tài khoản này có thể hoạt động (1) hoặc không hoạt động (0). Bảng này có 50000 hàng
Sau đó, bạn có một bảng người dùng để vô hiệu hóa cùng một lúc vì bạn phát hiện ra tất cả họ đã làm điều gì đó tồi tệ. Tuy nhiên, bảng này có một cột với tên người dùng, email và số tài khoản được trộn lẫn. Nó cũng có một chỉ báo "has_run" cần được đặt thành 1 (true) khi nó được chạy
Truy vấn
UPDATE users User
INNER JOIN
blacklist_users BlacklistUser
ON
(
User.username = BlacklistUser.account_ref
OR
User.email = BlacklistedUser.account_ref
OR
User.phone_number = BlacklistUser.account_ref
AND
User.is_active = 1
AND
BlacklistUser.has_run = 0
)
SET
User.is_active = 0,
BlacklistUser.has_run = 1;
Lý luận
Nếu chúng ta phải tham gia chỉ với các điều kiện HOẶC thì về cơ bản, nó sẽ cần kiểm tra mỗi hàng 4 lần để xem nó có nên tham gia không và có khả năng trả về nhiều hàng hơn nữa không. Tuy nhiên, bằng cách cung cấp cho nó nhiều điều kiện hơn, nó có thể "bỏ qua" rất nhiều hàng nếu chúng không đáp ứng tất cả các điều kiện khi tham gia.
Tặng kem
Nó dễ đọc hơn. Tất cả các điều kiện ở một nơi và các hàng để cập nhật ở một nơi