MySQL中使用UNION进行两表合并,去重导致效率低下,请问如何优化?

发布于 2022-09-02 19:36:35 字数 707 浏览 23 评论 0

如下SQL语句在MySQL中执行需要2秒左右的时间,如果使用UNION ALL进行不去重合并只需要0.4秒,UNION ALL配合DISTINCT来去重速度又变成2秒了,请问如何进行优化?

SELECT
    a. KEY,
    a. DATA,
    a.date_added
FROM
    (
        (
            SELECT
                CONCAT('customer_', ca. KEY) AS `key`,
                ca. DATA,
                ca.date_added
            FROM
                `cf_customer_activity` ca
        )
        UNION
            (
                SELECT
                    CONCAT('affiliate_', aa. KEY) AS `key`,
                    aa. DATA,
                    aa.date_added
                FROM
                    `cf_affiliate_activity` aa
            )
    ) a
ORDER BY
    a.date_added DESC
LIMIT 0,
 5;

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

稳稳的幸福 2022-09-09 19:36:35

看你写的语句key前缀不一样永远不会有重复啊,直接union all

别再吹冷风 2022-09-09 19:36:35

@prolifes 是对的。也许题主没表述清楚。

我补充另外一个思路,因为你最后只需要5条数据,从ca中取5条,再从aa中取5条,总共10条排序,这个会很快。

SELECT
    a. KEY,
    a. DATA,
    a.date_added
FROM
    (
        (
            SELECT
                CONCAT('customer_', ca. KEY) AS `key`,
                ca. DATA,
                ca.date_added
            FROM
                `cf_customer_activity` ca
            ORDER BY 
                a.date_added DESC /* 如果date_added有索引的话,这个会比较快 */ 
            LIMIT 0,5
        )
        UNION ALL
            (
                SELECT
                    CONCAT('affiliate_', aa. KEY) AS `key`,
                    aa. DATA,
                    aa.date_added
                FROM
                    `cf_affiliate_activity` aa
                ORDER BY 
                    a.date_added DESC /* 如果date_added有索引的话,这个会比较快 */ 
                LIMIT 0,5
            )
    ) a
ORDER BY
    a.date_added DESC
LIMIT 0, 5;
满身野味 2022-09-09 19:36:35

当然先是使用QEP

mysql> explain select * from wp_options limit 1\G;
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: wp_options
   partitions: NULL
         type: ALL
possible_keys: NULL
          key: NULL
      key_len: NULL
          ref: NULL
         rows: 136
     filtered: 100.00
        Extra: NULL
1 row in set, 1 warning (0.01 sec)

mysql> show session status like 'Handler_read%';
+-----------------------+-------+
| Variable_name         | Value |
+-----------------------+-------+
| Handler_read_first    | 3     |
| Handler_read_key      | 3     |
| Handler_read_last     | 0     |
| Handler_read_next     | 0     |
| Handler_read_prev     | 0     |
| Handler_read_rnd      | 0     |
| Handler_read_rnd_next | 209   |
+-----------------------+-------+
7 rows in set (0.01 sec)

至于每个字段的具体含义,自己查资料。

神爱温柔 2022-09-09 19:36:35
SELECT
        CONCAT('customer_', ca. KEY) AS `key`,
        ca. DATA,
        ca.date_added
    FROM
        `cf_customer_activity` ca
UNION
        SELECT
            CONCAT('affiliate_', aa. KEY) AS `key`,
            aa. DATA,
            aa.date_added
        FROM
            `cf_affiliate_activity` aa
        ORDER BY
            a.date_added DESC
        LIMIT 0, 5;

这个语句不是这样写就可以了吗?要distinct就去相应的子句distinct。order by 会给整个结果集排序,union 会对结果集自动去重,只是在这条语句里没有意义

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文