Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Оптимизировать запрос / 16 сообщений из 16, страница 1 из 1
22.10.2015, 14:22:37
    #39083596
treamz
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизировать запрос
Добрый день! Подскажите, каким образом можно оптимизировать запрос.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
 
EXPLAIN  SELECT c.count,
b.anketa_url, b.growth, b.weight, d.city, b.city as city_id, b.birthday, b.sex, a.id as user_id, a.create_datetime, a.firstname as name, a.last_datetime, c.image_name, c.ext
FROM wa_contact a
JOIN wa_contact_malinku b ON (a.id = b.contact_id)
LEFT OUTER JOIN (
SELECT *, count(*) as count FROM (SELECT * FROM wa_contact_foto ORDER BY sort asc) t group BY contact_id
) as c ON c.contact_id = a.id
JOIN wa_contact_city d ON (b.city = d.id)
ORDER BY a.create_datetime DESC



Проблема в том, для выборки фотки юзера перебирается весь массив данных, но присвоить WHERE contact_id = user_id не получается. Есть ли возможность передать внутри цикла эту переменную или иным способом оптимизировать запрос? С таким просто раньше не сталкивался, поэтому обращаюсь в Вам
...
Рейтинг: 0 / 0
22.10.2015, 15:01:04
    #39083694
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизировать запрос
1) Убрать самый внутренний подзапрос;
2) Заменить звезду в подзапросе на список конкретных полей.
Это для начала.
...
Рейтинг: 0 / 0
22.10.2015, 15:29:09
    #39083778
treamz
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизировать запрос
Есть ли смысл отказаться от этого внутреннего запроса и заменить его циклом в foreach? На сколько выигрыша будет эта замена, учитывая допустим записей 50к в базе wa_contact_foto. LIMIT 10
...
Рейтинг: 0 / 0
22.10.2015, 15:56:11
    #39083840
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизировать запрос
Внутренний подзапрос не имеет смысла В ПРИНЦИПЕ. Кроме случая, когда необходимо заставить сервер выполнить ненужную для результата дополнительную работу. Скажем, для обогрева помещения...
...
Рейтинг: 0 / 0
22.10.2015, 16:14:53
    #39083864
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизировать запрос
AkinaВнутренний подзапрос не имеет смысла В ПРИНЦИПЕ.Это топикстартер пытается подгадать, чтобы в результат SELECT * FROM ... GROUP BY contact_id попали нужные записи.
...
Рейтинг: 0 / 0
22.10.2015, 16:30:08
    #39083880
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизировать запрос
miksoftтопикстартер пытается подгадать, чтобы в результат SELECT * FROM ... GROUP BY contact_id попали нужные записи.
...
Рейтинг: 0 / 0
22.10.2015, 17:21:18
    #39083957
treamz
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизировать запрос
Да, была такая конструкция поэтому и спрашиваю как рационально подойти и возможно ли в этот внутренний запрос напрямую вставить WHERE contact_id = xxx.
...
Рейтинг: 0 / 0
22.10.2015, 17:44:18
    #39083978
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизировать запрос
Вы лучше попробуйте объяснить, за каким хреном вообще Вы влепили этот самый внутренний запрос...
...
Рейтинг: 0 / 0
22.10.2015, 18:15:45
    #39084007
treamz
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизировать запрос
Я выбираю записи юзеров (их анкет), с фотками (фотки у юзеров отсортированы самостоятельно ими же) + счетчик количества фотографий в этой анкете
...
Рейтинг: 0 / 0
22.10.2015, 18:19:18
    #39084010
treamz
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизировать запрос
Вот визуальный пример https://monosnap.com/file/uDB5MTLzQj9EyBX7k2w1MkjjXZMRGh#
...
Рейтинг: 0 / 0
22.10.2015, 18:26:00
    #39084019
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизировать запрос
treamzЯ выбираю записи юзеров (их анкет), с фотками (фотки у юзеров отсортированы самостоятельно ими же) + счетчик количества фотографий в этой анкете
Внутренний подзапрос:
Код: sql
1.
SELECT * FROM wa_contact_foto ORDER BY sort asc


