如下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;
怪我咯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 秒)
各フィールドの具体的な意味については、ご自身で情報をご確認ください。
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;