Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Ускорение left join / 21 сообщений из 21, страница 1 из 1
17.11.2016, 09:08
    #39348812
Ускорение left join
Ребята, выручайте! Строк в таблице более 30000, найти связанных с ними нужно в 10 раз больше, при этом одна из найденных вообще ничего не должна содержать. Определяя последнее можно было бы сократить искомые строки в 6 раз, то есть до 5000.

Делаю так:
select doc.id, doc.pagetitle, pospages_h1.value pospages_h1, pospages_linkname.value pospages_linkname, pospages_name.value pospages_name, pospages_type.value pospages_type, pospages_shosse.value pospages_shosse, pospages_areas.value pospages_areas, pospages_regions.value pospages_regions, poselki.value poselki, pospages_naspunkt.value pospages_naspunkt from modx_site_content doc left join modx_site_tmplvar_contentvalues pospages_h1 on doc.id = pospages_h1.contentid and pospages_h1.tmplvarid = 184 left join modx_site_tmplvar_contentvalues pospages_linkname on doc.id = pospages_linkname.contentid and pospages_linkname.tmplvarid = 301 left join modx_site_tmplvar_contentvalues pospages_name on doc.id = pospages_name.contentid and pospages_name.tmplvarid = 186 left join modx_site_tmplvar_contentvalues pospages_type on doc.id = pospages_type.contentid and pospages_type.tmplvarid = 166 left join modx_site_tmplvar_contentvalues pospages_shosse on doc.id = pospages_shosse.contentid and pospages_shosse.tmplvarid = 170 left join modx_site_tmplvar_contentvalues pospages_areas on doc.id = pospages_areas.contentid and pospages_areas.tmplvarid = 167 left join modx_site_tmplvar_contentvalues pospages_regions on doc.id = pospages_regions.contentid and pospages_regions.tmplvarid = 168 left join modx_site_tmplvar_contentvalues poselki on doc.id = poselki.contentid and poselki.tmplvarid = 161 left join modx_site_tmplvar_contentvalues pospages_naspunkt on doc.id = pospages_naspunkt.contentid and pospages_naspunkt.tmplvarid = 413 where doc.parent = 3030 and doc.published = 1 and doc.deleted = 0 and pospages_naspunkt.value is null and doc.template = 39


Из этого должно быть ясно, что не нужны строки, связанные с таблицей с псевдонимом pospages_naspunkt при этом содержащие что либо. Пробовал not exists, но загрузка была бесконечная, я так и не дождался.
...
Рейтинг: 0 / 0
17.11.2016, 09:22
    #39348819
Ускорение left join
Забыл привести статистику. Данный запрос обрабатывается за полторы секунды, что критично, так как и без того имеется 1 секунда на другие. Да, ещё мне нужно не отсеивать эти 25000 ресурсов и работать с этими данными, но я пока откладываю это из-да слишком затяжной обработки. Может я что- то делаю не так? Ведь выходит, что нужно дробить таблицы, а это критично при использовании modx.
...
Рейтинг: 0 / 0
17.11.2016, 09:30
    #39348822
Cosmagnetto
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ускорение left join
Честно говоря трудно понять код не понимая задачу, а именно не видя исходные данные (таблицы)
...
Рейтинг: 0 / 0
17.11.2016, 09:49
    #39348828
Ускорение left join
Cosmagnetto,

Таблицы две используется, одна основа modx_site_content, вторая modx_site_tmplvar_contentvalues хранит параметры, связываемые со строками основной таблицы.
...
Рейтинг: 0 / 0
17.11.2016, 09:57
    #39348833
paver
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ускорение left join
Сергей СавельевСтрок в таблице более 30000, найти связанных с ними нужно в 10 раз больше, при этом одна из найденных вообще ничего не должна содержать. Определяя последнее можно было бы сократить искомые строки в 6 раз, то есть до 5000.

Замечательный поток сознания
...
Рейтинг: 0 / 0
17.11.2016, 10:02
    #39348837