ничего не подсчитывает. Он тупо выдаёт ВСЕ записи таблицы, да ещё зачем-то сортирует их (причём при передаче вышестоящему подзапросу сортировка будет проигнорирована), а заодно делает невозможным использование индексов. Замена подзапроса на саму таблицу уберёт лишнюю, фактически игнорируемую, операцию, и даст возможность использовать индексы (при наличии, конечно).
...
Рейтинг: 0 / 0
22.10.2015, 18:40:06
    #39084032
treamz
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизировать запрос
Спасибо! Да действительно ненужный запрос. Всеже в итоге можно выбрать только нужный контакт ID из подзапроса? Чтобы избежать выборку всех данных из таблицы? https://monosnap.com/file/efUZFTND4kkk3aF7udK094R2vt210B
...
Рейтинг: 0 / 0
22.10.2015, 18:47:46
    #39084039
Lumix
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизировать запрос
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
select * from wa_contact a
    join wa_contact_malinku b on (b.contact_id = a.id)
    join wa_contact_city c on (c.city = a.id)
    left join 
    (
        select *, count(*) fotoCnt from wa_contact_foto f 
            join (select * from wa_contact 
               order by create_datetime desc 
               limit 10) x 
           on f.contact_id = x.id
           group by 1
           
    ) d on d.contact_id = a.id
    
order by a.create_datetime desc
limit 10
...
Рейтинг: 0 / 0
22.10.2015, 20:07:46
    #39084098
treamz
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизировать запрос
Спасибо всем кто помог!
...
Рейтинг: 0 / 0
23.10.2015, 02:16:07
    #39084221
javajdbc
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизировать запрос
Lumix
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
select * from wa_contact a
    join wa_contact_malinku b on (b.contact_id = a.id)
    join wa_contact_city c on (c.city = a.id)
    left join 
    (
        select *, count(*) fotoCnt from wa_contact_foto f 
            join (select * from wa_contact 
               order by create_datetime desc 
               limit 10) x 
           on f.contact_id = x.id
           group by 1
           
    ) d on d.contact_id = a.id
    
order by a.create_datetime desc
limit 10





...вы же програмный архитектор...
...ну и занимайтесь програмированием...
...что вы людям голову морочите...
...
Рейтинг: 0 / 0
23.10.2015, 02:21:25
    #39084222
javajdbc
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизировать запрос
treamzДобрый день! Подскажите, каким образом можно оптимизировать запрос.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
 
EXPLAIN  SELECT c.count,
b.anketa_url, b.growth, b.weight, d.city, b.city as city_id, b.birthday, b.sex, a.id as user_id, a.create_datetime, a.firstname as name, a.last_datetime, c.image_name, c.ext
FROM wa_contact a
JOIN wa_contact_malinku b ON (a.id = b.contact_id)
LEFT OUTER JOIN (
SELECT *, count(*) as count FROM (SELECT * FROM wa_contact_foto ORDER BY sort asc) t group BY contact_id
) as c ON c.contact_id = a.id
JOIN wa_contact_city d ON (b.city = d.id)
ORDER BY a.create_datetime DESC




Проблема в том, для выборки фотки юзера перебирается весь массив данных, но присвоить WHERE contact_id = user_id не получается. Есть ли возможность передать внутри цикла эту переменную или иным способом оптимизировать запрос? С таким просто раньше не сталкивался, поэтому обращаюсь в Вам

...у вас ошибка по логике запроса: c.image_name и c.ext не определены из-за
нeправильного group by. Для конкретики, четко повторите условие задачи,
особено с указанием какую фотку из нескольких вы хотите взять в поля c.image_name и c.ext
и с указанием : к чему было сказано LIMIT 10.
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Оптимизировать запрос / 16 сообщений из 16, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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