powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Сджойнить 50 таблиц
52 сообщений из 52, показаны все 3 страниц
Сджойнить 50 таблиц
    #39344718
polger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Как будет правильней сделать вывод всей таблицы если она состоит из 50-и столбцов в каждом из которых находятся ключи по которым подключаются таблицы. К одному столбцу подключается одна таблица. Пробовал всё это соеденить джойнами но сервер не переварил такую большую кучу. Как это всё вывести одним запросом с подстановкой данных из подключаемых таблиц?
...
Рейтинг: 0 / 0
Сджойнить 50 таблиц
    #39344736
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Какой смысл это выводить? всё равно глазом не окинешь, на экран не поместишь...
Раздели таблицу на несколько поменьше, сгруппировав столбцы в них по вменяемой логике и объединив их 1:1 к базовой таблице.
...
Рейтинг: 0 / 0
Сджойнить 50 таблиц
    #39344779
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
polgerПробовал всё это соеденить джойнами но сервер не переварил такую большую кучу.Как именно пробовали?
В лимит в 61 джойн не уложились?
...
Рейтинг: 0 / 0
Сджойнить 50 таблиц
    #39344783
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
polger,

Вариант через подзапросы в секции SELECT тоже пробовали?
...
Рейтинг: 0 / 0
Сджойнить 50 таблиц
    #39344785
polger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina по вменяемой логике
Не совсем понял, как это по вменяемой логике?
Постараюсь объяснить.
Это сайт знакомств. Есть таблица users с анкетными данными пользователей. В этой таблице есть около 50 столбцов, например: "город", "страна", "возраст", "рост" и т.п. Всего 50 шт.
Так же есть 50 таблиц где перечислены все параметры. В таблице "город" все города, в таблице "возраст" все возраста и остальное в том же духе.
Соответственно мне на сайте нужно получить все параметры каждого человека.
Как правильно это сделать? С помощью джойнов?
...
Рейтинг: 0 / 0
Сджойнить 50 таблиц
    #39344792
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
polgerКак правильно это сделать?Вариантов, на самом деле, множество.
В т.ч. можно и сразу держать подготовленную денормализованную таблицу с нужными данными. Заодно и быстродействие возрастет при запросах на чтение (и без сканирования таблицы).
...
Рейтинг: 0 / 0
Сджойнить 50 таблиц
    #39344799
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
polgerЕсть таблица users с анкетными данными пользователей. В этой таблице есть около 50 столбцов, например: "город", "страна", "возраст", "рост" и т.п. Всего 50 шт.
Есть физические данные юзера - одна таблица. Место жительства - вторая. Внешние данные - третья. Контакты - четвёртая. Вот это и есть деление по вменяемой логике.
...
Рейтинг: 0 / 0
Сджойнить 50 таблиц
    #39344838
polger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
[quot Akina]polgerВот это и есть деление по вменяемой логике.
Такой вариант не подойдёт, так как все эти таблицы, "город", "возраст" и т.д. заполнены определёнными данными и главная таблица, users, должна содержать лишь идентификаторы для связи. В общем структуру менять однозначно нельзя. Вопрос в том, как с наименьшими временными затратами получить пользователя со всеми подставленными данными. Может я с джойнами что-то не то намудрил, хотя вряд ли, и поэтому сервер сутки думал и так и не окуклился. А может и подзапросы помогут, как советуют выше, правда не представляю как это реализовать... Буду вечером копаться.
...
Рейтинг: 0 / 0
Сджойнить 50 таблиц
    #39344846
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
polgerсервер сутки думал и так и не окуклилсяЛибо не хватает каких-то индексов, либо запрос была написан неправильно. Либо, в крайнем случае, можно явно указать порядок соединения таблиц.
...
Рейтинг: 0 / 0
Сджойнить 50 таблиц
    #39344853
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
polgerТакой вариант не подойдёт, так как все эти таблицы, "город", "возраст" и т.д. заполнены определёнными данными и главная таблица, users, должна содержать лишь идентификаторы для связи.
Так и будет.
polgerобщем структуру менять однозначно нельзя.
Не вижу связи между этими утверждениями.
...
Рейтинг: 0 / 0
Сджойнить 50 таблиц
    #39344885
