errorstalker

Пользователь

Регистрация: 01.11.2013

Сообщения: 3161

Рейтинг: 1295

errorstalker

Регистрация: 01.11.2013

Сообщения: 3161

Рейтинг: 1295

img

В общем есть задача, сделать выборку из таблицы 1, на основе значений из таблицы 2

Кажись проще некуда, делай и не ворчи.

Но, в первой таблице - 100 000 строк, во второй 1 000 строк.

Вот код (нам надо получить значения полей - айди, имя, фамилия .... из таблицы 1 для тех id которые совпадают с id из второй таблицы, и где для этих id в колонке логин равно админ):

SELECT t1.id,t1.name,t1.sname,t1.city,t1.street,t1.flat,t1.email,t1.hphone,t1.mphone,

FROM t2 INNER JOIN t1

ON (t2.id = t1.id)

WHERE (t2.login = 'admin');

Оно даже как бы работает, и даже правильно работает.

Но блин ОЧЕНЬ медленно.

Запрос c результатом в 800 строк, оно делает за 3.4 секунды, в виде чистого запроса в БД.

А если смотреть на странице (yii2 -> GridWiev), то там и все 4.2 секунды.

В общем вопрос - с запросом все ок, и данная скорость норм, или я где то фигни наделал ?

dbchecker

Пользователь

Регистрация: 14.10.2020

Сообщения: 6543

Рейтинг: 6561

dbchecker

Регистрация: 14.10.2020

Сообщения: 6543

Рейтинг: 6561

img

недавно какой-то видос видел про индексацию, посмотри, мб поможет 

Спойлер

enedora

Пользователь

Регистрация: 02.01.2022

Сообщения: 473

Рейтинг: 262

enedora

Регистрация: 02.01.2022

Сообщения: 473

Рейтинг: 262

SELECT t1.id,t1.name,t1.sname,t1.city,t1.street,t1.flat,t1.email,t1.hphone,t1.mphone

FROM t1

WHERE login in (select login from t2 WHERE login = 'admin')

 

Попробуй так, точный синтаксис мб с ошибками, но логику думаю ты понял. А так в принципе 3-4 сек для 100к строк это норм

 

errorstalker

Пользователь

Регистрация: 01.11.2013

Сообщения: 3161

Рейтинг: 1295

errorstalker

Регистрация: 01.11.2013

Сообщения: 3161

Рейтинг: 1295

img
enedora сказал(а):

SELECT t1.id,t1.name,t1.sname,t1.city,t1.street,t1.flat,t1.email,t1.hphone,t1.mphone

FROM t1

WHERE login in (select login from t2 WHERE login = 'admin')

 

Попробуй так, точный синтаксис мб с ошибками, но логику думаю ты понял. А так в принципе 3-4 сек для 100к строк это норм

 

Нажмите, чтобы раскрыть...

Ок, понял, буду пробовать.

enedora сказал(а):

SELECT t1.id,t1.name,t1.sname,t1.city,t1.street,t1.flat,t1.email,t1.hphone,t1.mphone

FROM t1

WHERE login in (select login from t2 WHERE login = 'admin')

 

Попробуй так, точный синтаксис мб с ошибками, но логику думаю ты понял. А так в принципе 3-4 сек для 100к строк это норм

 

Нажмите, чтобы раскрыть...

В общем разница мизерная, можно сказать что результат идентичный.

Александр

Почетный пользователь

Регистрация: 10.08.2013

Сообщения: 5400

Рейтинг: 4246

Александр

Регистрация: 10.08.2013

Сообщения: 5400

Рейтинг: 4246

А какая причина, что у тебя две таблицы разбиты таким образом, что они совпадают по ID?

Если вложенный запрос выполняется миллиард лет, делай два запроса

Тем более, что ты не делаешь выборку из таблицы t2

 

Получаешь все id из t2

select id from t2

  where login = 'admin'

 

Потом формируешь все id из первого запроса в массив и далее

select id, name, sname, city, street, flat, email, hphone, mphone from t1

  where id is (:ids)

 

Где :ids - твои id из 1-го запроса

 

Skyfallgg

Пользователь

Регистрация: 12.09.2018

Сообщения: 1418

Рейтинг: 1483

Skyfallgg

Регистрация: 12.09.2018

Сообщения: 1418

Рейтинг: 1483

errorstalker сказал(а):

В общем есть задача, сделать выборку из таблицы 1, на основе значений из таблицы 2

Кажись проще некуда, делай и не ворчи.

Но, в первой таблице - 100 000 строк, во второй 1 000 строк.

