касателно производительности базы при следующем запросе

Ekklipce

Новичок
касателно производительности базы при следующем запросе

general на 178000 записей
price_size на 1700 записей (но в ней все пучком)

надо проссумировать цену для соответствующих совпадений
таких вот :)

general.part = price_size.part
AND general.color = price_size.color
AND general.magazine = price_size.id


полный запрос :
SELECT general.trademark AS legend,
general.magazine AS mag,
(general.x * general.y * general.block) AS square,
SUM( price_size.price ) AS coun,
general.page AS page
FROM general, price_size
WHERE general.part = price_size.part
AND general.color = price_size.color
AND general.magazine = price_size.id
AND general.date_issue > price_size.date_change
GROUP BY legend
ORDER BY coun DESC

проблема в том что запрос даже при прямом обращении к базе задыхается..

Если есть ошибка в конструкции запроса, или какие-то неточности, перегружающие базу, в том числе в алгоритме просчета, большая просьба укажите...
 

Demiurg

Guest
что-то мне подсказывает, что такого рода соеденения говорят о неправильном проектировании БД. Можешь описать свои таблички ?
 

Ekklipce

Новичок
Originally posted by Demiurg
что-то мне подсказывает, что такого рода соеденения говорят о неправильном проектировании БД. Можешь описать свои таблички ?
just a some minute

вообще есть пару неточностей.. но допущены были сознательно, почему, щас скажу..

desc.........

-~{}~ 04.10.04 11:51:

CREATE TABLE `price_size` (
`id` int(10) default NULL,
`date_change` date default NULL,
`part` int(11) default NULL,
`price` int(11) default NULL,
`color` int(2) default NULL,
KEY `id` (`id`),
KEY `part` (`part`),
KEY `color` (`color`)
) TYPE=MyISAM;




вот главная виновница топика ))

CREATE TABLE `general` (
`id` int(11) unsigned NOT NULL auto_increment,
`magazine` int(11) NOT NULL default '0',
`date_issue` date NOT NULL default '0000-00-00',
`number` int(11) NOT NULL default '0',
`lang` int(11) NOT NULL default '0',
`x` int(11) NOT NULL default '0',
`y` int(11) NOT NULL default '0',
`part` int(11) NOT NULL default '0',
`location` int(11) NOT NULL default '0',
`color` int(11) NOT NULL default '0',
`position` int(11) NOT NULL default '0',
`page` int(11) NOT NULL default '0',
`zone` int(11) NOT NULL default '0',
`sector` int(11) NOT NULL default '0',
`category` int(11) NOT NULL default '0',
`model` varchar(255) NOT NULL default '',
`trademark` varchar(255) NOT NULL default '',
`producer` varchar(255) NOT NULL default '',
`advertiser` varchar(255) NOT NULL default '',
`city` varchar(100) NOT NULL default '',
`address` varchar(100) NOT NULL default '',
`phone` varchar(50) NOT NULL default '',
`block` float NOT NULL default '1',
`image_id` varchar(30) NOT NULL default '',
PRIMARY KEY (`id`),
KEY `producer ` (`producer`),
KEY `advertiser ` (`advertiser`),
KEY `sector` (`sector`),
KEY `legend` (`part`,`color`,`magazine`,`category`,`date_issue`,`x`,`y`,`block`),
KEY `cat` (`category`,`date_issue`),
KEY `trademark` (`trademark`,`id`),
KEY `mag_date` (`magazine`,`date_issue`,`id`)
) TYPE=MyISAM AUTO_INCREMENT=212956 ;


было бы жутко хорошо поля
`trademark` varchar(255) NOT NULL default '',
`producer` varchar(255) NOT NULL default '',
`advertiser` varchar(255) NOT NULL default '',


-~{}~ 04.10.04 11:52:

Originally posted by Ekklipce
just a some minute

вообще есть пару неточностей.. но допущены были сознательно, почему, щас скажу..

desc.........

-~{}~ 04.10.04 11:51:

CREATE TABLE `price_size` (
`id` int(10) default NULL,
`date_change` date default NULL,
`part` int(11) default NULL,
`price` int(11) default NULL,
`color` int(2) default NULL,
KEY `id` (`id`),
KEY `part` (`part`),
KEY `color` (`color`)
) TYPE=MyISAM;




вот главная виновница топика ))

