検索

ホームページ  >  に質問  >  本文

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

如下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;

大家讲道理大家讲道理2836日前814

全員に返信(3)返信します

  • 天蓬老师

    天蓬老师2017-04-17 14:50:54

    作成したステートメントのキー プレフィックスが異なるかどうかを確認します。重複はなく、すべて結合するだけです。

    返事
    0
  • 怪我咯

    怪我咯2017-04-17 14:50:54

    もちろん、最初に QEP を使用してください

    mysql>explain select * from wp_options limit 1\G;
    **************************** 1. 行 ******************** * *******
               ID:1
      select_type: シンプル
            テーブル: wp_options
       パーティション: NULL
             タイプ: すべて
    可能なキー: NULL
              キー: NULL
          キー長: NULL
              参照: NULL
             行: 136
         フィルタ済み: 100.00
            追加: NULL
    セット内の 1 行、1 つの警告 (0.01 秒)
    
    mysql> 'Handler_read%' のようなセッション ステータスを表示します。
    +----------------------+----------+
    変数名 | 値 |
    +----------------------+----------+
    | ハンドラー_読み取り_最初 |
    | ハンドラー読み取りキー 3 |
    | ハンドラー_読み取り_最後 |
    | ハンドラー_読み取り_次 |
    | ハンドラー_読み取り_前 |
    | ハンドラー読み取り_rnd |
    209 | ハンドラー読み取り_rnd_next |
    +-----------------------+-------+
    セット内の 7 行 (0.01 秒)

    各フィールドの具体的な意味については、ご自身で情報をご確認ください。

    返事
    0
  • PHP中文网

    PHP中文网2017-04-17 14:50:54

    @prolifes が正しいです。もしかしたら質問者さんが明確に表現していないのかもしれません。

    別のアイデアを追加します。最終的に必要なデータは 5 個だけです。ca から 5 個を取り出し、次に aa から 5 個を取り出し、合計 10 個のデータを並べ替える必要があります。これは非常に手間がかかります。速い。

    SELECT
        キー、
        a.データ、
        a.date_added
    から
        (
            (
                選択
                    CONCAT('customer_', ca. KEY) AS `key`、
                    約データ、
                    ca.date_added
                から
                    `cf_customer_activity` ca
                注文方法
                    a.date_added DESC /* date_added にインデックスがある場合、これは高速になります */
                リミット0,5
            )
            すべてを結合する
                (
                    選択
                        CONCAT('affiliate_', aa.KEY) AS `key`,
                        ああ、データ、
                        aa.date_added
                    から
                        `cf_affiliate_activity` aa
                    注文方法
                        a.date_added DESC /* date_added にインデックスがある場合、これは高速になります */
                    リミット0,5
                )
        )
    注文方法
        a.date_added DESC
    LIMIT 0、5;

    返事
    0
  • キャンセル返事