polger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,

Зачем вообще в данном случае нужно разбивать главную таблицу?
...
Рейтинг: 0 / 0
Сджойнить 50 таблиц
    #39344895
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
polgerЗачем вообще в данном случае нужно разбивать главную таблицу?А затем, что ежели тебе надо посмотреть только сведения о юзере и его контактах, вовсе необязательно будет джойнить таблицы с размером сапог и номером телефона. Чем меньше ненужного дерьма, тем серверу легче.
...
Рейтинг: 0 / 0
Сджойнить 50 таблиц
    #39344898
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В общем, почитай про вертикальный шардинг.
...
Рейтинг: 0 / 0
Сджойнить 50 таблиц
    #39344911
polger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoft,

Если я не ошибаюсь в синтаксисе, пишу с телефона по памяти, то у меня примерно следующее:
SELECT cit.value, cou.value
FROM users u
INNER JOIN table_city cit ON u.city = cit.id
INNER JOIN table_country cou ON u.country = cou.id
... И так 50 раз
Не правильно?
Запросы выполняю в phpmyadmin
В таблице users 20 000 тестовых записей.
...
Рейтинг: 0 / 0
Сджойнить 50 таблиц
    #39344916
Фотография DirksDR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoftpolgerсервер сутки думал и так и не окуклилсяЛибо не хватает каких-то индексов, либо запрос была написан неправильно. Либо, в крайнем случае, можно явно указать порядок соединения таблиц.
Может буферного пула на 50 справочников не хватает?
Я бы попробовал подключить пять раз по 10 справочников, с формированием временных таблиц,
а потом сджойнил бы временные таблицы. ИМХО, за сутки бы сработало:)

П.С. Ни количества записей, ни размера памяти, ни типа СУБД...какой вопрос, такой и ответ.
...
Рейтинг: 0 / 0
Сджойнить 50 таблиц
    #39344918
polger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,

Так в том то и дело, что мне нужно просмотреть ВСЁ, что касается определенного юзера на одной странице. Все параметры за раз.
...
Рейтинг: 0 / 0
Сджойнить 50 таблиц
    #39344921
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
polgerИ так 50 разСфига бы 50?
Сейчас у тебя одна таблица на 50 полей. А будет - основная таблица полей эдак на 10, и связанные с ней ещё, скажем, 4 таблицы тоже полей по 10 каждая. И ежели тебе нужны только данные из основной и двух дополнительных, то остальные две дополнительные вязать не требуется, и джойнить надо будет не полсотни, а всего 30 словарей. А если из этих таблиц тебе надо ещё и не все поля - то и того меньше.
...
Рейтинг: 0 / 0
Сджойнить 50 таблиц
    #39344928
Фотография iv_an_ru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
polgerКак будет правильней сделать вывод всей таблицы если она состоит из 50-и столбцов в каждом из которых находятся ключи по которым подключаются таблицы. К одному столбцу подключается одна таблица. Пробовал всё это соеденить джойнами но сервер не переварил такую большую кучу. Как это всё вывести одним запросом с подстановкой данных из подключаемых таблиц?В виртуозу загрузить :P Иногда бывают запросы по 200Kb длиной, выживает. Вообще, если у вас такая братская могила из свойств, то уже можно начинать думать про RDF, и --- раз сайт знакомств --- просто перегнать данные в FOAF и т.п.
...
Рейтинг: 0 / 0
Сджойнить 50 таблиц
    #39344934
polger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
П.С. Ни количества записей, ни размера памяти, ни типа СУБД...какой вопрос, такой и ответ.[/quot]
Записей 20 000 шт., память 3 гига,

Сервер баз данных
Сервер: Localhost via UNIX socket
Тип сервера: MySQL
Версия сервера: 5.7.16-0ubuntu0.16.04.1 - (Ubuntu)
Версия протокола: 10
Кодировка сервера: UTF-8 Unicode (utf8)