Вот код (нам надо получить значения полей - айди, имя, фамилия .... из таблицы 1 для тех id которые совпадают с id из второй таблицы, и где для этих id в колонке логин равно админ):

SELECT t1.id,t1.name,t1.sname,t1.city,t1.street,t1.flat,t1.email,t1.hphone,t1.mphone,

FROM t2 INNER JOIN t1

ON (t2.id = t1.id)

WHERE (t2.login = 'admin');

Оно даже как бы работает, и даже правильно работает.

Но блин ОЧЕНЬ медленно.

Запрос c результатом в 800 строк, оно делает за 3.4 секунды, в виде чистого запроса в БД.

А если смотреть на странице (yii2 -> GridWiev), то там и все 4.2 секунды.

В общем вопрос - с запросом все ок, и данная скорость норм, или я где то фигни наделал ?

Нажмите, чтобы раскрыть...

Проиндексируй чудик 

Александр

Почетный пользователь

Регистрация: 10.08.2013

Сообщения: 5400

Рейтинг: 4246

Александр

Регистрация: 10.08.2013

Сообщения: 5400

Рейтинг: 4246

Хотя не верится, что такой простой запрос выполняется 3 секунды. Мб у тебя окружение настроено через жопу, или конфиг сервера кал

Skyfallgg сказал(а):

Проиндексируй чудик 

Нажмите, чтобы раскрыть...

Или индексация, да

errorstalker

Пользователь

Регистрация: 01.11.2013

Сообщения: 3161

Рейтинг: 1295

errorstalker

Регистрация: 01.11.2013

Сообщения: 3161

Рейтинг: 1295

img
Skyfallgg сказал(а):

Проиндексируй чудик 

Нажмите, чтобы раскрыть...

У меня условно нету доступа к БД, есть копия БД, а отдать я должен только код который будет делать выборку... (

Максим Феофилов

Пользователь

Регистрация: 06.09.2018

Сообщения: 93

Рейтинг: 19

Максим Феофилов

Регистрация: 06.09.2018

Сообщения: 93

Рейтинг: 19

errorstalker сказал(а):

У меня условно нету доступа к БД, есть копия БД, а отдать я должен только код который будет делать выборку... (

Нажмите, чтобы раскрыть...

Индексы на таблицах засвети. 

cappello paglia

Пользователь

Регистрация: 23.02.2022

Сообщения: 102

Рейтинг: 60

cappello paglia

Регистрация: 23.02.2022

Сообщения: 102

Рейтинг: 60

img

https://dev.mysql.com/blog-archive/mysql-explain-analyze/

https://habr.com/ru/post/31129/

А вообще, разве не странно то, что ты сравниваешь обычные id из двух разных таблиц?

Skyfallgg

Пользователь

Регистрация: 12.09.2018

Сообщения: 1418

Рейтинг: 1483

Skyfallgg

Регистрация: 12.09.2018

Сообщения: 1418

Рейтинг: 1483

Создай некластерный индекс на те колонки которые нужны кодом и скинь вместе со своим кодом, в чем проблема ? Пускай сами его ранят 

ke1evra

Пользователь

Регистрация: 25.12.2012

Сообщения: 1341

Рейтинг: 1205

ke1evra

Регистрация: 25.12.2012

Сообщения: 1341

Рейтинг: 1205

img
errorstalker сказал(а):

Но, в первой таблице - 100 000 строк, во второй 1 000 строк.

Нажмите, чтобы раскрыть...

это всё ваши шиндоусы. джоин 100к и 1к это пыль. в любом случае на поле login нужно вешать индекс.

можешь попробовать ещё так:

CREATE TEMPORARY TABLE tt SELECT id FROM t2 WHERE id IN (SELECT id FROM t1) AND login='admin';

SELECT id, name, sname, city, street, flat, email, hphone, mphone FROM t1

WHERE id IN (SELECT id FROM tt)

 

*это если t2 таблица на 100к записей. в противном случае должно даже без индексов всё летать.

 

вообще структура какая-то очень странная, что нужно из таблицы логов выдирать юзера. user_id должен присутствовать в t1 по дизайну

Zacateca

Пользователь

Регистрация: 22.12.2017

Сообщения: 34330

Рейтинг: 13380

Нарушения: 25

Zacateca

Регистрация: 22.12.2017

Сообщения: 34330

Рейтинг: 13380

Нарушения: 25

самый кайф, как вы будете искать адреса/телефоны админов этим запросом, когда ваша БД упадёт? FeelsAmazingMan.png?1592047295