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

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

vasily_rostov

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

Здравствуйте!
В запросе использую объединение 3-х таблиц, размеры первая - 192 записи, 2-ая - 50000, 3-я - 30000.
При запросе машина повисла.
Разясните, пожалуйста, улучшит ли дело физическая модернизация компьютера (ув. ОЗУ).
Дело в том, что размеры таблиц в проекте будут расти, но уже сейчас столкнулся с проблемой, может отказаться от MYSQL?
В каждой таблице не более 5 столбцов, т.е. небольшие.
 
Я бы предложил сначала продемострировать запросы и объяснить их назначение. Вполне возможно необходима модернизация несколько другого рода.
 
vasily_rostov, все зависит от того, какие именно join'ы ты сделал. Если ты заказал полное декартово произведение, то удивляться не стОит... :)
 
Ситуация следующая:
на вход поступает таблица:
Бренд,номер,Бренд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 - здесь машина виснет.
 
vasily_rostov, не надо фигуры из пальцев складывать. Мы прекрасно умеем читать команды SQL, отвечающие за создание таблиц и индексов, а равно -- за выборку данных.
 
Это отпрравная точка:


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.
Так вот оба этих запроса - тормозят, а то и вешают машину.
К сожалению, последние запросы проходят для малых объемов. Именно к сожалению, поскольку искать ошибку мне негде. Как я думаю, выход либо в неизвестной мне тонкой настройке индексов, либо ув. мощности компа.
 
Было бы странно, если бы оно быстро работало без индексов.
 
Лучше бы оно работало медленно, но не вешало машину.
Индексы нужно назначать на поля , участвующие в JOIN'ах?
 
На все поля по которым идет выборка (в условиях джойнов или where) индексы как правило обязательны.
 
Возник попутный вопрос:
сделал 2 поля - уникальными,
дома (версию MYSQL не помню) - при вставке выборки записей , не нужные отсеиваются автоматически.
На работе - весь запрос вставки заканчивается первой встречной не уникальной записью,
как настроить, чтобы не уникальные автоматически отсеивались?
 
Vasily_VS
если у тебя возник вопрос, то недо не засорять им чужой топик, а создать свой
 
ФАНАТ,
Создатель темы и я одно лицо. Сейчас пишу с работы.
Спасибо за ответ.
 
Вообще-то, чтобы не вводить в заблуждение отвечающих, и из элементарного уважения к ним, желательно не плодить ники, а ходить под одним.
Если у тебя проблемы с запоминанием собственного пароля, есть сервис по его восстановлению.
 
Сверху