首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL查询性能改进

SQL查询性能改进
EN

Stack Overflow用户
提问于 2021-02-23 09:08:09
回答 1查看 49关注 0票数 0

我想从两个带分页的表的联合中获得结果,目前我使用的是以下查询

代码语言:javascript
复制
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这里是使用EXIST的查询

代码语言:javascript
复制
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

联合的结果

代码语言:javascript
复制
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                                   |

存在的结果

代码语言:javascript
复制
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                                       |
EN

回答 1

Stack Overflow用户

发布于 2021-02-23 09:23:19

联合一切都比联合快。另外,如果将来需要使用WHERE子句,则必须巧妙地使用它,因为WHERE子句对union的结果是一个昂贵的查询。相反,您可以在内部查询中使用它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66330120

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档