Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Оптимизировать запрос / 8 сообщений из 8, страница 1 из 1
01.11.2014, 22:18:39
    #38793972
Nezhnayka
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизировать запрос
Добрый день.
Написал вот такой запрос:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
REPLACE wp_woocommerce_order_itemmeta(order_item_id,meta_key,meta_value)
SELECT x.order_item_id,'_qty',x.qty FROM(
	SELECT wi.order_item_id,o.system_id AS product_id, 0 AS variation_id,iu.name,iu.price,iu.qty,iu.amount,iu.num_order  FROM wp_integration_one_s_orders_items_update AS iu 
	LEFT JOIN wp_integration_one_s_objects AS o
	ON o.guid=iu.guid_object
	LEFT JOIN wp_woocommerce_order_items AS wi
	ON wi.order_id=iu.num_order AND wi.order_item_name=iu.name AND wi.order_item_type='line_item'
	WHERE iu.type='product' AND o.id IS NOT NULL
	UNION 
	SELECT wi.order_item_id,o2.system_id AS product_id, o1.system_id AS variation_id,iu.name,iu.price,iu.qty,iu.amount,iu.num_order  FROM wp_integration_one_s_orders_items_update AS iu 
	LEFT JOIN wp_integration_one_s_objects AS o1
	ON o1.guid=iu.guid_object
	LEFT JOIN wp_integration_one_s_objects AS o2
	ON o2.guid=o1.parent_guid
	LEFT JOIN wp_woocommerce_order_items AS wi
	ON wi.order_id=iu.num_order AND wi.order_item_name=iu.name AND wi.order_item_type='line_item'
	WHERE iu.type='variable' AND o1.id IS NOT NULL AND o2.id IS NOT NULL;
) AS x
UNION
SELECT x.order_item_id,'_product_id',x.product_id FROM (
	SELECT wi.order_item_id,o.system_id AS product_id, 0 AS variation_id,iu.name,iu.price,iu.qty,iu.amount,iu.num_order  FROM wp_integration_one_s_orders_items_update AS iu 
	LEFT JOIN wp_integration_one_s_objects AS o
	ON o.guid=iu.guid_object
	LEFT JOIN wp_woocommerce_order_items AS wi
	ON wi.order_id=iu.num_order AND wi.order_item_name=iu.name AND wi.order_item_type='line_item'
	WHERE iu.type='product' AND o.id IS NOT NULL
	UNION 
	SELECT wi.order_item_id,o2.system_id AS product_id, o1.system_id AS variation_id,iu.name,iu.price,iu.qty,iu.amount,iu.num_order  FROM wp_integration_one_s_orders_items_update AS iu 
	LEFT JOIN wp_integration_one_s_objects AS o1
	ON o1.guid=iu.guid_object
	LEFT JOIN wp_integration_one_s_objects AS o2
	ON o2.guid=o1.parent_guid
	LEFT JOIN wp_woocommerce_order_items AS wi
	ON wi.order_id=iu.num_order AND wi.order_item_name=iu.name AND wi.order_item_type='line_item'
	WHERE iu.type='variable' AND o1.id IS NOT NULL AND o2.id IS NOT NULL
) AS x
UNION
SELECT x.order_item_id,'_variation_id',x.variation_id FROM (
	SELECT wi.order_item_id,o.system_id AS product_id, 0 AS variation_id,iu.name,iu.price,iu.qty,iu.amount,iu.num_order  FROM wp_integration_one_s_orders_items_update AS iu 
	LEFT JOIN wp_integration_one_s_objects AS o
	ON o.guid=iu.guid_object
	LEFT JOIN wp_woocommerce_order_items AS wi
	ON wi.order_id=iu.num_order AND wi.order_item_name=iu.name AND wi.order_item_type='line_item'
	WHERE iu.type='product' AND o.id IS NOT NULL
	UNION 
	SELECT wi.order_item_id,o2.system_id AS product_id, o1.system_id AS variation_id,iu.name,iu.price,iu.qty,iu.amount,iu.num_order  FROM wp_integration_one_s_orders_items_update AS iu 
	LEFT JOIN wp_integration_one_s_objects AS o1
	ON o1.guid=iu.guid_object
	LEFT JOIN wp_integration_one_s_objects AS o2
	ON o2.guid=o1.parent_guid
	LEFT JOIN wp_woocommerce_order_items AS wi
	ON wi.order_id=iu.num_order AND wi.order_item_name=iu.name AND wi.order_item_type='line_item'
	WHERE iu.type='variable' AND o1.id IS NOT NULL AND o2.id IS NOT NULL
) AS x



Соответственно не нравится, что несколько раз повторяется этот код:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
	SELECT wi.order_item_id,o.system_id AS product_id, 0 AS variation_id,iu.name,iu.price,iu.qty,iu.amount,iu.num_order  FROM wp_integration_one_s_orders_items_update AS iu 
	LEFT JOIN wp_integration_one_s_objects AS o
	ON o.guid=iu.guid_object
	LEFT JOIN wp_woocommerce_order_items AS wi
	ON wi.order_id=iu.num_order AND wi.order_item_name=iu.name AND wi.order_item_type='line_item'
	WHERE iu.type='product' AND o.id IS NOT NULL
	UNION 
	SELECT wi.order_item_id,o2.system_id AS product_id, o1.system_id AS variation_id,iu.name,iu.price,iu.qty,iu.amount,iu.num_order  FROM wp_integration_one_s_orders_items_update AS iu 
	LEFT JOIN wp_integration_one_s_objects AS o1
	ON o1.guid=iu.guid_object
	LEFT JOIN wp_integration_one_s_objects AS o2
	ON o2.guid=o1.parent_guid
	LEFT JOIN wp_woocommerce_order_items AS wi
	ON wi.order_id=iu.num_order AND wi.order_item_name=iu.name AND wi.order_item_type='line_item'
	WHERE iu.type='variable' AND o1.id IS NOT NULL AND o2.id IS NOT NULL


