2016-02-19 13 views
5

Tôi có truy vấn này, mà là một truy vấn duy nhất có chứa 3 lựa chọn trong tổng số:kết quả Tái sử dụng từ một truy vấn SELECT đơn trong MySQL

SELECT a 
FROM tbl 
WHERE b IN ((SELECT a FROM tbl WHERE b = 44)) 
AND NOT a IN ((SELECT a FROM tbl WHERE b = 44)) 

Truy vấn

SELECT a FROM table WHERE b = 44 

là giống hệt nhau, và tôi đoán rằng cơ sở dữ liệu đang chạy 2 lần này, mặc dù nó sẽ nhanh hơn lần thứ hai do bộ nhớ đệm, v.v.

Có cách nào trong SQL hoặc một cái gì đó cụ thể cho MySQL mà tôi có thể làm o sử dụng lại 100% kết quả từ câu trả lời đầu tiên được thực hiện?

Hoặc bất kỳ ý tưởng nào khác về cách tăng tốc truy vấn này?

Tôi đang sử dụng MySQL 5.7.

Trả lời

0

Save đầu tiên CHỌN bảng tạm thời sau đó sử dụng nó để chạy truy vấn thứ hai:

SELECT a, b 
INTO #temtbl 
FROM tbl 
WHERE b IN ((SELECT a FROM tbl WHERE b = 44)) 
AND NOT a IN ((SELECT a FROM tbl WHERE b = 44)) 

SELECT a,b FROM #temtbl WHERE b = 44 
2

Tránh các truy vấn phụ và sử dụng tham gia (mà nên sử dụng các chỉ mục và có hiệu quả hơn).

SELECT tbl1.a 
FROM tbl tbl1 
INNER JOIN tbl tbl2 ON tbl1.b = tbl2.a AND tbl2.b = 44 
LEFT OUTER JOIN tbl tbl3 ON tbl1.a = tbl3.a AND tbl3.b = 44 
WHERE tbl3.a IS NULL 

Tùy thuộc vào việc bạn có thể nhận nhiều kết quả trùng khớp khi tham gia thì bạn có thể cần sử dụng DISTINCT sau SELECT.

+0

trình! Nó gần như là 2x chậm hơn so với bản gốc của tôi mặc dù .. mặc dù cả a và b có chỉ mục. Đó có phải là các cuộc tham gia có chi phí nhiều không? – Niklas9

+0

Các tham gia thường nhanh hơn nhiều so với sử dụng các truy vấn phụ. Bạn có thể đăng lên bảng của bạn tuyên bố và giải thích về truy vấn? Bạn có chỉ số bao gồm BOTH a và b? – Kickstart

+0

Chắc chắn, tạo ra ý chính này cho giải thích - https://gist.github.com/Niklas9/5dd08c4d6b3b7b029365 Không, chỉ mục cho a và b riêng biệt. @Kickstart – Niklas9

0

Tại sao bạn không thể làm:

SELECT tbl1.a 
FROM tbl AS t1 
INNER JOIN tbl AS t2 ON t1.b = t.a AND t2.b = 44 
WHERE t1.b <> 44 
Các vấn đề liên quan