Ускорение left join
paver,

Спасибо, искренне надеюсь на понимание.
...
Рейтинг: 0 / 0
17.11.2016, 10:28
    #39348852
Ускорение left join
Сергей Савельев,

Я, кажется, сам начинаю догадываться. Нужно осуществить
...
Рейтинг: 0 / 0
17.11.2016, 10:32
    #39348856
Ускорение left join
Нужно разделить процесс на два этапа!) В первом искать эти 5000 строк из основной таблицы, после этого составлять такой же как и описанный выше запрос, но только вместо pospages_naspunkt.value is null указать doc.id in (список ранее найденных идентификаторов).

Круто!

Хотелось бы, конечно, в один запрос это всё вынести. Не подскажете как это сделать?
...
Рейтинг: 0 / 0
17.11.2016, 10:48
    #39348864
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ускорение left join
Прочитал несколько раз... НХНП.

PS. Нашёл тег спойлера - найди теперь ещё и тег кода. А заодно почитай про форматирование кода и алиасы таблиц.
...
Рейтинг: 0 / 0
17.11.2016, 10:55
    #39348875
Ускорение left join
Akina,

А я прочитал несколько раз твой ник и у меня тоже НХНП)
...
Рейтинг: 0 / 0
17.11.2016, 11:25
    #39348897
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ускорение left join
У меня с ником проблем нет. А у тебя с запросом - есть. И судя по желанию "разделить на два этапа" - и дальше будут.
...
Рейтинг: 0 / 0
17.11.2016, 11:33
    #39348909
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ускорение left join
Если сделать вот так:
форматированный код
Код: 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.
select
  doc.id
, doc.pagetitle
, pospages_h1.value pospages_h1
, pospages_linkname.value pospages_linkname
, pospages_name.value pospages_name
, pospages_type.value pospages_type
, pospages_shosse.value pospages_shosse
, pospages_areas.value pospages_areas
, pospages_regions.value pospages_regions
, poselki.value poselki
, pospages_naspunkt.value pospages_naspunkt 

from      modx_site_content doc 
left join modx_site_tmplvar_contentvalues pospages_h1 
	on doc.id = pospages_h1.contentid
	and pospages_h1.tmplvarid = 184 
left join modx_site_tmplvar_contentvalues pospages_linkname 
	on doc.id = pospages_linkname.contentid 
	and pospages_linkname.tmplvarid = 301 
left join modx_site_tmplvar_contentvalues pospages_name 
	on doc.id = pospages_name.contentid 
	and pospages_name.tmplvarid = 186 
left join modx_site_tmplvar_contentvalues pospages_type 
	on doc.id = pospages_type.contentid 
	and pospages_type.tmplvarid = 166 
left join modx_site_tmplvar_contentvalues pospages_shosse 
	on doc.id = pospages_shosse.contentid 
	and pospages_shosse.tmplvarid = 170 
left join modx_site_tmplvar_contentvalues pospages_areas 
	on doc.id = pospages_areas.contentid 
	and pospages_areas.tmplvarid = 167 
left join modx_site_tmplvar_contentvalues pospages_regions 
	on doc.id = pospages_regions.contentid 
	and pospages_regions.tmplvarid = 168 
left join modx_site_tmplvar_contentvalues poselki 
	on doc.id = poselki.contentid 
	and poselki.tmplvarid = 161 
left join modx_site_tmplvar_contentvalues pospages_naspunkt 
	on doc.id = pospages_naspunkt.contentid 
	and pospages_naspunkt.tmplvarid = 413 
	
where doc.parent = 3030 
and doc.published = 1 
and doc.deleted = 0 
and pospages_naspunkt.value is null 
and doc.template = 39



