2015-04-29 123 views
0

嗨,我有一個名爲train_stop的表,它有大約100萬行。Indexing Mysql Group BY Query

我有以下的query

SELECT * FROM (SELECT * FROM train_stop where code='XYZ' AND active=1 UNION SELECT * FROM train_stop where code='ABC' UNION SELECT * FROM train_stop where code='STU'......) AS t3 GROUP BY t3.number order by departs 

這個查詢只使用相同的表train_stop。首先,我根據code選擇某些行,然後按number進行分組。我嘗試索引不同的列,但上面的查詢總是使用using temporary, using filesort。執行時間爲幾秒。請告訴我們是否有更好的方法來編寫上面的查詢和索引策略,以便在毫秒內優化並獲得結果。你的幫助將會非常有用。

Create Statement is `CREATE TABLE `train_stop` (
    `number` varchar(1000) NOT NULL, 
    `stop_number` int(11) NOT NULL, 
    `code` varchar(1000) NOT NULL, 
    `station name` varchar(1000) NOT NULL, 
    `arrives` time NOT NULL, 
    `departs` time NOT NULL, 
    `halt` varchar(1000) NOT NULL, 
    `pf` varchar(1000) NOT NULL, 
    `day` int(11) NOT NULL, 
    `km` varchar(1000) NOT NULL, 
    `speed` varchar(1000) NOT NULL, 
    `elev` varchar(1000) NOT NULL, 
    `zone` varchar(1000) NOT NULL, 
    `address` varchar(1000) NOT NULL, 
    `active` int(11) DEFAULT '1', 
    KEY `index_1` (`number`(767),`code`(767)), 
    KEY `PIndex` (`number`(767),`stop_number`), 
    KEY `three_columns_idx` (`code`(767),`active`,`departs`), 
    KEY `two_columns_idx` (`code`(767),`active`), 
    KEY `two_columns_group_idx` (`number`(767),`departs`), 
    KEY `one_columns_group_idx` (`departs`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1` 
+0

,所以你可以張貼想要的出發順序你的'CREATE TABLE'語句查詢?什麼是你的服務器MySQL或MS SQL?你必須選擇一個並標記它 – Alex

+0

只是調查你的查詢了一下。你在這裏做什麼???爲什麼'UNION'表本身多次?以及爲什麼只發布部分查詢?如果你需要幫助,你應該發佈完整的查詢。 – Alex

+1

誰創建了這個表結構?爲什麼'''數字''varchar(1000)NOT NULL,'?你知道這是什麼意思嗎? 'varchar(1000)'是一個巨大的關鍵!誰需要? – Alex

回答

0

我認爲你的查詢遍歷整個表一次爲每個子查詢,這是你的瓶頸。請試試這個

SELECT * FROM train_stop where (code='XYZ' AND active=1) OR (code='ABC') OR (code='STU') ... 
Group by number order by departs 

,並就您的查詢,它使用GROUP BY聲明,我認爲你不能寫select *請縮小選擇範圍短語!

+0

嗨,嘗試了您的查詢。它速度很快,但它失敗了我的目的。看,我想第一個選擇器出現在結果如果多個選擇器匹配。代碼='XYZ'或代碼='ABC'...現在XYZ和ABC都存在,但我只希望第一個選擇器是XYZ出現在結果中。但我的觀察結果是這個查詢,它隨機選擇XYZ或ABC。 – user609306

0

刪除聯合並使用OR。出於某種原因,如果order by和group by在一起,它將不會得到您期望的行。而不是通過在查詢的一端先責令其子查詢和組內

像這樣

SELECT * FROM (SELECT * FROM train_stop where (code='XYZ' AND active=1) 
OR (code='ABC') OR (code='STU') ... ORDER BY departs ASC) AS t3 GROUP BY 
t3.number 

決定,如果你用升序或降序