@mix_gorbachev

Денормализация бд, изменение структуры или что еще добавить?

Добрый день имеется такая структура бд.
Мне необходимо выбирать все коллекции по заданным параметры, для коллекции необходимо две картинки. в зависимости от параметров, картинки могут быть как товара(plitka_tovar.img), так и с картинки где они именно находятся. (interior_goods.img)
Вот структура всего этого такая.
прошу дать какие либо наводки на решение , а то запросы по 4-8 секунд это треш.

c59f64a9f64c4d8d836cb4e67ba0ef99.jpg
mysqli_query($this->db, 'SET @row_number = 0;');
mysqli_query($this->db, 'SET @collection = 0;');

SELECT t2 .* FROM(SELECT t1 .*,
        @row_number:=
        CASE WHEN @collection = t1 . collection_id
        THEN @row_number + 1
        ELSE 1 END AS num, @collection:=t1 . collection_id AS collection
        FROM(SELECT
					linkVisual,factory_name,factory_id,collection_name,collection_id, 1 as type
				FROM
                (SELECT
									plitka_tovar . id,
									plitka_tovar . Poverhnosty,
									plitka_tovar . Material,
									plitka_tovar . Tekstura,
									plitka_tovar . tip,
									plitka_tovar . Vid_izdeliya,
									plitka_tovar . `S_Facetom(Kabanchik)`,
									plitka_tovar . Tehnicheskiy_keramogranit,
										interior_goods . imgnew AS linkVisual,
									plitka_fabrika . Nazvanie AS factory_name,
									plitka_kollekciya . Nazvanie AS collection_name,
										plitka_fabrika . id AS factory_id,
										plitka_kollekciya . id AS collection_id,
										plitka_kollekciya . collection_link
									FROM
										plitka_tovar,
										_article,
										interior_point,
										interior_goods,
										plitka_kollekciya,
										plitka_fabrika
									WHERE
										_article . id_part = '18'
											AND _article . id_product = plitka_tovar . id
											AND interior_point . article = _article . id
											AND interior_goods . id = interior_point . id_goods
											AND plitka_fabrika . id = plitka_tovar . Fabrika
											AND plitka_kollekciya . id = plitka_tovar . kollekciya)
    $table
                    $where
				UNION
                SELECT t1 . imgnew as linkVisual,t2 . Nazvanie as factory_name,t2 . id as factory_id, t3 . Nazvanie as collection_name, t3 . id as collection_id, 2 as type
					FROM plitka_tovar as t1, plitka_fabrika as t2, plitka_kollekciya as t3 $table
					WHERE t1 . Fabrika = t2 . id AND t3 . id = t1 . Kollekciya $whereTov
				GROUP BY concat(collection_id, linkVisual)

                ORDER by
	                collection_id,type
	                ) as t1) as t2
        WHERE t2 . num <= 2
        ORDER BY  t2 . collection_name,t2 . collection


mysqli_query($this->db, 'SET @row_number = 0;');
mysqli_query($this->db, 'SET @collection = 0;');
эти строки я использую для выборки двух картинок, для одной коллекции

$where $table - это те доп таблицы, в случае если к ним есть запрос.

У меня такой вопрос, как это упростить, потому что в таком режим у меня запрос идет очень долго, чересчур долго.
Индекс сделаны для таблиц.
Таблицы не связаны с помощью ключа, ну то есть это на прямую не прописано, это упущение в плане скорости или нет?
Кэш базы данных использую.
Буду благодарен любым наводкам и информации
  • Вопрос задан
  • 569 просмотров
Пригласить эксперта
Ответы на вопрос 1
@dmitryKovalskiy
программист средней руки
Треш это не структура таблиц, которая простейшая внешне, а 4 уровня вложенности SELECT'a. Это расстрельная статья. Разбирайтесь сначала с запросами, а уж потом с нормализацией данных.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы