2017-10-17 81 views
3

我想同時查詢兩個表(幾乎)相同的行。其結果是,我想要得到的5個最近條目(按日期排序,在總),無論從哪個表他們從MYSQL:聯合查詢2表很慢,如何提高?

到目前爲止,我嘗試這樣做:

SELECT date, name, text FROM `table_A` 
UNION 
SELECT date, name, text FROM `table_B` ORDER BY date desc LIMIT 5 

不幸的是,這查詢大約需要20秒(兩個表都有〜300.000行)。

當我只是做:

SELECT date, name, text FROM `table_A` ORDER BY date desc LIMIT 5 

SELECT date, name, text FROM `table_B` ORDER BY date desc LIMIT 5 

查詢只需幾毫秒。

所以我的問題是:我該如何改進我的查詢更快或選擇查詢應該用什麼來從兩個表中獲取5個最新的行?

回答

4

在組合它們之前,請在每個表中選擇最近的5行。

SELECT * 
FROM (
    (SELECT date, name, text FROM table_A ORDER BY date DESC LIMIT 5) 
    UNION 
    (SELECT date, name, text FROM table_B ORDER BY date DESC LIMIT 5) 
) x 
ORDER BY date DESC 
LIMIT 5 

您的查詢的問題是,它首先合併整個表並刪除重複項,然後再進行排序和限制。合併表沒有索引,因此該部分很慢。

+0

嘿,謝謝,但這給了我錯誤#1248:每個派生表都必須有自己的別名。有什麼建議麼? – knzo

+0

我已添加缺少的別名 – Barmar