![]() |
|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Пользователь
Регистрация: 13.09.2013
Сообщений: 13
|
![]()
Задача
Есть 3 таблицы(Modx) в 2х из них по 90+ тысяч строк, не суть важно. Проблема в том, что в SELECT'е нужно объединить эти таблицы и вывести отфильтрованные по нескольким условиям (BMW, красная, стоит от 200к) данные. Должно получиться: 2014-11-28-4.png Структура таблиц Таблица 1 `modx_site_content` содержит объекты поиска, допустим, 90к+ записей. В ней столбцы: id, pagetitle(название объекта - уникальный идентификатор) Таблица 2 `modx_site_tmplvar_contentvalues` содержит свойства объектов из 1й таблицы. В ней столбцы: id, value(значение свойства: красная, BMW, 200'000, ...), tmplvarid(тип свойства: цвет, марка, стоимость. Здесь указывается ссылка на таблицу 3), contentid(ссылка на объект(таблица 1), которому принадлежит свойство) Таблица 3 `modx_site_tmplvars` содержит типы свойств. В ней столбцы: id, name(тип свойств: цвет, ...) Проблема У меня получилось сделать только следующим образом: объединить таблицы, выбрать все данные и только потом среди них найти нужные мне. Это занимает 5 секунд(долго) да и очень некрасиво. Какую оптимизацию можно провести, можно ли вытягивать только нужные данные, без предварительной загрузки всей таблицы? Пытался сделать данный запрос с помощью INNER JOIN, не получилось. Что если вытягивать объекты через свойства? НоДобавив в content новый столбец Мой запрос: Хотел попробовать вытянуть через сами свойства нужные мне объекты, но не могу понять как вытянуть несколько свойств: SELECT `value` FROM `modx_site_tmplvar_contentvalues` WHERE `contentid` IN(SELECT `id` FROM `modx_site_content` WHERE `parent` = 1) AND `tmplvarid` = 5 AND `value` = "GRAY"; Системные данные "Профилирование" в MySQL говорит, что 70% времени ушло на отправку данных клиенту. Хотя отправляется всего 30 найденных строк. Или вся таблица? Буду благодарен любым подсказкам, размышлениям. 2014-11-28-3.png 2014-11-28-2.png 2014-11-28-1.png Последний раз редактировалось supermike; 28.11.2014 в 03:33. |
![]() |
![]() |
![]() |
#2 |
Ваш К. О.
Участник клуба
Регистрация: 26.12.2012
Сообщений: 1,671
|
![]()
Кучу вложенных select-ов нужно заменить простым объединением, а поля выбирать с case when tmplvarid = <значение>.
|
![]() |
![]() |
![]() |
#3 | |
Старожил
Регистрация: 17.11.2010
Сообщений: 19,042
|
![]()
Так можно пробовать, не факт что быстрей будет - обилие LEFT JOIN
Код:
Цитата:
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
|
|
![]() |
![]() |
![]() |
#4 | |
Пользователь
Регистрация: 13.09.2013
Сообщений: 13
|
![]() Цитата:
Буду сейчас искать инфу по совету Vapaamies. |
|
![]() |
![]() |
![]() |
#5 |
Старожил
Регистрация: 17.11.2010
Сообщений: 19,042
|
![]()
В таблице modx_site_tmplvar_contentvalues актуально наличие индекса по contentid,tmplvarid
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
|
![]() |
![]() |
![]() |
#6 |
Пользователь
Регистрация: 13.09.2013
Сообщений: 13
|
![]()
Индексацию, конечно же, добавил, его небыло только в столбце VALUE, но добавление не повлияло на производительность.
P.S. проверьте личку. |
![]() |
![]() |
![]() |
#7 |
Пользователь
Регистрация: 13.09.2013
Сообщений: 13
|
![]() |
![]() |
![]() |
![]() |
#8 |
Ваш К. О.
Участник клуба
Регистрация: 26.12.2012
Сообщений: 1,671
|
![]()
Вчера уже спал на ходу, до конца не докумекал. Способ известный, но требует группировки (схлопывания) значений. В современных СУБД то же самое реализуется ключевым словом pivot.
Код:
|
![]() |
![]() |
![]() |
#9 |
Пользователь
Регистрация: 13.09.2013
Сообщений: 13
|
![]()
Спасибо за ответ, открыл для себя pivot, это вещь... На сколько я понимаю, в этом запросе нельзя отфильтровать данные по цвету, к примеру? Ведь таблицы мы создаем на лету и они не существуют.
|
![]() |
![]() |
![]() |
#10 |
Ваш К. О.
Участник клуба
Регистрация: 26.12.2012
Сообщений: 1,671
|
![]() |
![]() |
![]() |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Как сделать запрос к MySQL не зная префикс таблиц? | tim21701 | БД в Delphi | 6 | 29.01.2012 07:44 |
Направьте в нужное русло. Сравнение двух больших таблиц Excel | hijke | Microsoft Office Excel | 6 | 05.05.2011 13:24 |
Объединение 2-х таблиц | newStudent | SQL, базы данных | 2 | 21.04.2011 19:37 |
Как правилно составить запрос из несколких таблиц или запросов | Rebbit | Microsoft Office Access | 1 | 25.07.2010 18:49 |
Как оптимизировать запрос MySQL с выборкой из двух таблиц. | Johnatan | SQL, базы данных | 6 | 13.04.2008 03:10 |