Веб-сервер
Apache/2.4.18 (Ubuntu)
Версия клиента базы данных: libmysql - mysqlnd 5.0.12-dev - 20150407 - $Id: 241ae00989d1995ffcbbf63d579943635faf9972 $
PHP расширение: mysqli Документация
Версия PHP: 7.0.8-0ubuntu0.16.04.3

phpMyAdmin
Информация о версии: 4.5.4.1deb2ubu
...
Рейтинг: 0 / 0
Сджойнить 50 таблиц
    #39344936
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
polgerмне нужно просмотреть ВСЁ, что касается определенного юзера на одной странице. Все параметры за раз.У меня такое впечатление, что ты смотришь для ВСЕХ, а не для одного.
...
Рейтинг: 0 / 0
Сджойнить 50 таблиц
    #39344938
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как вариант, может помочь пред-отбор, т.е. не
Код: sql
1.
2.
3.
4.
5.
6.
7.
SELECT ...
FROM main
  LEFT JOIN vocab1
  LEFT JOIN vocab2
  ...
  LEFT JOIN vocabN
WHERE main.field = 'value'


а
Код: sql
1.
2.
3.
4.
5.
6.
SELECT ...
FROM (SELECT * FROM main WHERE field = 'value') single
  LEFT JOIN vocab1
  LEFT JOIN vocab2
  ...
  LEFT JOIN vocabN
...
Рейтинг: 0 / 0
Сджойнить 50 таблиц
    #39344950
Фотография DirksDR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
polgerSELECT cit.value, cou.value
FROM users u
INNER JOIN table_city cit ON u.city = cit.id
INNER JOIN table_country cou ON u.country = cou.id
... И так 50 раз
Не правильно?
Запросы выполняю в phpmyadmin
В таблице users 20 000 тестовых запи
В таких ситуациях предпочитаю LEFT JOIN, а то можно недосчитаться юзеров.
Проверь индексы, как miksoft советовал.
Попробуй 10 справочников, потом 20 и т.д...
...
Рейтинг: 0 / 0
Сджойнить 50 таблиц
    #39345070
17-77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
polgerЭто сайт знакомств. Есть таблица users с анкетными данными пользователей. В этой таблице есть около 50 столбцов, например: "город", "страна", "возраст", "рост" и т.п. Всего 50 шт.
Так же есть 50 таблиц где перечислены все параметры. В таблице "город" все города, в таблице "возраст" все возраста и остальное в том же духе.
Соответственно мне на сайте нужно получить все параметры каждого человека.
Как правильно это сделать? С помощью джойнов?
пздц это ахтунг, вариантов несколько:
- вынести весь этот треш и сделать по-нормальному - например возраст и рост указывать как поле int и хранить в основной таблице, а потом переписать в других местах, чтоб не использовать справочники для возраста и роста
- отойти от нормальных форм и в основной таблице закэшить все это дело в длинную строку или json, но придется обновлять на каждый чих в двух местах
...
Рейтинг: 0 / 0
Сджойнить 50 таблиц
    #39345106
Cane Cat Fisher
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
17-77сделать по-нормальному - возраст ... указывать как поле int и хранить в основной таблице

И каждый Новый год под звон курантов запускать UPDATE SET Возраст = Возраст + 1 ?
...
Рейтинг: 0 / 0
Сджойнить 50 таблиц
    #39345135
17-77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cane Cat Fisher,
ну зачем вы придираетесь - хранить год или дату рождения и считать на лету
...
Рейтинг: 0 / 0
Сджойнить 50 таблиц
    #39345192
polger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Короче я понял одно. Надо углубляться в познании SQL. =)
Задача не решена, пока.
Но в любом случае спасибо за активную помощь всем. Такой отзывчивости я не ожидал.
...
Рейтинг: 0 / 0
Сджойнить 50 таблиц
    #39345209
Злой Бобр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
polgerКороче я понял одно. Надо углубляться в познании SQL. =)
Задача не решена, пока.
Но в любом случае спасибо за активную помощь всем. Такой отзывчивости я не ожидал.
Вам нужно всего 2 вещи:
- переделать структуру как уже выше говорили
- понять что выводить сразу 20к записей еще тот бред. Вы можете экспортировать данные в эксель и там их просматривать. Мускул это БД а не клиент. Разбейте вывод по 10-20 записей на страницу и будет вам счастье в том же мускуле.

