2015-04-29 2 views
0

Привет У меня есть таблица, называемая train_stop, которая имеет ~ 1 миллион строк.Индексирование 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' ИЛИ ​​code = 'ABC' ... теперь существуют как XYZ, так и ABC, но я хочу, чтобы в результате появился только первый селектор, который XYZ появится. Но мои наблюдения по этому запросу случайным образом выбирают XYZ OR ABC. – user609306

0

удалите союз и используйте ИЛИ. по какой-то причине, если порядок 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 

решить, если вы хотите, порядок отходит по восходящей или нисходящей