улучшение запроса.

Dez

Новичок
улучшение запроса.

Привет.
В процессе подготовки запроса создаю его вида:
[SQL]
SELECT mm.idm AS mname, rr.idr AS rname, SUM(ss.sumr) AS ssum
FROM sellings ss
LEFT JOIN medicines mm ON ss.idm = mm.idm
LEFT JOIN regions rr ON ss.idr = rr.idr
WHERE ss.idm IN (101331,101426,102528,106257,110787,111107,111283,111363,111409,111538,111648,116152,116308,120840,121478,121752,122038,123484,123795,124172,124505,124506,125064,125669,126041,126337,127374,127501,127594,127624,127882,128214,129166,131904,132031,133032,133314,133911,134251,134300,135069,135762,136846,143915,144373,144480,146403,148411,151147,155136,156547)
GROUP BY mm.name, rr.name
[/SQL]
- и это еще цветочки :cool: ... Поле ss.idm проиндексировано.
Данные эти подготавливаю на php - вытягиваю из древовидной структуры.
Не подскажите - такая конструкция с IN - потенциально не узкое ли место?
Или лучше попробовать что то с созданием временной таблицы с этими данными
и соединения с текущей выборкой?
Спасибо.
 

Wicked

Новичок
не узкое.

если запрос тормозит, то давай ты не будешь исключением и сразу приведешь explain этого запроса и структура таблиц (с индексами)?

в остальном:
1) убрать группировку по текстовым полям (если там не ошибка в group by и реально должно стоять mname, rname вместо mm.name, rr.name). Регионы все таки должны идентифицироваться айдишниками, а не неуникальными названиями.
2) убрать группировку по полям из таблиц mm и rr - оставить только group by ss.idm, ss.idr. При этом можно будет за использовать индекс (ss.idm, ss.idr).
3) тогда становится вообще непонятно, зачем нужны джоины :)
 

Dez

Новичок
Вот Explain:

Таблицы:
[sql]
CREATE TABLE `sellings` (
`idm` int(10) NOT NULL,
`idf` int(10) NOT NULL,
`idg` int(10) NOT NULL,
`idr` int(10) NOT NULL,
`yearp` int(10) NOT NULL,
`monthp` int(10) NOT NULL,
`weekp` int(10) NOT NULL,
`sumr` int(10) NOT NULL,
PRIMARY KEY (`idm`,`idf`,`idg`,`idr`,`yearp`,`monthp`,`weekp`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251
[/sql]
[sql]
CREATE TABLE `medicines` (
`idm` int(10) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
`namepr` varchar(255) NOT NULL,
PRIMARY KEY (`idm`),
KEY `medname` (`name`(3))
) ENGINE=MyISAM AUTO_INCREMENT=178109 DEFAULT CHARSET=cp1251
[/sql]
[sql]
CREATE TABLE `regions` (
`idr` int(10) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
`parent` int(10) unsigned DEFAULT NULL,
PRIMARY KEY (`idr`),
KEY `regionname` (`name`(10))
) ENGINE=MyISAM AUTO_INCREMENT=9310001 DEFAULT CHARSET=cp1251
[/sql]

Автор оригинала: Вурдалак
Dez, группировка именно по текстовым полям — это не ошибка?
так сортировка получается(что и надо). Этот запрос при выборе сохранять в файл только первой строчкой отличается: SELECT mm.name AS mname, rr.name AS rname

3) тогда становится вообще непонятно, зачем нужны джоины
из связанных таблиц нужно выбрать названия регионов и лекарств для сохранения в отчет.

-~{}~ 18.09.10 09:57:

P.S. уже по другому сделал - без этих IN. Распарсил предварительно дерево(оно неизменное), каждому листу записал его родителей в отдельную таблицу и к ней теперь джойнусь. По скорости - совсем другое дело.
 
Сверху