P.S.
Улыбнуло хранение возраста и т.п. в отдельных таблицах.
...
Рейтинг: 0 / 0
Сджойнить 50 таблиц
    #39345214
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Злой БобрУлыбнуло хранение возраста и т.п. в отдельных таблицах.А что в этом плохого? ну или хотя бы просто необычного? речь ведь не идёт об отдельной таблице для хранения только возраста...
...
Рейтинг: 0 / 0
Сджойнить 50 таблиц
    #39345243
Злой Бобр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akina,

Ну обычно в таблице ставят поле дата и указывают для каждой записи дату рождения. Возраст считается уже исходя из разницы текущей даты и даты рождения. У автора же извращенный EAV. В принципе ничего особенного - стандартная ошибка "студента". Поэтому и улыбнуло а не подорвало.
...
Рейтинг: 0 / 0
Сджойнить 50 таблиц
    #39345245
Злой Бобр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akina... речь ведь не идёт об отдельной таблице для хранения только возраста...
У автора как раз это и есть. )))
...
Рейтинг: 0 / 0
Сджойнить 50 таблиц
    #39345273
polger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Итак опыт "студента" показал.
Дописал я запрос до 26 джоинов, 50 - это я утрировал, осталось дописать подключение шести таблиц многое к многому но я не об этом.
Заменил я INNER на LEFT, как советовал DirksDR и всё отработало за пол секунды (запросы делаю в phpmyadmin со стандартным выводом в 25 записей на страницу).
Ради чистоты эксперимента заменил на INNER, запрос обрабатываться будет до следующего пришествия. Процессор пашет на 100%.
Вот объясните знатоки, почему такая разница во времени исполнения? Разницу между INNER и LEFT я понимаю, мне как раз и нужно, что бы в результате были все пользователи не зависимо от заполненности данными.
И про структуру, пожалуйста, ничего не говорите, так надо =)
...
Рейтинг: 0 / 0
Сджойнить 50 таблиц
    #39345275
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
polgerКороче я понял одно. Надо углубляться в познании SQL. =)
Задача не решена, пока.
Но в любом случае спасибо за активную помощь всем. Такой отзывчивости я не ожидал.

А не проще пока суть да дело, за раз выбирать не все 50 атрибутов, а какую-то их часть одним запросом, другую часть следующим, ну и т.д.
...
Рейтинг: 0 / 0
Сджойнить 50 таблиц
    #39345289
polger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
schi,

Я первый =)
Вопрос ко всем: Будет ли мной вышесказанное означать, что когда количество данных удвоится, то и удвоится время обработки этого запроса?
...
Рейтинг: 0 / 0
Сджойнить 50 таблиц
    #39345303
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
polger Вот объясните знатоки, почему такая разница во времени исполнения? Разницу между INNER и LEFT я понимаю, мне как раз и нужно, что бы в результате были все пользователи не зависимо от заполненности данными.В INNER оптимизатор волен выбирать любой порядок соединения таблиц. При 50 джойнах возникает 51! комбинаций последовательности таблиц. Это явно слишком много и оптимизатор скорее всего выбирает не тот вариант.
А при LEFT порядок соединения таблиц всегда четко определен, ведущая слева. И оптимизатору просто не остается пространства для неверного выбора.
...
Рейтинг: 0 / 0
Сджойнить 50 таблиц
    #39345304
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
polgermiksoft,

