Có thể mỗi kết nối đang thực hiện quét toàn bộ bảng của profiles
. Hãy cố gắng tránh điều đó. Khi có hàng tá truy vấn xuất hiện trên cùng một bảng, có những ổ khóa khiến InnoDB tự "vấp ngã". Một trong hai kế hoạch này sẽ vừa tăng tốc truy vấn vừa giảm số hàng được chạm vào (do đó giảm khóa). Việc sử dụng chỉ mục "tổng hợp" được đề xuất sẽ tăng tốc độ truy vấn. Nhưng OR
cản đường. Tôi thấy có hai thủ thuật để vẫn có chỉ mục xem uniquestring
, nhưng tránh một số hoặc tất cả OR
.
( (prfls.uniquestring like 'phk5600dcc%')
or (prfls.uniquestring like 'phk5600dcf%')
)
OR
khó tối ưu hóa.
Thêm cái này:
INDEX(isconnected, isprofilepresent, uniquestring)
Sau đó ...
Kế hoạch A:
prfls.uniquestring like 'phk5600dc%' AND -- note common prefix
( (prfls.uniquestring like 'phk5600dcc%')
or (prfls.uniquestring like 'phk5600dcf%')
)
Điều này giả định rằng bạn có thể tạo tiền tố chung đó.
Kế hoạch B (lần lượt OR
thành UNION
):
( SELECT ...
WHERE prfls.uniquestring like 'phk5600dcc%' AND ...
LIMIT 450 )
UNION ALL -- ? You may want DISTINCT, if there could be dups
( SELECT ...
WHERE prfls.uniquestring like 'phk5600dcf%' AND ... -- the only diff
LIMIT 450 )
LIMIT 450 -- yes, again
Kế hoạch A (nếu thiết thực) tận dụng lợi thế của những gì có vẻ như là một giá trị bắt đầu chung. Kế hoạch B hoạt động bất kể, nhưng có lẽ chậm hơn một chút, mặc dù vẫn nhanh hơn nhiều so với kế hoạch ban đầu.
Các lưu ý khác ...
Các chỉ mục trên cờ (trong đó bạn có hai cờ) hầu như không bao giờ được sử dụng. EXPLAIN SELECT ...
có thể sẽ cho thấy rằng cả hai đều không được sử dụng. Vui lòng cung cấp EXPLAIN
cho bất kỳ SELECT
nào điều đó cần thảo luận.
UNIQUE KEY
là một KEY
, vì vậy không cần chỉ mục dư thừa trên USERID
.
limit 450
- Bạn muốn 450 cái nào? Không có ORDER BY
, truy vấn được phép cung cấp cho bạn bất kỳ 450. (Tất nhiên, có lẽ điều đó cũng tốt.) (Và ORDER BY
có thể sẽ làm chậm truy vấn.)
Các đề xuất của tôi sẽ không "giải quyết" được vấn đề, nhưng chúng sẽ tăng số lượng kết nối trước khi sự chậm lại trở nên đáng chú ý.