Виснет база при двух join - ах.

  • Автор темы vasily_rostov
  • Дата начала

vasily_rostov

Guest
Виснет база при двух join - ах.

Здравствуйте!
В запросе использую объединение 3-х таблиц, размеры первая - 192 записи, 2-ая - 50000, 3-я - 30000.
При запросе машина повисла.
Разясните, пожалуйста, улучшит ли дело физическая модернизация компьютера (ув. ОЗУ).
Дело в том, что размеры таблиц в проекте будут расти, но уже сейчас столкнулся с проблемой, может отказаться от MYSQL?
В каждой таблице не более 5 столбцов, т.е. небольшие.
 

ForJest

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

Crazy

Developer
vasily_rostov, все зависит от того, какие именно join'ы ты сделал. Если ты заказал полное декартово произведение, то удивляться не стОит... :)
 

vasily_rostov

Guest
Ситуация следующая:
на вход поступает таблица:
Бренд,номер,Бренд2,номер2

Таблицу нужно распределить по трем следующим:
1. Таблица
id, Бренд
(некоторые названия брендов различные, но являются одной и той же компанией - их id - одинаковы. Т.о. id не уникально.
2. Таблица
id,Бренд2, номер2
Здесь также id не уникальны, т.к. некоторые пары Бр2 и Ном2 являются сутью одного товара.
3. Таблица
id,id_Бренд,Номер,id_Бренд2
Здесь Id - уникальны
По id_Бренд2 связь с табл. 2
По id_Бренд1 связь с табл. 1

Ход обработки:

Вх. таблица left join c Табл. 1. Определяем по условию id is NULL каких брендов нет в табл. 1 - добавляем их.

Потом. вх. табл. L.J. Табл. 1 L. J. табл. 3
определяем каких пар id_Бренд,Номер нет в табл. 3 - здесь машина виснет.
 

Crazy

Developer
vasily_rostov, не надо фигуры из пальцев складывать. Мы прекрасно умеем читать команды SQL, отвечающие за создание таблиц и индексов, а равно -- за выборку данных.
 

vasily_rostov

Guest
Это отпрравная точка:


CREATE TABLE `chasis` (
`ID_CH` int(10) unsigned NOT NULL auto_increment,
`ID_PR` int(5) unsigned NOT NULL default '0',
`NUMBER` char(30) NOT NULL default '',
`ID_OE` int(10) default '-1',
PRIMARY KEY (`ID_CH`,`ID_PR`,`NUMBER`),
UNIQUE KEY `ID_CH` (`ID_CH`),
KEY `ID_CH_2` (`ID_CH`)
) TYPE=MyISAM;



#
# Table structure for table 'oes'
#

CREATE TABLE `oes` (
`ID_OE` int(10) unsigned default '0',
`OE` char(30) default '0',
`MARKA` char(30) default '0'
) TYPE=MyISAM;



#
# Table structure for table 'proizv'
#

CREATE TABLE `proizv` (
`ID` tinyint(3) unsigned default '0',
`NAME` char(30) default '0'
) TYPE=MyISAM;



#
# Table structure for table 'temp'
#

CREATE TABLE `temp` (
`PROIZV` char(30) default '0',
`NUMBER` char(30) default '0',
`MARKA` char(15) default NULL,
`OE` char(20) default NULL
) TYPE=MyISAM;

Первоначальный вариант, содержащий много INSERT'ов
т.к. в таблице temp около 20-80 тыс. (происходит регулярное пополнение).


Пытаюсь провести все INSERT'и с учетом отсутствия их в таблице следующим образом:
выделяем новые строки:

SELECT DISTINCT proizv.id,temp.number from temp left join proizv on temp.proizv = proizv.name left join chasis on chasis.number = temp.number and chasis.id_pr = proizv.id where chasis.id_ch is NULL;

Далее, через промежуточную таблицу (поскольку напрямую данный результат в chasis не лезит - пишет ошибка alias) загоняю в chasis.
Так вот оба этих запроса - тормозят, а то и вешают машину.
К сожалению, последние запросы проходят для малых объемов. Именно к сожалению, поскольку искать ошибку мне негде. Как я думаю, выход либо в неизвестной мне тонкой настройке индексов, либо ув. мощности компа.
 

Crazy

Developer
Было бы странно, если бы оно быстро работало без индексов.
 

vasily_rostov

Guest
Лучше бы оно работало медленно, но не вешало машину.
Индексы нужно назначать на поля , участвующие в JOIN'ах?
 

fixxxer

К.О.
Партнер клуба
На все поля по которым идет выборка (в условиях джойнов или where) индексы как правило обязательны.
 

Vasily_VS

Guest
Возник попутный вопрос:
сделал 2 поля - уникальными,
дома (версию MYSQL не помню) - при вставке выборки записей , не нужные отсеиваются автоматически.
На работе - весь запрос вставки заканчивается первой встречной не уникальной записью,
как настроить, чтобы не уникальные автоматически отсеивались?
 

Фанат

oncle terrible
Команда форума
Vasily_VS
если у тебя возник вопрос, то недо не засорять им чужой топик, а создать свой
 

Vasily_VS

Guest
ФАНАТ,
Создатель темы и я одно лицо. Сейчас пишу с работы.
Спасибо за ответ.
 

Фанат

oncle terrible
Команда форума
Вообще-то, чтобы не вводить в заблуждение отвечающих, и из элементарного уважения к ним, желательно не плодить ники, а ходить под одним.
Если у тебя проблемы с запоминанием собственного пароля, есть сервис по его восстановлению.
 
Сверху