powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Медленный JOIN, объединение 6 таблиц
11 сообщений из 11, страница 1 из 1
Медленный JOIN, объединение 6 таблиц
    #39228680
Nikolay_Lem
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день! Объединил 6 таблиц, вывод запчастей к авто по ид авто.
Вывод 29 записей из таблицы goods_car и подставка к ним данных из других таблиц.
Помогите вывод 29 записей идет 2 секунды.
$car_id = ID авто

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
SELECT `goods`.`name` AS `name`, `goods`.`code` AS `code`, `goods`.`manufacturer_id` AS `manufacturer_id`, `goods`.`id` AS `id`, `goods`.`parent_id` AS `parent_id`, `price`.`price` AS `price`, `price`.`total` AS `total`, `manufacturer`.`name` AS `manufacturer_name`, `manufacturer`.`country` AS `manufacturer_country`, `provider`.`date` AS `provider_date`, `provider`.`id` AS `provider_id`, `basket`.`id` AS `basket_id` 
FROM `goods_car` 
LEFT JOIN `goods` ON `goods_car`.`code` = `goods`.`code` AND `goods_car`.`manufacturer_id` = `goods`.`manufacturer_id` 
LEFT JOIN `manufacturer` ON `goods`.`manufacturer_id` = `manufacturer`.`id` 
LEFT JOIN `price` ON `goods_car`.`code` = `price`.`code` AND `goods_car`.`manufacturer_id` = `price`.`manufacturer_id` 
LEFT JOIN `basket` ON `goods_car`.`code` = `basket`.`code` AND `goods_car`.`manufacturer_id` = `basket`.`manufacturer_id` AND `basket`.`status` = 1 
LEFT JOIN `provider` ON `price`.`provider_id` = `provider`.`id` 
WHERE `goods_car`.`car_id` = $car_id 
ORDER BY `goods`.`name` asc