Если я не ошибаюсь в синтаксисе, пишу с телефона по памяти, то у меня примерно следующее:
SELECT cit.value, cou.value
FROM users u
INNER JOIN table_city cit ON u.city = cit.id
INNER JOIN table_country cou ON u.country = cou.id
... И так 50 раз
Не правильно?
Запросы выполняю в phpmyadmin
В таблице users 20 000 тестовых записей.Еще должно быть условие на таблицу users в секции WHERE, иначе это будет выборка всех пользователей с огромными затратами.
...
Рейтинг: 0 / 0
Сджойнить 50 таблиц
    #39345306
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
polgerВопрос ко всем: Будет ли мной вышесказанное означать, что когда количество данных удвоится, то и удвоится время обработки этого запроса?Нет, при правильной индексации время выполнения такого рода запросов растет примерно логарифмически (пока хватает всяких кэшей и буферов.) относительно количества данных, что значительно медленнее, чем линейно.
...
Рейтинг: 0 / 0
Сджойнить 50 таблиц
    #39345339
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoftВ INNER оптимизатор волен выбирать любой порядок соединения таблиц.Если не использовать STRAIGHT_JOIN - а в данном случае его лучше таки использовать.
...
Рейтинг: 0 / 0
Сджойнить 50 таблиц
    #39345399
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoftВ INNER оптимизатор волен выбирать любой порядок соединения таблиц. При 50 джойнах возникает 51! комбинаций последовательности таблиц. Это явно слишком много и оптимизатор скорее всего выбирает не тот вариант.

Откуда взялось 51! ?
Если существует ровно один вариант соединения двух таблиц, зачем перебирать другие ?
...
Рейтинг: 0 / 0
Сджойнить 50 таблиц
    #39345411
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
schiЕсли существует ровно один вариант соединения двух таблиц, зачем перебирать другие ?Даже для двух таблиц есть два варианта - сперва читать первую, потом вторую, или сделать наоборот.
...
Рейтинг: 0 / 0
Сджойнить 50 таблиц
    #39345429
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
schiОткуда взялось 51! ?Количество перестановок .
...
Рейтинг: 0 / 0
Сджойнить 50 таблиц
    #39345435
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akina,
miksoft

Коллеги, я наверное действительно чего-то не понимаю. Не будете ли так любезны ткнуть ссылкой в описание оптимизатора, который работает описываемым вами образом ?

Если у ТС-а есть связи между таблицами, то зачем читать все таблицы целиком, достаточно прочитать связующие, не так ли ?
...
Рейтинг: 0 / 0
Сджойнить 50 таблиц
    #39345438
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
schiЕсли у ТС-а есть связи между таблицами, то зачем читать все таблицы целиком, достаточно прочитать связующие, не так ли ?Если под связями подразумеваются внешние ключи, то они помогают оптимизатору не более, чем обычный индекс. Но они не принуждают оптимизатор выполнять запрос именно в направлении этих связей.
...
Рейтинг: 0 / 0
Сджойнить 50 таблиц
    #39345446
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
schiНе будете ли так любезны ткнуть ссылкой в описание оптимизатора, который работает описываемым вами образом ?Не совсем то, но близко:
http://dev.mysql.com/doc/refman/5.7/en/left-join-optimization.html The join optimizer calculates the order in which tables should be joined. The table read order forced by LEFT JOIN or STRAIGHT_JOIN helps the join optimizer do its work much more quickly, because there are fewer table permutations to check.

Кстати, там же есть важный момент, про который часто забывают:
http://dev.mysql.com/doc/refman/5.7/en/left-join-optimization.html For a LEFT JOIN, if the WHERE condition is always false for the generated NULL row, the LEFT JOIN is changed to a normal join. For example, the WHERE clause would be false in the following query if t2.column1 were NULL:
Код: sql
1.
SELECT * FROM t1 LEFT JOIN t2 ON (column1) WHERE t2.column2=5;

Therefore, it is safe to convert the query to a normal join:
Код: sql
1.
SELECT * FROM t1, t2 WHERE t2.column2=5 AND t1.column1=t2.column1;

This can be made faster because MySQL can use table t2 before table t1 if doing so would result in a better query plan.
...
Рейтинг: 0 / 0
Сджойнить 50 таблиц
    #39345489
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoftНе совсем то, но близко:
...


