Tôi có bảng như thế này2 khác nhau truy vấn nhỏ vs 1 truy vấn với subquery
name | personal_number
-----------------------------------------
Jon | 222
Alex | 555
Jon | 222
Jimmy | 999
tôi cần có được mọi danh hiệu, mà personal_number repeates trong bảng hơn 1, có nghĩa là kết quả phải:
Jon
Jon
Vì vậy, Variant 1):
SELECT name FROM mytable WHERE personal_number IN (
SELECT personal_number FROM mytable GROUP BY personal_number
HAVING COUNT(*) > 1
)
Variant 2):
SELECT personal_number FROM mytable GROUP BY personal_number
HAVING COUNT(*) > 1
)
Sau đó, sử dụng php, personal_numbers lấy tham gia như chuỗi (soemthing như '222', '222'
này) và chạy truy vấn khác
SELECT name FROM mytable WHERE personal_number IN(here joined string)
Biến thể 2 công trình khoảng 10 lần nhanh hơn, so với phiên bản 1, đây là sự ngạc nhiên đối với tôi, tôi đã suy nghĩ rằng một truy vấn sẽ nhanh hơn, nhưng ...
(Trong bảng là 500 000 dòng, cột personal_number
không lập chỉ mục)
Vì vậy, những gì bạn có nghĩa là về trường hợp như thế này? tại sao biến thể 2 nhanh hơn nhiều so với biến thể 1?
+1 cho câu hỏi hay và không hỏi trước khi chạy một số kiểm tra điểm chuẩn. – enenen
GIẢI THÍCH về hai truy vấn sẽ hiển thị số –
Nếu tên và số cá nhân phụ thuộc vào nhau, bạn nên mang bảng của bạn đến biểu mẫu bình thường thứ hai – Argeman