2016-12-31 30 views
1

我有兩個巨大的表,需要執行以下查詢。表authors_1(約20M行)和authors_2(約120M行)都具有相同的結構。我已經完成了我的研究並提出了以下查詢和表結構。查詢仍然需要很長時間(通常在10到20秒之間)。在兩個聯合(UNION ALL)巨大表中改進SELECT性能

下面是查詢:

SELECT `fname`, `lname` 
FROM (
    SELECT `fname`, `lname` 
    FROM `authors_1` 
    WHERE 1 AND `lname` LIKE 'AR%' 
    UNION ALL 
    SELECT `fname`, `lname` 
    FROM `authors_2` 
    WHERE 1 AND `lname` LIKE 'AR%') `a` 
GROUP BY CONCAT(`fname`, `lname`) 
ORDER BY `lname` 
LIMIT 0, 999; 

,這是結構中,這是兩個表(該FT索引對於其他查詢)類似。

CREATE TABLE `scipers_authors` (
`a_id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
`linker` varchar(255) COLLATE utf8_persian_ci NOT NULL, 
`fname` tinytext COLLATE utf8_persian_ci NOT NULL, /*Should this be tinytext because of FT index or I can use VARCHAR(255) while having FT index?*/ 
`lname` tinytext COLLATE utf8_persian_ci NOT NULL, /*Same for this one*/ 
PRIMARY KEY (`a_id`), 
UNIQUE KEY `linker` (`linker`) USING BTREE, 
KEY `lname_4` (`lname`(4)) USING BTREE, 
KEY `name` (`lname`(128),`fname`(128)) USING BTREE, 
FULLTEXT KEY `fname` (`fname`), 
FULLTEXT KEY `lname` (`lname`), 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_persian_ci; 

這是EXPLAIN輸出上面顯示的示例查詢(我不知道如何使它美麗like others,我使用PMA):

1 PRIMARY <derived2> ALL     476968 Using temporary; Using filesort 
2 DERIVED authors_1 range lname_4,name,lname name 386  184800 Using where 
3 UNION authors_2 range lname_4,name,lname name 386  292168 Using where 
    UNION RESULT <union2,3> ALL      Using temporary 

任何建議,以改善該查詢/結構?

+0

我不認爲你需要'lname_4'索引,因爲它是'name'索引的前綴。注意'name'索引被用來代替。有多少行滿足'LIKE'標準? – Barmar

+1

更改** GROUP BY CONCAT('fname','lname')**到** GROUP BY'fname','lname' **然後mysql可以使用索引(如果有的話) –

+0

+1表示'我已經完成了我的研究,並提出了......在*之前開展研究*總是一個好兆頭':-)'。並且還展示了一個'EXPLAIN'。 – Martin

回答

2

嘗試將GROUP BY CONCAT(fname, lname)更改爲GROUP BY fname, lname。做所有這些連接是額外的工作,這是不必要的。

這兩者之間唯一的語義區別是,如果有兩個人的名字和姓氏不同,但它們在連接時是相同的,例如,弗雷達史密斯和弗雷德阿斯密斯。這樣的組合可能不太可能,我懷疑你真的希望它們首先被合併爲一個結果。

而且如果你用同一套你選擇列的分組,你可以簡單地使用

SELECT DISTINCT fname, lname 

你也可以使用UNION DISTINCT代替UNION ALL,因爲你想要刪除重複。那麼您不需要在外部查詢中進行分組或DISTINCT

+0

對於使用'UNION DISTINCT'的建議+1。應該清楚的是,如果你這樣做,不需要做'GROUP BY'或'SELECT DISTINCT'。 –

+0

謝謝,我已將它從「也」改爲「改爲」並添加了更多解釋。 – Barmar

+0

@Barmar,我測試了你提出的解決方案。它確實提高了執行時間(從53秒到25秒 - 基於PMA顯示時間),但仍需要很長時間。有什麼地方需要改進嗎? – SAVAFA