mysql優化 - MySQL中使用UNION進行兩表合并,去重導致效率低下,請問如何優化?
問題描述
如下SQL語句在MySQL中執行需要2秒左右的時間,如果使用UNION ALL進行不去重合并只需要0.4秒,UNION ALL配合DISTINCT來去重速度又變成2秒了,請問如何進行優化?
SELECT a. KEY, a. DATA, a.date_addedFROM (( SELECTCONCAT(’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_addedFROM `cf_affiliate_activity` aa ) ) aORDER BY a.date_added DESCLIMIT 0, 5;
問題解答
回答1:看你寫的語句key前綴不一樣永遠不會有重復啊,直接union all
回答2:當然先是使用QEP
mysql> explain select * from wp_options limit 1G;*************************** 1. row *************************** id: 1 select_type: SIMPLEtable: wp_options partitions: NULL type: ALLpossible_keys: NULL key: NULL key_len: NULL ref: NULL rows: 136 filtered: 100.00Extra: NULL1 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)
至于每個字段的具體含義,自己查資料。
回答3:@prolifes 是對的。也許題主沒表述清楚。
我補充另外一個思路,因為你最后只需要5條數據,從ca中取5條,再從aa中取5條,總共10條排序,這個會很快。
SELECT a. KEY, a. DATA, a.date_addedFROM (( SELECTCONCAT(’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_addedFROM `cf_affiliate_activity` aaORDER BY a.date_added DESC /* 如果date_added有索引的話,這個會比較快 */ LIMIT 0,5 ) ) aORDER BY a.date_added DESCLIMIT 0, 5;
