簡體   English   中英

SQL 查詢性能提升

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM