您好,我有一个名为train_stop的表,它有大约100万行。
我有以下问题-
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`发布于 2015-04-29 10:49:43
我认为您的查询为每个子查询遍历整个表一次,这就是您的瓶颈。请试一下这件
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 *,请缩小选择短语!
发布于 2015-04-29 11:31:00
删除并集并使用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决定你想要的是升序还是降序
https://stackoverflow.com/questions/29933229
复制相似问题