Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.06.2018, 18:54   #1
polin11
Форумчанин
 
Регистрация: 07.06.2015
Сообщений: 164
По умолчанию Медленный запрос для 2 больших таблиц

Есть 2 таблицы Table1 (1 млн записей) и Тable2 (10 млн записей)
Свзяь между таблицами один ко многим.
Нужно вытащить определнное колчичество записей, например 100 из Table1,
следующим запросом:
Код:
SELECT *
FROM Table1
WHERE Field1 IN (SELECT Field1 FROM Table2  WHERE Field2 = 'val1' GROUP BY Field1 )
AND Field2='val2'
ORDER BY Field3
LIMIT 100
Можно переписать так:
Код:
SELECT *
FROM Table1
INNER JOIN Table2 ON Table1.Field1=Table2.Field1
WHERE Table2.Field2 = 'val1'
AND Table1.Field2='val2'
GROUP BY Table1.Field1
ORDER BY Table1.Field3
LIMIT 100
Но оба запроса выполняются медленно.
Хочется из вложенного запроса делать выборку не всей таблицы Table2 по фильтру Field2 = 'val1',
а только 100 записей, например
Код:
SELECT *
FROM Table1
WHERE Field1 IN (SELECT Field1 FROM Table2  WHERE Field2 = 'val1' GROUP BY Field1 LIMIT 100)
AND Field2='val2'
ORDER BY Field3
но так как есть условие Table1.Field2='val2', то этот запрос неверный. Может есть
стандартное решение аналогичной проблемы?
polin11 вне форума Ответить с цитированием
Старый 30.06.2018, 19:04   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

А какие индексы есть у таблиц?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 30.06.2018, 19:34   #3
polin11
Форумчанин
 
Регистрация: 07.06.2015
Сообщений: 164
По умолчанию

Я не хочу затрагивать вопрос индексов, пока хочу узнать, можно ли улучшить структуру запроса
polin11 вне форума Ответить с цитированием
Старый 30.06.2018, 21:51   #4
xxbesoxx
Участник клуба
 
Регистрация: 10.08.2010
Сообщений: 1,389
По умолчанию

Цитата:
Сообщение от polin11 Посмотреть сообщение
можно ли улучшить структуру запроса
А структуру БД не надо показать какие там связь между таблицами ? или вы это тоже не хотите затрагивать ?
xxbesoxx вне форума Ответить с цитированием
Старый 30.06.2018, 22:46   #5
polin11
Форумчанин
 
Регистрация: 07.06.2015
Сообщений: 164
По умолчанию

Table1 таблица из 4 полей, Field1 - первичный ключ тип bigint, остальные поля типа text. Связана отношением 1 ко многим с Table2, поле Field1 для второй таблицы внешний ключ тип также bigint.
polin11 вне форума Ответить с цитированием
Старый 30.06.2018, 22:54   #6
xxbesoxx
Участник клуба
 
Регистрация: 10.08.2010
Сообщений: 1,389
По умолчанию

Цитата:
Сообщение от polin11 Посмотреть сообщение
Table1 таблица из 4 полей, Field1 - первичный ключ тип bigint, остальные поля типа text.
Не будет это не кто читать .! Надо было начинать предоставить все таблицы в виде Create table...
xxbesoxx вне форума Ответить с цитированием
Старый 30.06.2018, 23:04   #7
polin11
Форумчанин
 
Регистрация: 07.06.2015
Сообщений: 164
По умолчанию

Спасибо за неоценимую помощь
polin11 вне форума Ответить с цитированием
Старый 01.07.2018, 16:14   #8
psycho-coder
Участник клуба
 
Аватар для psycho-coder
 
Регистрация: 06.04.2009
Сообщений: 1,524
По умолчанию

От подзапроса лучше избавиться, он неизвестно сколько раз может выполниться, при этом в explain все будет хорошо. На данном этапе без индексов проблему медленности не решить.
Смотрите в explain и проставляете индексы.
Если не нравится join, то сделайте два запроса, сначала по table2, а потом по результатам из table1 с помощью where in (...) и т.д.
psycho-coder вне форума Ответить с цитированием
Старый 10.07.2018, 12:37   #9
IliaIT
Форумчанин
 
Аватар для IliaIT
 
Регистрация: 17.03.2009
Сообщений: 979
По умолчанию

конечно понимаю, что может не помочь, но попробуйте поменять местами условия и убрать бесполезную сортировку (оно вам без разницы как проверяться будет по второй таблице).
Код:
SELECT *
FROM Table1
WHERE 
Table1.Field2='val2' AND 
Table1.Field1 IN (SELECT Table2.Field1 FROM Table2  WHERE Table2.Field2 = 'val1' )
ORDER BY Table1.Field3
LIMIT 100
очень часто тормоз возникает при плохих индексах. так что возможно будет быстрее если убрать совсем сортировку.
Код:
SELECT *
FROM Table1
WHERE 
Table1.Field2='val2' AND 
Table1.Field1 IN (SELECT Table2.Field1 FROM Table2  WHERE Table2.Field2 = 'val1'  )
LIMIT 100
Интуитивно понятный интерфейс - это такой интерфейс, для работы с которым нужна недюжинная интуиция.

Последний раз редактировалось IliaIT; 10.07.2018 в 12:42.
IliaIT вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите составить SQL (ADO, Access) запрос для сравнения двух таблиц. yorri БД в Delphi 12 10.02.2018 14:17
аналог ВПР для больших таблиц yurinek Помощь студентам 1 06.02.2017 15:58
Объединение больших таблиц - как ускорить запрос? supermike SQL, базы данных 13 30.11.2014 20:51
Веб-запрос для экспорта нескольких таблиц с сайта vunka Microsoft Office Excel 10 26.07.2013 13:49
Направьте в нужное русло. Сравнение двух больших таблиц Excel hijke Microsoft Office Excel 6 05.05.2011 13:24