Видимо я неудачно выразился. Я бы хотел увидеть подтверждение, что для соединения N таблиц оптимизатор MySQL всегда будет выполнять (N+1)! попыток соединить таблицы в разных сочетаниях.
...
Рейтинг: 0 / 0
Сджойнить 50 таблиц
    #39345491
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вообще, прежде чем дальше давать советы, было бы интересно от ТС-а получить DDL хотя бы на главную таблицу и на пару подчиненных
...
Рейтинг: 0 / 0
Сджойнить 50 таблиц
    #39345492
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
schiЯ бы хотел увидеть подтверждение, что для соединения N таблиц оптимизатор MySQL всегда будет выполнять (N+1)! попыток соединить таблицы в разных сочетаниях.Нет, перебранных сочетаний будет гораздо меньше. Оптимизатор при выборе порядка соединения ориентируется на статистику таблиц, причём "плюс-минус лапоть", так что часть таблиц будет им заведомо задвинута. А вот все сочетания тех, что более-менее, он переберёт.
Подтверждение или опровержение можешь поискать на MySQL Internals или в исходном коде. Буде не лень...
...
Рейтинг: 0 / 0
Сджойнить 50 таблиц
    #39345508
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так что, берём на веру что ничего менять нельзя и мучаемся как быстро склеить 50 таблиц?
...
Рейтинг: 0 / 0
Сджойнить 50 таблиц
    #39345512
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
schimiksoftНе совсем то, но близко:
...


Видимо я неудачно выразился. Я бы хотел увидеть подтверждение, что для соединения N таблиц оптимизатор MySQL всегда будет выполнять (N+1)! попыток соединить таблицы в разных сочетаниях.Ну непосредственно (N+1)! он не будет пытаться перебрать, ибо на этого никакого времени не хватит, это лишь теоретический предел.
Оптимизатор будет перебирать до некоторого своего предела. В Оракле он настраивается, насколько я помню, а в MySQL такой настройки я не нашел.
Оптимизатор так же учитывает наличие индексов и старается строить план так, чтобы их использовать.

См. также http://dev.mysql.com/doc/internals/en/optimizer-joins-access-methods.html

Собственно, поэтому проблема ТС и возникла, что оптимизатор в своем переборе не доходит до оптимального плана и используется неподходящий порядок соединения таблиц, вероятно, в совокупности с отсутствием нужных индексов.

P.S. Хотя, возможно, мы это все перемудрили, а в запросе просто какая-то банальная ошибка :)
Мы же полного текста запроса и его плана не видели.
...
Рейтинг: 0 / 0
Сджойнить 50 таблиц
    #39345514
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alex564657498765453Так что, берём на веру что ничего менять нельзя и мучаемся как быстро склеить 50 таблиц?Зачем мучаться-то? Помогаем оптимизатору (указанием LEFT или STRAIGHT_JOIN) и едем дальше.
...
Рейтинг: 0 / 0
Сджойнить 50 таблиц
    #39345522
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoftОптимизатор будет перебирать до некоторого своего предела. В Оракле он настраивается, насколько я помню, а в MySQL такой настройки я не нашел.

Что происходит в Oracle, довольно подробно у Льюиса описано.

miksoftХотя, возможно, мы это все перемудрили, а в запросе просто какая-то банальная ошибка :)
Мы же полного текста запроса и его плана не видели.


И DDL мы тоже не видели, может там индексов/constraints нет совсем, тогда на 20 тысячах записей можно такой картезианский продукт получить, что недели не хватит его перебрать.
...
Рейтинг: 0 / 0
Сджойнить 50 таблиц
    #39345526
polger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoft,

Отлично. Ответил за меня. Спасибо.
...
Рейтинг: 0 / 0
Сджойнить 50 таблиц
    #39345527
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
schimiksoftОптимизатор будет перебирать до некоторого своего предела. В Оракле он настраивается, насколько я помню, а в MySQL такой настройки я не нашел.

Что происходит в Oracle, довольно подробно у Льюиса описано.

miksoftХотя, возможно, мы это все перемудрили, а в запросе просто какая-то банальная ошибка :)
Мы же полного текста запроса и его плана не видели.


И DDL мы тоже не видели, может там индексов/constraints нет совсем, тогда на 20 тысячах записей можно такой картезианский продукт получить, что недели не хватит его перебрать.

я тебе больше скажу, на паре тысяч записей 4-5 джоинов и уже не быстро без индексов. а в 10 раз больше строк, и в 10 раз больше индексов...:) это в 100 раз дольше.
...
Рейтинг: 0 / 0
52 сообщений из 52, показаны все 3 страниц
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Сджойнить 50 таблиц
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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