Подскажите пожалуйста, как можно оптимизировать этот момент?
...
Рейтинг: 0 / 0
01.11.2014, 22:42:50
    #38794002
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизировать запрос
Не вижу насколько точно повторяется этот фрагмент. Если повторяется абсолютно точно за исключением констант для поля meta_key, то их можно убрать внутрь этого фрагмента:
Код: sql
1.
2.
3.
4.
5.
(SELECT '_qty' meta_key
UNION ALL
SELECT '_product_id' meta_key
UNION ALL
SELECT'_variation_id' meta_key) t

И сделать с этим фрагментом декартово произведение.

И, кстати, не надо использовать UNION, где правильнее и логичнее использовать UNION ALL. Т.к. просто UNION значительно более трудоемок.
...
Рейтинг: 0 / 0
01.11.2014, 22:54:51
    #38794011
Nezhnayka
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизировать запрос
>> Если повторяется абсолютно точно за исключением констант для поля meta_key, то их можно убрать внутрь этого фрагмента:

Нет, отличаются не только значениями поля meta_key, но и значениями поля meta_value, которые берутся так-же из этого фрагмента.
...
Рейтинг: 0 / 0
01.11.2014, 23:04:00
    #38794020
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизировать запрос
Nezhnayka>> Если повторяется абсолютно точно за исключением констант для поля meta_key, то их можно убрать внутрь этого фрагмента:

Нет, отличаются не только значениями поля meta_key, но и значениями поля meta_value, которые берутся так-же из этого фрагмента.А, ну это несложно поправить:
Код: sql
1.
2.
3.
4.
SELECT x.order_item_id,
  t.meta_key, 
  CASE WHEN t.meta_key='_qty' THEN x.qty WHEN ... THEN ... WHEN ... THEN ... END meta_value
FROM ...
...
Рейтинг: 0 / 0
01.11.2014, 23:22:42
    #38794038
Nezhnayka
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизировать запрос
Вроде понятно, а можете показать, как полностью это должно выглядеть? Спасибо.
...
Рейтинг: 0 / 0
01.11.2014, 23:49:34
    #38794063
Nezhnayka
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизировать запрос
Вроде сделал, так должно быть видимо:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
SELECT x.order_item_id,x.meta_key,CASE WHEN x.meta_key='_qty' THEN x.qty WHEN x.meta_key='_product_id' THEN x.product_id WHEN x.meta_key='_variation_id' THEN x.variation_id END meta_value
FROM (
	SELECT t.meta_key,wi.order_item_id,o.system_id AS product_id, 0 AS variation_id,iu.name,iu.price,iu.qty,iu.amount,iu.num_order  FROM wp_integration_one_s_orders_items_update AS iu 
	LEFT JOIN wp_integration_one_s_objects AS o
	ON o.guid=iu.guid_object
	LEFT JOIN wp_woocommerce_order_items AS wi
	ON wi.order_id=iu.num_order AND wi.order_item_name=iu.name AND wi.order_item_type='line_item'
	CROSS JOIN (
		SELECT '_qty' meta_key
		UNION ALL
		SELECT '_product_id' meta_key
		UNION ALL
		SELECT'_variation_id' meta_key
	) t
	WHERE iu.type='product' AND o.id IS NOT NULL
	
	UNION ALL
	
	SELECT t.meta_key,wi.order_item_id,o2.system_id AS product_id, o1.system_id AS variation_id,iu.name,iu.price,iu.qty,iu.amount,iu.num_order  FROM wp_integration_one_s_orders_items_update AS iu 
	LEFT JOIN wp_integration_one_s_objects AS o1
	ON o1.guid=iu.guid_object
	LEFT JOIN wp_integration_one_s_objects AS o2
	ON o2.guid=o1.parent_guid
	LEFT JOIN wp_woocommerce_order_items AS wi
	ON wi.order_id=iu.num_order AND wi.order_item_name=iu.name AND wi.order_item_type='line_item'
	CROSS JOIN (
		SELECT '_qty' meta_key
		UNION ALL
		SELECT '_product_id' meta_key
		UNION ALL
		SELECT'_variation_id' meta_key
	) t
	WHERE iu.type='variable' AND o1.id IS NOT NULL AND o2.id IS NOT NULL
) AS x


Еще раз спасибо!
...
Рейтинг: 0 / 0
02.11.2014, 00:03:20
    #38794067
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизировать запрос
Nezhnayka,

Еще попробуйте подзапрос с тремя константами не прятать так глубоко, а приджойнить уже после UNION ALL. Не могу сходу сказать как будет быстрее.

Еще непонятно - o1.id IS NOT NULL AND o2.id IS NOT NULL не сочетается с LEFT JOIN этих таблиц. Либо условие лишнее, либо слово LEFT лишнее.
...
Рейтинг: 0 / 0
02.11.2014, 00:21:20
    #38794074
Nezhnayka
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизировать запрос
miksoftЕще попробуйте подзапрос с тремя константами не прятать так глубоко, а приджойнить уже после UNION ALL.

ок, попробую, но уже наверное завтра.

miksoftЕще непонятно - o1.id IS NOT NULL AND o2.id IS NOT NULL не сочетается с LEFT JOIN этих таблиц. Либо условие лишнее, либо слово LEFT лишнее.

Да, все верно, LEFT лишнее, на быструю руку крутил это запрос, очень сырой выложил, потому что сразу задумался над вопросом, который здесь решали.
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Оптимизировать запрос / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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