Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Как избавится от Using temporary? / 6 сообщений из 6, страница 1 из 1
13.08.2014, 15:33:55
    #38719507
grecha10
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как избавится от Using temporary?
Здравствуйте!

Есть две связанные таблицы: список рубрик и список товаров.

hdbk_rubrics
"id""parentid""lev""rubric_name""path""1"NULL"0""Список рубрик" "1""2""1""1""Электроника и компьютеры""1/2""3""2""2""Телевизоры и видеоаппаратура""1/2/3""4""2""2""Домашние кинотеатры""1/2/4""5""2""2""Фото- и видеокамеры""1/2/5""6""2""2""Сотовые телефоны и аксессуары""1/2/6""7""2""2""Игровые видеоприставки""1/2/7""8""2""2""MP3-плееры и переносные колонки""1/2/8""9""2""2""Автомобильная электроника и GPS""1/2/9""10""2""2""Музыкальные инструменты""1/2/10""11""2""2""Аксессуары для электронных устройств""1/2/11""12""2""2""Ноутбуки и планшеты""1/2/12""13""2""2""Настольные компьютеры и мониторы""1/2/13""14""2""2""Периферийные устройства для компьютеров""1/2/14""15""2""2""Программное обеспечение""1/2/15""16""2""2""Принтеры и чернила""1/2/16""17""2""2""Офисные и школьные принадлежности""1/2/17""18""1""1""Дом и сад""1/18""19""18""2""Кухня и столовая""1/18/19""20""18""2""Мебель и декоративные элементы""1/18/20"

catalog
"id""idFirm""idRubric""article""idType""name""31632""13""85""BD-010-31632""1""Металлоконструкции""31634""13""85""BD-010-31634""1""Монтаж кровельных систем""31637""13""85""BD-010-31637""1""Монтаж фасадных систем""36553""19""85""BX-010-36553""1""Шифер""36554""19""85""BX-010-36554""1""Цемент""36555""19""85""BX-010-36555""1""Рубероид""36556""19""85""BX-010-36556""1""Электроды сварочные""36557""19""85""BX-010-36557""1""Трубы асбоцементные""36558""19""85""BX-010-36558""1""ДВП""37002""19""85""BX-010-37002""1""Монтаж систем автоматического пожаротушения""37007""19""85""BX-010-37007""1""Монтаж систем силового и слаботочного электроснабжения""37016""19""85""BX-010-37016""1""Техническая экспертиза зданий и сооружений""37762""19""85""BX-010-37762""1""Проектирование зданий и сооружений""37763""19""85""BX-010-37763""1""Проектирование и монтаж волоконно-оптических линий передачи""42537""19""85""BX-010-42537""1""Межевание""42539""19""85""BX-010-42539""1""Строительство монолитных фундаментов""42541""19""85""BX-010-42541""1""Монтаж систем вентиляции""42542""19""85""BX-010-42542""1""Прокол грунта под дорогами"

Список рубрик большой и в реальности товары есть не во всех рубриках. Нужен запрос, выводящий список рубрик первого уровня (hdbk_rubrics.lev=1) в которых товары имеются.

Написал вот такой запрос:
Код: sql
1.
2.
3.
4.
5.
SELECT DISTINCT Rub.id, Rub.rubric_name
FROM hdbk_rubrics Rub 
INNER JOIN hdbk_rubrics rub1 ON rub1.path LIKE CONCAT(Rub.path,'%')
INNER JOIN catalog c ON c.idRubric=rub1.id
WHERE Rub.lev='1'



Пробовал индексы в разных комбинациях, лучшее связывание, которого смог добиться выглядит вот так:
Код: plaintext
1.
2.
3.
4.
id	select_type	table	type	possible_keys	key	key_len	ref	rows	Extra
1	SIMPLE	Rub	ref	lev_path	lev_path	1	const	9	Using temporary
1	SIMPLE	c	index	NULL	idFirm_idRubric_moderation	7	NULL	41664	Using index; Distinct
1	SIMPLE	rub1	eq_ref	PRIMARY	PRIMARY	2	labstroyinfo.c.idRubric	1	Using where; Distinct

Но никак не удается избавится от Using temporary, а на копирование во временную таблицу уходит 95% времени, судя по профилированию.
Возможно ли в принципе избавится от временной таблице в данном случае? Если да, то как??
...
Рейтинг: 0 / 0
13.08.2014, 15:44:08
    #38719522
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как избавится от Using temporary?
grecha10Нужен запрос, выводящий список рубрик первого уровня (hdbk_rubrics.lev=1) в которых товары имеются.Уточните, "В которых" или "в которых, включая подрубрики," ?
...
Рейтинг: 0 / 0
13.08.2014, 16:39:37
    #38719590
grecha10
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как избавится от Using temporary?
miksoft,
да, включая подрубрики.
В рубриках верхнего уровня товаров вообще нет, товару может быть присвоен только какой либо из конечных вложенных рубрик.
...
Рейтинг: 0 / 0
13.08.2014, 16:42:10
    #38719598
grecha10
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как избавится от Using temporary?
grecha10В рубриках верхнего уровня товаров вообще нет

В смысле, что товару не может быть присвоен idRubric=18, но может быть idRubric=19, на указанных данных. Это пример для наглядности.
...
Рейтинг: 0 / 0
13.08.2014, 17:03:36
    #38719631
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как избавится от Using temporary?
Для начала я бы JOIN catalog заменил бы на EXISTS.
Вторым этапом, наверное, в этот же EXISTS засунул бы и JOIN hdbk_rubrics rub1. А после этого DISTINCT сам отвалится.
...
Рейтинг: 0 / 0
13.08.2014, 18:22:56
    #38719738
grecha10
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как избавится от Using temporary?
miksoft,
это просто пуля.

По сравнению с тем что было - выигрыш в скорости в 10 000 раз.
Тем не менее, прошу взглянуть - может где то можно допилить, я не спец в sql, а с exists вообще первый раз столкнулся, только что доки прочитал.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
SELECT Rub.id, Rub.rubric_name
	FROM hdbk_rubrics Rub 
	WHERE EXISTS 
		(SELECT * 
			FROM catalog c 
			WHERE EXISTS
				(SELECT *
					FROM hdbk_rubrics rub1
					WHERE rub1.path LIKE CONCAT(Rub.path,'%')
						AND c.idRubric=rub1.id
				)
		)
		AND Rub.lev='1'
	;




EXPLAIN такой:

id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY Rub ref lev_path lev_path 1 const 9 Using where
2 DEPENDENT SUBQUERY c index NULL idRubric 3 NULL 41664 Using where; Using index
3 DEPENDENT SUBQUERY rub1 eq_ref PRIMARY,id_path PRIMARY 2 labstroyinfo.c.idRubric 1 Using where

В предыдущей версии запроса мне очень нравился Using index, Distinct в таблице catalog. А здесь полный перебор идет, никак не улучшить? Но все равно получилось значительно(!) быстрее.
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Как избавится от Using temporary? / 6 сообщений из 6, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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