CREATE TABLE `general` (
`id` int(11) unsigned NOT NULL auto_increment,
`magazine` int(11) NOT NULL default '0',
`date_issue` date NOT NULL default '0000-00-00',
`number` int(11) NOT NULL default '0',
`lang` int(11) NOT NULL default '0',
`x` int(11) NOT NULL default '0',
`y` int(11) NOT NULL default '0',
`part` int(11) NOT NULL default '0',
`location` int(11) NOT NULL default '0',
`color` int(11) NOT NULL default '0',
`position` int(11) NOT NULL default '0',
`page` int(11) NOT NULL default '0',
`zone` int(11) NOT NULL default '0',
`sector` int(11) NOT NULL default '0',
`category` int(11) NOT NULL default '0',
`model` varchar(255) NOT NULL default '',
`trademark` varchar(255) NOT NULL default '',
`producer` varchar(255) NOT NULL default '',
`advertiser` varchar(255) NOT NULL default '',
`city` varchar(100) NOT NULL default '',
`address` varchar(100) NOT NULL default '',
`phone` varchar(50) NOT NULL default '',
`block` float NOT NULL default '1',
`image_id` varchar(30) NOT NULL default '',
PRIMARY KEY (`id`),
KEY `producer ` (`producer`),
KEY `advertiser ` (`advertiser`),
KEY `sector` (`sector`),
KEY `legend` (`part`,`color`,`magazine`,`category`,`date_issue`,`x`,`y`,`block`),
KEY `cat` (`category`,`date_issue`),
KEY `trademark` (`trademark`,`id`),
KEY `mag_date` (`magazine`,`date_issue`,`id`)
) TYPE=MyISAM AUTO_INCREMENT=212956 ;


было бы жутко хорошо поля
`trademark` varchar(255) NOT NULL default '',
`producer` varchar(255) NOT NULL default '',
`advertiser` varchar(255) NOT NULL default '',
держать отдельно, но они -часть отдельной добавляемой записи :((.. индекс потому тутсовсем не поможет наверно

-~{}~ 04.10.04 11:53:

CREATE TABLE `price_size` (
`id` int(10) default NULL,
`date_change` date default NULL,
`part` int(11) default NULL,
`price` int(11) default NULL,
`color` int(2) default NULL,
KEY `id` (`id`),
KEY `part` (`part`),
KEY `color` (`color`)
) TYPE=MyISAM;

вот главная виновница топика ))

CREATE TABLE `general` (
`id` int(11) unsigned NOT NULL auto_increment,
`magazine` int(11) NOT NULL default '0',
`date_issue` date NOT NULL default '0000-00-00',
`number` int(11) NOT NULL default '0',
`lang` int(11) NOT NULL default '0',
`x` int(11) NOT NULL default '0',
`y` int(11) NOT NULL default '0',
`part` int(11) NOT NULL default '0',
`location` int(11) NOT NULL default '0',
`color` int(11) NOT NULL default '0',
`position` int(11) NOT NULL default '0',
`page` int(11) NOT NULL default '0',
`zone` int(11) NOT NULL default '0',
`sector` int(11) NOT NULL default '0',
`category` int(11) NOT NULL default '0',
`model` varchar(255) NOT NULL default '',
`trademark` varchar(255) NOT NULL default '',
`producer` varchar(255) NOT NULL default '',
`advertiser` varchar(255) NOT NULL default '',
`city` varchar(100) NOT NULL default '',
`address` varchar(100) NOT NULL default '',
`phone` varchar(50) NOT NULL default '',
`block` float NOT NULL default '1',
`image_id` varchar(30) NOT NULL default '',
PRIMARY KEY (`id`),
KEY `producer ` (`producer`),
KEY `advertiser ` (`advertiser`),
KEY `sector` (`sector`),
KEY `legend` (`part`,`color`,`magazine`,`category`,`date_issue`,`x`,`y`,`block`),
KEY `cat` (`category`,`date_issue`),
KEY `trademark` (`trademark`,`id`),
KEY `mag_date` (`magazine`,`date_issue`,`id`)
) TYPE=MyISAM AUTO_INCREMENT=212956 ;


было бы жутко хорошо поля
`trademark` varchar(255) NOT NULL default '',
`producer` varchar(255) NOT NULL default '',
`advertiser` varchar(255) NOT NULL default '',


