Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

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

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

Ответ
 
Опции темы
Старый 30.06.2018, 19:54   #1
polin11
Форумчанин
 
Регистрация: 07.06.2015
Сообщений: 86
Репутация: -53
По умолчанию Медленный запрос для 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, 20:04   #2
Аватар
Модератор
Заслуженный модератор
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Адрес: Северодонецк.ua
Сообщений: 17,900
Репутация: 6285
По умолчанию

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

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

Цитата:
Сообщение от polin11 Посмотреть сообщение
можно ли улучшить структуру запроса
А структуру БД не надо показать какие там связь между таблицами ? или вы это тоже не хотите затрагивать ?
__________________
E_MAIL: rijgvina7@yahoo.com
xxbesoxx вне форума   Ответить с цитированием
Старый 30.06.2018, 23:46   #5
polin11
Форумчанин
 
Регистрация: 07.06.2015
Сообщений: 86
Репутация: -53
По умолчанию

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

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

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

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

конечно понимаю, что может не помочь, но попробуйте поменять местами условия и убрать бесполезную сортировку (оно вам без разницы как проверяться будет по второй таблице).
Код:

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 в 13:42.
IliaIT вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

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


05:17.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru