[英]SQL Query performance improvement
我想從兩個帶有分頁的表的聯合中獲取結果,目前我正在使用以下查詢
SELECT * FROM
(SELECT Clients .id, Clients.Name
FROM Clients
INNER JOIN ClientPolicies ON ClientPolicies .client_id = Clients .id
UNION
SELECT c.id,c.Name
FROM ClientGroupPolicies cgp
JOIN `Groups` g ON g.id = cgp.client_group_id
JOIN GroupClients gc ON g.id = gc.groupId
JOIN Clients c ON c.id = gc.clientId) AS tb
LIMIT 0,100
我得到了正確的結果,但可以在單個查詢中完成或提高它的性能。 任何幫助將不勝感激。
UPDATE HERE 是 EXIST 的查詢
SELECT
c2.id,
c2.user
FROM
Clients c2
WHERE
EXISTS(
SELECT
ClientPolicies.client_id
FROM
ClientPolicies
WHERE
ClientPolicies .client_id = c2.id )
or EXISTS (
SELECT
gc.clientId
FROM
ClientGroupPolicies cgp
JOIN Groups g on
g.id = cgp.client_group_id
JOIN GroupClients gc on
g.id = gc.groupId
WHERE
gc.clientId = c2.id )
LIMIT 0,
10
與聯合的結果
id|select_type |table |partitions|type |possible_keys |key |key_len|ref |rows|filtered|Extra |
--|------------|--------------|----------|------|----------------|---------|-------|----------------------------|----|--------|--------------------------------------------------|
1|PRIMARY |<derived2> | |ALL | | | | | 14| 100.0| |
2|DERIVED |ClientPolicies| |index |client_FK |client_FK|5 | | 8| 100.0|Using where; Using index |
2|DERIVED |Clients | |eq_ref|PRIMARY |PRIMARY |4 |sdp.ClientPolicies.client_id| 1| 100.0| |
3|UNION |cgp | |ALL | | | | | 2| 100.0|Using where |
3|UNION |g | |eq_ref|PRIMARY |PRIMARY |4 |sdp.cgp.client_group_id | 1| 100.0|Using index |
3|UNION |gc | |ALL |clientId,groupId| | | | 3| 100.0|Using where; Using join buffer (Block Nested Loop)|
3|UNION |c | |eq_ref|PRIMARY |PRIMARY |4 |sdp.gc.clientId | 1| 100.0| |
|UNION RESULT|<union2,3> | |ALL | | | | | | |Using temporary |
存在的結果
id|select_type |table |partitions|type |possible_keys |key |key_len|ref |rows|filtered|Extra |
--|------------------|--------------|----------|------|----------------|---------|-------|--------------|----|--------|--------------------------------------------------|
1|PRIMARY |c2 | |ALL | | | | | 159| 100.0|Using where |
3|DEPENDENT SUBQUERY|gc | |ref |clientId,groupId|clientId |4 |sdp.c2.id | 1| 100.0| |
3|DEPENDENT SUBQUERY|g | |eq_ref|PRIMARY |PRIMARY |4 |sdp.gc.groupId| 1| 100.0|Using index |
3|DEPENDENT SUBQUERY|cgp | |ALL | | | | | 2| 50.0|Using where; Using join buffer (Block Nested Loop)|
2|DEPENDENT SUBQUERY|ClientPolicies| |ref |client_FK |client_FK|5 |sdp.c2.id | 1| 100.0|Using index |
UNION ALL 比 UNION 快。 此外,如果您將來需要使用 WHERE 子句,則必須巧妙地使用它,因為聯合結果上的 WHERE 子句是一個昂貴的查詢。 相反,您可以在內部查詢中使用它
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.