держать отдельно, но они -часть отдельной добавляемой записи :((.. индекс потому тутсовсем не поможет наверно [/B][/QUOTE]
 

Demiurg

Guest
А теперь своими словами. Я например, не могу понять, какое отношение имеет price_size к general.
 

Ekklipce

Новичок
блин ((((((

хотел отредактировать - в итоге только мессагу испохабил..

санитары, если не влом, обрежте ненужную часть мессаги

-~{}~ 04.10.04 11:59:

general.magazine = price_size.id

вот собсна и все отношение

в general может быть много записей скажем с general.magazine = "166"
magazine--part--color-date
166-----------5------1---2004-02-01
166-----------6------1---2004-02-01

(осенила тут идея.. а че б не вынести отдельно part и color)

а в price_size цены на запись с соответствующим part и color
price_size :
-id---part-color-price-date
166--5-----1----2000-2004-01-01
166--6-----1----3000-2004-01-01
....
и.т.д.

и дата - price_size.date меньше general.date , то есть последняпредыдущая..

думаю понятно объяснил


понятно обьяснил ?
 

Demiurg

Guest
>понятно обьяснил ?
нет

если
>general.magazine = price_size.id
>вот собсна и все отношение
то почему в запросе таблицы соеденяются не только по этим полям.
 

Ekklipce

Новичок
это было основное соединение....
остальные второстепенны, оттого не менее значимы

таблица general для данного magazine содержит part и color
таблица price_size - содержит эти же данные, только плюс цену на эти данные - на part и на color

вот и получается, что ищу для всех записей сответствие по изданию magazine - и установленную цену на part и color

пример ниже :

general
magazine--part--color----date
166-----------5------1---2004-02-01
166-----------6------1---2004-02-01

price_size :
-id----part-color--price-----date
166----5-----1----2000-2004-01-01
166----6-----1----3000-2004-01-01

вынимаем сумму по price_size.price - в данном случае она 5000..

при :
magazine--part--color----date
166-----------5------2---2004-02-01
166-----------6------1---2004-02-01

сумма будет 3000 - так не совпало полностью part и color
 

Ekklipce

Новичок
Originally posted by Demiurg
magazine - это у тебя журнал ?
да, его ID

единственный выход вижу в выделении в отдельные таблицы
полей trademark, procuder и advertiser - и индексировать их
 

Demiurg

Guest
>сорри, не понял вопроса...
В general у тебя что лежит ? ID - это идентификатор чего ?
 

Ekklipce

Новичок
Originally posted by Demiurg
>сорри, не понял вопроса...
В general у тебя что лежит ? ID - это идентификатор чего ?
идентификатор издания.. имя издания в таблице main, но она тут никаком боком не юзается...

в генерал лежит полная запись - в каком издании (magazine)
какая реклама лежит..ее координаты, х,у, цвет, часть полосы, торговая марка....и т.д. по MAGAZINE, PART, COLOR - "сущность" определения цены

юзается только MAGAZINE, PART, COLOR из GENERAL
 

Demiurg

Guest
Почему бы издание не хранить в отдельной таблице а журналы в отдельной, со ссылкой на издание ?
 

Ekklipce

Новичок
Originally posted by Demiurg
Почему бы издание не хранить в отдельной таблице а журналы в отдельной, со ссылкой на издание ?
Так и есть
в main
id, name,.....
храятся издания

в general
записи с конкретных размещений реклам с этих изданий и информации по ним... в одном журнале реклам может быть мноог...
 

Ekklipce

Новичок
Originally posted by Demiurg
что тогда такое price_size ?
ты шутишь наверно :(

price_size
хранит цену на конкретную запись таблицы general (в которой хранятся записи )...

ЦЕНА определяется полями из general

general : magazine, part(площадь рекламы (часть полосы короче)), color (цвет рекламы)

price_size :
magazine, part(площадь рекламы (часть полосы короче)), color (цвет рекламы), + price (сколько это всё стоит..)
 

Demiurg

Guest
а почему эту цену не хранить прямо в general ?
 

Ekklipce

Новичок
Originally posted by Demiurg
а почему эту цену не хранить прямо в general ?
будь цена одинаковой - топик не открывал бы :(

цена не постоянна - за разный период разная..
даты добавления издания разные
если издание добавлено 2004-02-01,
то если даты цен при совпадающих part, color, magazine :
2004-01-15------2000
2004-01-20------2500
2004-01-25------3000
2004-02-05=----3500

берем цену за 2004-01-25 - 3000 баксоф

если дата издания 2004-02-15
берем соответствующую цену на 2004-02-05 на 3500 $ - то есть ближайщую предыдущую, и учитываем это при суммировании при price_size.date_change < general.date_issue
 
Сверху