我有兩個巨大的表,需要執行以下查詢。表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
任何建議,以改善該查詢/結構?
我不認爲你需要'lname_4'索引,因爲它是'name'索引的前綴。注意'name'索引被用來代替。有多少行滿足'LIKE'標準? – Barmar
更改** GROUP BY CONCAT('fname','lname')**到** GROUP BY'fname','lname' **然後mysql可以使用索引(如果有的話) –
+1表示'我已經完成了我的研究,並提出了......在*之前開展研究*總是一個好兆頭':-)'。並且還展示了一個'EXPLAIN'。 – Martin