то сразу понимаешь, что нужно хотя бы переместить соединение с таблицей pospages_naspunkt ближе к началу, или даже её вместе с основной таблицей завернуть в подзапрос, если, как ты утверждаешь, по этому признаку селективность приличная.
...
Рейтинг: 0 / 0
17.11.2016, 11:36
    #39348912
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ускорение left join
Кстати, нафига тебе в выходном наборе pospages_naspunkt.value, если согласно условию отбора оно строго is null?
...
Рейтинг: 0 / 0
17.11.2016, 15:09
    #39349168
Ускорение left join
Akinaеё вместе с основной таблицей завернуть в подзапрос
Приведи, пожалуйста, пример.

Akinaнафига тебе в выходном наборе pospages_naspunkt.value, если согласно условию отбора оно строго is null
Говоря человеческим языком, нужно получить ресурсы без населённого пункта, которых всего 5000. Но, на самом деле, я решил эту проблему, за счёт двух этапов, теперь загрузка с полутора секунд снизилась до 200 миллисекунд, хотя я понимаю, что при использовании подзапроса есть вероятность свести её к минимуму. Вопрос сейчас стоит другой, как получить все 30000 ресурсов со всеми параметрами, в том числе и населённым пунктом, при этом не ожидая 2 секунды?
...
Рейтинг: 0 / 0
17.11.2016, 15:11
    #39349169
Ускорение left join
Akina, спасибо тебе, кстати, что, хотя бы, уделил столько времени моей безграмотности в подобных обстоятельствах.
...
Рейтинг: 0 / 0
17.11.2016, 15:15
    #39349173
Ускорение left join
AkinaКстати, нафига тебе в выходном наборе pospages_naspunkt.value, если согласно условию отбора оно строго is null?
Не сразу догнал. Это программное формирование, я просто не дорабатывал класс, я формирую этот запрос за счёт строки:
Код: php
1.
api::getResources('', ['id', 'pagetitle', 'pospages_h1', 'pospages_linkname', 'pospages_name', 'pospages_type', 'pospages_shosse', 'pospages_areas', 'pospages_regions', 'poselki', 'pospages_naspunkt'], 'pospages_naspunkt.value is null and doc.template = 39')

Примерное его содержание можно представить, но, если интересно, могу опубликовать код.
...
Рейтинг: 0 / 0
17.11.2016, 15:36
    #39349194
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ускорение left join
Сергей СавельевПриведи, пожалуйста, пример.
Попробуй вот такие тексты:
перенос
Код: 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.
select
  doc.id
, doc.pagetitle
, pospages_h1.value pospages_h1
, pospages_linkname.value pospages_linkname
, pospages_name.value pospages_name
, pospages_type.value pospages_type
, pospages_shosse.value pospages_shosse
, pospages_areas.value pospages_areas
, pospages_regions.value pospages_regions
, poselki.value poselki
, pospages_naspunkt.value pospages_naspunkt 

from      modx_site_content doc 
-- перенос таблицы в начало цепи связывания
left join modx_site_tmplvar_contentvalues pospages_naspunkt 
	on doc.id = pospages_naspunkt.contentid 
	and pospages_naspunkt.tmplvarid = 413 
left join modx_site_tmplvar_contentvalues pospages_h1 
	on doc.id = pospages_h1.contentid
	and pospages_h1.tmplvarid = 184 
left join modx_site_tmplvar_contentvalues pospages_linkname 
	on doc.id = pospages_linkname.contentid 
	and pospages_linkname.tmplvarid = 301 
left join modx_site_tmplvar_contentvalues pospages_name 
	on doc.id = pospages_name.contentid 
	and pospages_name.tmplvarid = 186 
left join modx_site_tmplvar_contentvalues pospages_type 
	on doc.id = pospages_type.contentid 
	and pospages_type.tmplvarid = 166 
left join modx_site_tmplvar_contentvalues pospages_shosse 
	on doc.id = pospages_shosse.contentid 
	and pospages_shosse.tmplvarid = 170 
