SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 01.09.2013 23:24:04

Vasiliy Bondarenko
Участник
Зарегистрирован: 01.09.2013
Сообщений: 2

Как оптимизировать запросик с многими GROUP BY?

сам запрос
-----------
SELECT
    *,
    MAX(year) AS max_year, 
    MIN(year) AS min_year
FROM `search_by_vehicle`
GROUP BY car, modification, param_pcd, param_dia, param_nut, param_bolt,
        tyres_factory, tyres_replace, tyres_tuning, wheels_factory,
        wheels_replace, wheels_tuning

---------------
EXPLAIN выдает типа
possible_keys = null
Using temporary; Using filesort

Неактивен

 

#2 02.09.2013 00:04:00

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5831

Re: Как оптимизировать запросик с многими GROUP BY?

Покажите
show create table search_by_vehicle;
и
кол-во строк в таблице и уникальных значений для столбцов перечисленных в group by

Неактивен

 

#3 02.09.2013 10:29:17

Александр Трофимов
Завсегдатай
Откуда: Юрмала
Зарегистрирован: 19.09.2011
Сообщений: 95

Re: Как оптимизировать запросик с многими GROUP BY?

Друг, раздели хотя бы на две таблицы.
В одну — все по машине до болтов. В другую — все, что относится к колесам. И еще одну таблицу для соединения машин и колес.

И вообще машины сразу стоит вносить с двумя колонками: year_from и year_to, а то вместо одной машины 12, если машина производилась в течение 12 лет, это как-то неинтересно. +)
11 лишних строк только по одной машине.

Неактивен

 

#4 03.09.2013 15:24:00

Vasiliy Bondarenko
Участник
Зарегистрирован: 01.09.2013
Сообщений: 2

Re: Как оптимизировать запросик с многими GROUP BY?

vasya написал:

Покажите
show create table search_by_vehicle;
и
кол-во строк в таблице и уникальных значений для столбцов перечисленных в group by

CREATE TABLE `search_by_vehicle` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`vendor` varchar(255) NOT NULL,
`car` varchar(255) NOT NULL,
`year` varchar(255) NOT NULL,
`modification` varchar(255) NOT NULL,
`param_pcd` varchar(10) NOT NULL,
`param_dia` varchar(8) NOT NULL,
`param_nut` varchar(32) NOT NULL,
`param_bolt` varchar(10) NOT NULL,
`tyres_factory` varchar(100) NOT NULL,
`tyres_replace` varchar(300) NOT NULL,
`tyres_tuning` varchar(300) NOT NULL,
`wheels_factory` varchar(200) NOT NULL,
`wheels_replace` varchar(400) NOT NULL,
`wheels_tuning` varchar(300) NOT NULL,
PRIMARY KEY (`id`),
KEY `car` (`car`),
KEY `modification` (`modification`),
KEY `car-mod` (`car`(100),`modification`(100))
) ENGINE=InnoDB AUTO_INCREMENT=20727 DEFAULT CHARSET=utf8


строк 20000

уникальных значений - не очень понял вопрос. после группировки получатеся примерно 4000 строк. или нужны данные по каждому столбцу?

Александр Трофимов: ну если бы все так просто было Ж)
эта таблица - покупная и рассчитана на последующие апдейты. поэтому очень не хочется ее как-то менять. я планировал из указанного запроса сделать вьюху и на ней потом уже строить запросы для фронт-энда. но вот столкнулся с тормозами. запросы выполняются по 1-2 сек, что для моих целей неприемлемо долго.

Неактивен

 

#5 03.09.2013 16:19:10

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5831

Re: Как оптимизировать запросик с многими GROUP BY?

по каждому столбцу, т.е.

select count(car), count(modification), count(param_pcd), ... from `search_by_vehicle`;

Неактивен

 

#6 03.09.2013 16:48:55

Александр Трофимов
Завсегдатай
Откуда: Юрмала
Зарегистрирован: 19.09.2011
Сообщений: 95

Re: Как оптимизировать запросик с многими GROUP BY?

Не, не, это херовая практика. +)

Я через это проходил.
Обновление можно сделать и по трем таблицам, если файл обновления не меняется.
Иначе в будущем сто процентов поймаешь косяка.
Да и развивать такие БД потом очень сложно.

Неактивен

 

#7 03.09.2013 16:51:19

Александр Трофимов
Завсегдатай
Откуда: Юрмала
Зарегистрирован: 19.09.2011
Сообщений: 95

Re: Как оптимизировать запросик с многими GROUP BY?

vasya написал:

по каждому столбцу, т.е.

select count(car), count(modification), count(param_pcd), ... from `search_by_vehicle`;

Разве здесь не надобно ли к каждой скобке добавить DISTINCT, дабы получить настоящее число уникальных значений по каждому столбцу?

select count(DISTINCT car), count(DISTINCT modification), count(DISTINCT param_pcd), ... from `search_by_vehicle`;

Неактивен

 

#8 03.09.2013 17:04:35

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5831

Re: Как оптимизировать запросик с многими GROUP BY?

Да, вы правы.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson