2015-04-29 120 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 

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