Таблица с товарами
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
CREATE TABLE `goods` (
	`id` INT(11) NOT NULL AUTO_INCREMENT,
	`parent_id` INT(11) NOT NULL,
	`name` VARCHAR(255) NOT NULL,
	`code` VARCHAR(255) NOT NULL,
	`search` VARCHAR(255) NOT NULL,
	`text` TEXT NOT NULL,
	`manufacturer_id` INT(11) NOT NULL,
	`photo` VARCHAR(100) NOT NULL,
	`status` TINYINT(4) NOT NULL DEFAULT '1',
	PRIMARY KEY (`id`),
	INDEX `manufacturer_id` (`manufacturer_id`),
	INDEX `parent_id` (`parent_id`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
AUTO_INCREMENT=112254
;



Таблица с производителями
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
CREATE TABLE `manufacturer` (
	`id` INT(11) NOT NULL AUTO_INCREMENT,
	`name` VARCHAR(255) NOT NULL,
	`country` VARCHAR(255) NOT NULL,
	PRIMARY KEY (`id`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
AUTO_INCREMENT=639
;



Таблица товары к авто (сравнение по code,manufacturer_id)
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
CREATE TABLE `goods_car` (
	`car_id` INT(11) NOT NULL,
	`code` VARCHAR(255) NOT NULL,
	`manufacturer_id` INT(11) NOT NULL,
	INDEX `manufacturer_id` (`manufacturer_id`),
	INDEX `car_id` (`car_id`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
;



Таблица цены (сравнение по code,manufacturer_id)
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
CREATE TABLE `price` (
	`provider_id` INT(11) NOT NULL,
	`code` VARCHAR(255) NOT NULL,
	`price` DOUBLE NOT NULL,
	`manufacturer_id` INT(11) NOT NULL,
	`total` INT(11) NOT NULL DEFAULT '0',
	INDEX `provider_id` (`provider_id`),
	INDEX `manufacturer` (`manufacturer_id`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
;



Таблица поставщики (сравнение по code,manufacturer_id)
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
CREATE TABLE `provider` (
	`id` INT(11) NOT NULL AUTO_INCREMENT,
	`name` VARCHAR(250) NOT NULL,
	`phone` TEXT NOT NULL,
	`file` VARCHAR(150) NOT NULL,
	`text` TEXT NOT NULL,
	`date` BIGINT(20) NOT NULL,
	PRIMARY KEY (`id`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
AUTO_INCREMENT=2
;



Таблица корзина (сравнение по code,manufacturer_id есть ли товар в корзине)
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
CREATE TABLE `basket` (
	`id` VARCHAR(100) NOT NULL,
	`goods_id` INT(11) NOT NULL,
	`total` INT(11) NOT NULL DEFAULT '1',
	`name` VARCHAR(255) NOT NULL,
	`manufacturer_id` INT(11) NOT NULL,
	`code` VARCHAR(255) NOT NULL,
	`price` DOUBLE NOT NULL,
	`summa` DOUBLE NOT NULL,
	`provider_id` INT(11) NOT NULL,
	`status` TINYINT(4) NOT NULL DEFAULT '1',
	`date` BIGINT(20) NOT NULL,
	INDEX `id` (`id`)
)
COLLATE='utf8_general_ci'
ENGI



Почему сравнение идет по двум полям (code,manufacturer_id), а не по code, так как code может повториться.
Один и тот же code может быть на разный авто.
Пример: code фары форда, может быть от капота опеля.
Пришлось сравнивать еще и по (manufacturer_id) производителю.
...
Рейтинг: 0 / 0
Медленный JOIN, объединение 6 таблиц
    #39228696
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как минимум, не хватает индекса по `goods`.`code`.

А вот цена с корзиной вряд ли могут соединятся через номер и производителя, т.к. это не даст вам держать в базе одинаковые запчасти, например, различающиеся производителем, цветом и т.п.
...
Рейтинг: 0 / 0
Медленный JOIN, объединение 6 таблиц
    #39228697
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
P.S. И, кстати, это соединение, а не объединение.
...
Рейтинг: 0 / 0
Медленный JOIN, объединение 6 таблиц
    #39228700
Nikolay_Lem
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoft, различаются именно по производителю и коду
...
Рейтинг: 0 / 0
Медленный JOIN, объединение 6 таблиц
    #39228701
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nikolay_Lemmiksoft, различаются именно по производителю и кодуНе путайте производителя запчасти и производителя автомобиля. Для соответствия между запчастью и автомобилем нужен номер и производитель автомобиля (по чьему каталогу этот номер). Но запчасти с одинаковым номером и производителем автомобиля могут иметь разных производителей.

Например, тот же самый капот с номером 1160059 и производителем автомобиля OPEL может быть производства самого OPEL, а может POLCAR.
...
Рейтинг: 0 / 0
Медленный JOIN, объединение 6 таблиц
    #39228777
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nikolay_Lemmiksoft, различаются именно по производителю и коду


...поставьте перед запросом волшебное слово EXPLAIN
и выдайте результат сюда
...
Рейтинг: 0 / 0
Медленный JOIN, объединение 6 таблиц
    #39229418
Nikolay_Lem
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoftNikolay_Lemmiksoft, различаются именно по производителю и кодуНе путайте производителя запчасти и производителя автомобиля. Для соответствия между запчастью и автомобилем нужен номер и производитель автомобиля (по чьему каталогу этот номер). Но запчасти с одинаковым номером и производителем автомобиля могут иметь разных производителей.

Например, тот же самый капот с номером 1160059 и производителем автомобиля OPEL может быть производства самого OPEL, а может POLCAR.

Есть таблица goods, в ней артикул запчасти (code) и производитель этой запчасти (manufacturer_id).
Производитель не авто, а запчасти.
У капота для OPEL, может быть номер 252585, производитель BOSCH
и у фары для KIA такой же номер 252585, но производитель MOBIS.
Поэтому есть таблица goods_car, которая связывает между собой запасть и авто.
И что бы в KIA не попал капот от OPEL, сравнение идет по code и manufacturer_id.

После установки индекса на code, все заработало шустро.
Я не гуру в SQL и думал, что на поле VARCHAR индексы не ставят.
Вчера прочел по индексы и вроде более менее разобрался.
...
Рейтинг: 0 / 0
Медленный JOIN, объединение 6 таблиц
    #39229420
Nikolay_Lem
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
javajdbcNikolay_Lemmiksoft, различаются именно по производителю и коду


...поставьте перед запросом волшебное слово EXPLAIN
и выдайте результат сюда

Вставляю EXPLAIN перед SELECT, сыпятся ошибки на php.
...
Рейтинг: 0 / 0
Медленный JOIN, объединение 6 таблиц
    #39229436
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nikolay_LemУ капота для OPEL, может быть номер 252585, производитель BOSCHНу так может существовать другой капот для OPEL с номером 252585, другого производителя (или другого цвета, например). И скорее всего он будет иметь другую цену. Да и покупатель вряд ли будет рад, если в его корзине не тот товар окажется, пусть и с тем же номером для того же автомобиля.
...
Рейтинг: 0 / 0
Медленный JOIN, объединение 6 таблиц
    #39229437
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nikolay_Lemjavajdbcпропущено...



...поставьте перед запросом волшебное слово EXPLAIN
и выдайте результат сюда

Вставляю EXPLAIN перед SELECT, сыпятся ошибки на php.Так это надо не в коде делать, а просто отдельно выполнить запрос. Например, в phpMyAdmin.
...
Рейтинг: 0 / 0
Медленный JOIN, объединение 6 таблиц
    #39229451
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nikolay_Lem,

Кстати, очень часто бывает и обратная ситуация - когда у одного товара много пар номер-производитель.
Максимум, который я встречал - более тысячи.
Поэтому эти данные надо выносить из таблицы товаров отдельную таблицу.


И еще:
Nikolay_Lemпроизводитель BOSCHв таблице goods нет поля для ссылки на этот BOSCH.
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Медленный JOIN, объединение 6 таблиц
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]