left join modx_site_tmplvar_contentvalues pospages_areas 
	on doc.id = pospages_areas.contentid 
	and pospages_areas.tmplvarid = 167 
left join modx_site_tmplvar_contentvalues pospages_regions 
	on doc.id = pospages_regions.contentid 
	and pospages_regions.tmplvarid = 168 
left join modx_site_tmplvar_contentvalues poselki 
	on doc.id = poselki.contentid 
	and poselki.tmplvarid = 161 
left join modx_site_tmplvar_contentvalues pospages_naspunkt 
	on doc.id = pospages_naspunkt.contentid 
	and pospages_naspunkt.tmplvarid = 413 
	
where doc.parent = 3030 
and doc.published = 1 
and doc.deleted = 0 
and pospages_naspunkt.value is null 
and doc.template = 39


подзапрос
Код: 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.
55.
56.
57.
select
  doc.id
, doc.pagetitle
, pospages_h1.value pospages_h1
, pospages_linkname.value pospages_linkname
, pospages_name.value pospages_name
, pospages_type.value pospages_type
, pospages_shosse.value pospages_shosse
, pospages_areas.value pospages_areas
, pospages_regions.value pospages_regions
, poselki.value poselki
, doc.value pospages_naspunkt 

from
-- выносим в подзапрос
	(
	SELECT
	  m.id
	, m.pagetitle
	, p.value 
	FROM modx_site_content m
	LEFT JOIN modx_site_tmplvar_contentvalues p 
		ON m.id = p.contentid 
		AND p.tmplvarid = 413 
	WHERE p.value is null
	AND m.parent = 3030 
	AND m.published = 1 
	AND m.deleted = 0 
	AND m.template = 39
	) doc
left join modx_site_tmplvar_contentvalues pospages_h1 
	on doc.id = pospages_h1.contentid
	and pospages_h1.tmplvarid = 184 
left join modx_site_tmplvar_contentvalues pospages_linkname 
	on doc.id = pospages_linkname.contentid 
	and pospages_linkname.tmplvarid = 301 
left join modx_site_tmplvar_contentvalues pospages_name 
	on doc.id = pospages_name.contentid 
	and pospages_name.tmplvarid = 186 
left join modx_site_tmplvar_contentvalues pospages_type 
	on doc.id = pospages_type.contentid 
	and pospages_type.tmplvarid = 166 
left join modx_site_tmplvar_contentvalues pospages_shosse 
	on doc.id = pospages_shosse.contentid 
	and pospages_shosse.tmplvarid = 170 
left join modx_site_tmplvar_contentvalues pospages_areas 
	on doc.id = pospages_areas.contentid 
	and pospages_areas.tmplvarid = 167 
left join modx_site_tmplvar_contentvalues pospages_regions 
	on doc.id = pospages_regions.contentid 
	and pospages_regions.tmplvarid = 168 
left join modx_site_tmplvar_contentvalues poselki 
	on doc.id = poselki.contentid 
	and poselki.tmplvarid = 161 
left join modx_site_tmplvar_contentvalues pospages_naspunkt 
	on doc.id = pospages_naspunkt.contentid 
	and pospages_naspunkt.tmplvarid = 413 

...
Рейтинг: 0 / 0
17.11.2016, 15:37
    #39349195
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ускорение left join
Сергей Савельевесли интересно, могу опубликовать кодНет, неинтересно.
...
Рейтинг: 0 / 0
17.11.2016, 15:40
    #39349198
Ускорение left join
Akina,

Доходчиво, спасибо!
...
Рейтинг: 0 / 0
17.11.2016, 22:30
    #39349507
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ускорение left join
Сергей СавельевНужно разделить процесс на два этапа!) В первом искать эти 5000 строк из основной таблицы, после этого составлять ?


зачем вам 5 тысяч строк?
...
Рейтинг: 0 / 0
18.11.2016, 08:41
    #39349588
Ускорение left join
MasterZivзачем вам 5 тысяч строк?

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


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