|
|
|
Сджойнить 50 таблиц
|
|||
|---|---|---|---|
|
#18+
Как будет правильней сделать вывод всей таблицы если она состоит из 50-и столбцов в каждом из которых находятся ключи по которым подключаются таблицы. К одному столбцу подключается одна таблица. Пробовал всё это соеденить джойнами но сервер не переварил такую большую кучу. Как это всё вывести одним запросом с подстановкой данных из подключаемых таблиц? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.11.2016, 12:27 |
|
||
|
Сджойнить 50 таблиц
|
|||
|---|---|---|---|
|
#18+
Какой смысл это выводить? всё равно глазом не окинешь, на экран не поместишь... Раздели таблицу на несколько поменьше, сгруппировав столбцы в них по вменяемой логике и объединив их 1:1 к базовой таблице. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.11.2016, 12:39 |
|
||
|
Сджойнить 50 таблиц
|
|||
|---|---|---|---|
|
#18+
polgerПробовал всё это соеденить джойнами но сервер не переварил такую большую кучу.Как именно пробовали? В лимит в 61 джойн не уложились? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.11.2016, 13:14 |
|
||
|
Сджойнить 50 таблиц
|
|||
|---|---|---|---|
|
#18+
polger, Вариант через подзапросы в секции SELECT тоже пробовали? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.11.2016, 13:21 |
|
||
|
Сджойнить 50 таблиц
|
|||
|---|---|---|---|
|
#18+
Akina по вменяемой логике Не совсем понял, как это по вменяемой логике? Постараюсь объяснить. Это сайт знакомств. Есть таблица users с анкетными данными пользователей. В этой таблице есть около 50 столбцов, например: "город", "страна", "возраст", "рост" и т.п. Всего 50 шт. Так же есть 50 таблиц где перечислены все параметры. В таблице "город" все города, в таблице "возраст" все возраста и остальное в том же духе. Соответственно мне на сайте нужно получить все параметры каждого человека. Как правильно это сделать? С помощью джойнов? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.11.2016, 13:22 |
|
||
|
Сджойнить 50 таблиц
|
|||
|---|---|---|---|
|
#18+
polgerКак правильно это сделать?Вариантов, на самом деле, множество. В т.ч. можно и сразу держать подготовленную денормализованную таблицу с нужными данными. Заодно и быстродействие возрастет при запросах на чтение (и без сканирования таблицы). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.11.2016, 13:29 |
|
||
|
Сджойнить 50 таблиц
|
|||
|---|---|---|---|
|
#18+
polgerЕсть таблица users с анкетными данными пользователей. В этой таблице есть около 50 столбцов, например: "город", "страна", "возраст", "рост" и т.п. Всего 50 шт. Есть физические данные юзера - одна таблица. Место жительства - вторая. Внешние данные - третья. Контакты - четвёртая. Вот это и есть деление по вменяемой логике. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.11.2016, 13:34 |
|
||
|
Сджойнить 50 таблиц
|
|||
|---|---|---|---|
|
#18+
[quot Akina]polgerВот это и есть деление по вменяемой логике. Такой вариант не подойдёт, так как все эти таблицы, "город", "возраст" и т.д. заполнены определёнными данными и главная таблица, users, должна содержать лишь идентификаторы для связи. В общем структуру менять однозначно нельзя. Вопрос в том, как с наименьшими временными затратами получить пользователя со всеми подставленными данными. Может я с джойнами что-то не то намудрил, хотя вряд ли, и поэтому сервер сутки думал и так и не окуклился. А может и подзапросы помогут, как советуют выше, правда не представляю как это реализовать... Буду вечером копаться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.11.2016, 14:03 |
|
||
|
Сджойнить 50 таблиц
|
|||
|---|---|---|---|
|
#18+
polgerсервер сутки думал и так и не окуклилсяЛибо не хватает каких-то индексов, либо запрос была написан неправильно. Либо, в крайнем случае, можно явно указать порядок соединения таблиц. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.11.2016, 14:10 |
|
||
|
Сджойнить 50 таблиц
|
|||
|---|---|---|---|
|
#18+
polgerТакой вариант не подойдёт, так как все эти таблицы, "город", "возраст" и т.д. заполнены определёнными данными и главная таблица, users, должна содержать лишь идентификаторы для связи. Так и будет. polgerобщем структуру менять однозначно нельзя. Не вижу связи между этими утверждениями. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.11.2016, 14:16 |
|
||
|
Сджойнить 50 таблиц
|
|||
|---|---|---|---|
|
#18+
Akina, Зачем вообще в данном случае нужно разбивать главную таблицу? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.11.2016, 14:40 |
|
||
|
Сджойнить 50 таблиц
|
|||
|---|---|---|---|
|
#18+
polgerЗачем вообще в данном случае нужно разбивать главную таблицу?А затем, что ежели тебе надо посмотреть только сведения о юзере и его контактах, вовсе необязательно будет джойнить таблицы с размером сапог и номером телефона. Чем меньше ненужного дерьма, тем серверу легче. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.11.2016, 14:46 |
|
||
|
Сджойнить 50 таблиц
|
|||
|---|---|---|---|
|
#18+
В общем, почитай про вертикальный шардинг. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.11.2016, 14:49 |
|
||
|
Сджойнить 50 таблиц
|
|||
|---|---|---|---|
|
#18+
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 тестовых записей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.11.2016, 14:55 |
|
||
|
Сджойнить 50 таблиц
|
|||
|---|---|---|---|
|
#18+
miksoftpolgerсервер сутки думал и так и не окуклилсяЛибо не хватает каких-то индексов, либо запрос была написан неправильно. Либо, в крайнем случае, можно явно указать порядок соединения таблиц. Может буферного пула на 50 справочников не хватает? Я бы попробовал подключить пять раз по 10 справочников, с формированием временных таблиц, а потом сджойнил бы временные таблицы. ИМХО, за сутки бы сработало:) П.С. Ни количества записей, ни размера памяти, ни типа СУБД...какой вопрос, такой и ответ. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.11.2016, 14:58 |
|
||
|
Сджойнить 50 таблиц
|
|||
|---|---|---|---|
|
#18+
Akina, Так в том то и дело, что мне нужно просмотреть ВСЁ, что касается определенного юзера на одной странице. Все параметры за раз. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.11.2016, 14:58 |
|
||
|
Сджойнить 50 таблиц
|
|||
|---|---|---|---|
|
#18+
polgerИ так 50 разСфига бы 50? Сейчас у тебя одна таблица на 50 полей. А будет - основная таблица полей эдак на 10, и связанные с ней ещё, скажем, 4 таблицы тоже полей по 10 каждая. И ежели тебе нужны только данные из основной и двух дополнительных, то остальные две дополнительные вязать не требуется, и джойнить надо будет не полсотни, а всего 30 словарей. А если из этих таблиц тебе надо ещё и не все поля - то и того меньше. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.11.2016, 14:59 |
|
||
|
Сджойнить 50 таблиц
|
|||
|---|---|---|---|
|
#18+
polgerКак будет правильней сделать вывод всей таблицы если она состоит из 50-и столбцов в каждом из которых находятся ключи по которым подключаются таблицы. К одному столбцу подключается одна таблица. Пробовал всё это соеденить джойнами но сервер не переварил такую большую кучу. Как это всё вывести одним запросом с подстановкой данных из подключаемых таблиц?В виртуозу загрузить :P Иногда бывают запросы по 200Kb длиной, выживает. Вообще, если у вас такая братская могила из свойств, то уже можно начинать думать про RDF, и --- раз сайт знакомств --- просто перегнать данные в FOAF и т.п. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.11.2016, 15:03 |
|
||
|
Сджойнить 50 таблиц
|
|||
|---|---|---|---|
|
#18+
П.С. Ни количества записей, ни размера памяти, ни типа СУБД...какой вопрос, такой и ответ.[/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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.11.2016, 15:07 |
|
||
|
Сджойнить 50 таблиц
|
|||
|---|---|---|---|
|
#18+
polgerмне нужно просмотреть ВСЁ, что касается определенного юзера на одной странице. Все параметры за раз.У меня такое впечатление, что ты смотришь для ВСЕХ, а не для одного. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.11.2016, 15:07 |
|
||
|
Сджойнить 50 таблиц
|
|||
|---|---|---|---|
|
#18+
Как вариант, может помочь пред-отбор, т.е. не Код: sql 1. 2. 3. 4. 5. 6. 7. а Код: sql 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.11.2016, 15:10 |
|
||
|
Сджойнить 50 таблиц
|
|||
|---|---|---|---|
|
#18+
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 и т.д... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.11.2016, 15:14 |
|
||
|
Сджойнить 50 таблиц
|
|||
|---|---|---|---|
|
#18+
polgerЭто сайт знакомств. Есть таблица users с анкетными данными пользователей. В этой таблице есть около 50 столбцов, например: "город", "страна", "возраст", "рост" и т.п. Всего 50 шт. Так же есть 50 таблиц где перечислены все параметры. В таблице "город" все города, в таблице "возраст" все возраста и остальное в том же духе. Соответственно мне на сайте нужно получить все параметры каждого человека. Как правильно это сделать? С помощью джойнов? пздц это ахтунг, вариантов несколько: - вынести весь этот треш и сделать по-нормальному - например возраст и рост указывать как поле int и хранить в основной таблице, а потом переписать в других местах, чтоб не использовать справочники для возраста и роста - отойти от нормальных форм и в основной таблице закэшить все это дело в длинную строку или json, но придется обновлять на каждый чих в двух местах ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.11.2016, 17:15 |
|
||
|
Сджойнить 50 таблиц
|
|||
|---|---|---|---|
|
#18+
17-77сделать по-нормальному - возраст ... указывать как поле int и хранить в основной таблице И каждый Новый год под звон курантов запускать UPDATE SET Возраст = Возраст + 1 ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.11.2016, 17:42 |
|
||
|
Сджойнить 50 таблиц
|
|||
|---|---|---|---|
|
#18+
Cane Cat Fisher, ну зачем вы придираетесь - хранить год или дату рождения и считать на лету ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.11.2016, 18:05 |
|
||
|
Сджойнить 50 таблиц
|
|||
|---|---|---|---|
|
#18+
Короче я понял одно. Надо углубляться в познании SQL. =) Задача не решена, пока. Но в любом случае спасибо за активную помощь всем. Такой отзывчивости я не ожидал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.11.2016, 19:52 |
|
||
|
Сджойнить 50 таблиц
|
|||
|---|---|---|---|
|
#18+
polgerКороче я понял одно. Надо углубляться в познании SQL. =) Задача не решена, пока. Но в любом случае спасибо за активную помощь всем. Такой отзывчивости я не ожидал. Вам нужно всего 2 вещи: - переделать структуру как уже выше говорили - понять что выводить сразу 20к записей еще тот бред. Вы можете экспортировать данные в эксель и там их просматривать. Мускул это БД а не клиент. Разбейте вывод по 10-20 записей на страницу и будет вам счастье в том же мускуле. P.S. Улыбнуло хранение возраста и т.п. в отдельных таблицах. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.11.2016, 20:32 |
|
||
|
Сджойнить 50 таблиц
|
|||
|---|---|---|---|
|
#18+
Злой БобрУлыбнуло хранение возраста и т.п. в отдельных таблицах.А что в этом плохого? ну или хотя бы просто необычного? речь ведь не идёт об отдельной таблице для хранения только возраста... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.11.2016, 20:37 |
|
||
|
Сджойнить 50 таблиц
|
|||
|---|---|---|---|
|
#18+
Akina, Ну обычно в таблице ставят поле дата и указывают для каждой записи дату рождения. Возраст считается уже исходя из разницы текущей даты и даты рождения. У автора же извращенный EAV. В принципе ничего особенного - стандартная ошибка "студента". Поэтому и улыбнуло а не подорвало. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.11.2016, 22:00 |
|
||
|
Сджойнить 50 таблиц
|
|||
|---|---|---|---|
|
#18+
Akina... речь ведь не идёт об отдельной таблице для хранения только возраста... У автора как раз это и есть. ))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.11.2016, 22:01 |
|
||
|
Сджойнить 50 таблиц
|
|||
|---|---|---|---|
|
#18+
Итак опыт "студента" показал. Дописал я запрос до 26 джоинов, 50 - это я утрировал, осталось дописать подключение шести таблиц многое к многому но я не об этом. Заменил я INNER на LEFT, как советовал DirksDR и всё отработало за пол секунды (запросы делаю в phpmyadmin со стандартным выводом в 25 записей на страницу). Ради чистоты эксперимента заменил на INNER, запрос обрабатываться будет до следующего пришествия. Процессор пашет на 100%. Вот объясните знатоки, почему такая разница во времени исполнения? Разницу между INNER и LEFT я понимаю, мне как раз и нужно, что бы в результате были все пользователи не зависимо от заполненности данными. И про структуру, пожалуйста, ничего не говорите, так надо =) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.11.2016, 23:14 |
|
||
|
Сджойнить 50 таблиц
|
|||
|---|---|---|---|
|
#18+
polgerКороче я понял одно. Надо углубляться в познании SQL. =) Задача не решена, пока. Но в любом случае спасибо за активную помощь всем. Такой отзывчивости я не ожидал. А не проще пока суть да дело, за раз выбирать не все 50 атрибутов, а какую-то их часть одним запросом, другую часть следующим, ну и т.д. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.11.2016, 23:15 |
|
||
|
Сджойнить 50 таблиц
|
|||
|---|---|---|---|
|
#18+
schi, Я первый =) Вопрос ко всем: Будет ли мной вышесказанное означать, что когда количество данных удвоится, то и удвоится время обработки этого запроса? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.11.2016, 23:34 |
|
||
|
Сджойнить 50 таблиц
|
|||
|---|---|---|---|
|
#18+
polger Вот объясните знатоки, почему такая разница во времени исполнения? Разницу между INNER и LEFT я понимаю, мне как раз и нужно, что бы в результате были все пользователи не зависимо от заполненности данными.В INNER оптимизатор волен выбирать любой порядок соединения таблиц. При 50 джойнах возникает 51! комбинаций последовательности таблиц. Это явно слишком много и оптимизатор скорее всего выбирает не тот вариант. А при LEFT порядок соединения таблиц всегда четко определен, ведущая слева. И оптимизатору просто не остается пространства для неверного выбора. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.11.2016, 00:44 |
|
||
|
Сджойнить 50 таблиц
|
|||
|---|---|---|---|
|
#18+
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, иначе это будет выборка всех пользователей с огромными затратами. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.11.2016, 00:46 |
|
||
|
Сджойнить 50 таблиц
|
|||
|---|---|---|---|
|
#18+
polgerВопрос ко всем: Будет ли мной вышесказанное означать, что когда количество данных удвоится, то и удвоится время обработки этого запроса?Нет, при правильной индексации время выполнения такого рода запросов растет примерно логарифмически (пока хватает всяких кэшей и буферов.) относительно количества данных, что значительно медленнее, чем линейно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.11.2016, 00:48 |
|
||
|
Сджойнить 50 таблиц
|
|||
|---|---|---|---|
|
#18+
miksoftВ INNER оптимизатор волен выбирать любой порядок соединения таблиц.Если не использовать STRAIGHT_JOIN - а в данном случае его лучше таки использовать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.11.2016, 07:39 |
|
||
|
Сджойнить 50 таблиц
|
|||
|---|---|---|---|
|
#18+
miksoftВ INNER оптимизатор волен выбирать любой порядок соединения таблиц. При 50 джойнах возникает 51! комбинаций последовательности таблиц. Это явно слишком много и оптимизатор скорее всего выбирает не тот вариант. Откуда взялось 51! ? Если существует ровно один вариант соединения двух таблиц, зачем перебирать другие ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.11.2016, 10:24 |
|
||
|
Сджойнить 50 таблиц
|
|||
|---|---|---|---|
|
#18+
schiЕсли существует ровно один вариант соединения двух таблиц, зачем перебирать другие ?Даже для двух таблиц есть два варианта - сперва читать первую, потом вторую, или сделать наоборот. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.11.2016, 10:36 |
|
||
|
Сджойнить 50 таблиц
|
|||
|---|---|---|---|
|
#18+
schiОткуда взялось 51! ?Количество перестановок . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.11.2016, 10:58 |
|
||
|
Сджойнить 50 таблиц
|
|||
|---|---|---|---|
|
#18+
Akina, miksoft Коллеги, я наверное действительно чего-то не понимаю. Не будете ли так любезны ткнуть ссылкой в описание оптимизатора, который работает описываемым вами образом ? Если у ТС-а есть связи между таблицами, то зачем читать все таблицы целиком, достаточно прочитать связующие, не так ли ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.11.2016, 11:07 |
|
||
|
Сджойнить 50 таблиц
|
|||
|---|---|---|---|
|
#18+
schiЕсли у ТС-а есть связи между таблицами, то зачем читать все таблицы целиком, достаточно прочитать связующие, не так ли ?Если под связями подразумеваются внешние ключи, то они помогают оптимизатору не более, чем обычный индекс. Но они не принуждают оптимизатор выполнять запрос именно в направлении этих связей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.11.2016, 11:12 |
|
||
|
Сджойнить 50 таблиц
|
|||
|---|---|---|---|
|
#18+
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. Therefore, it is safe to convert the query to a normal join: Код: sql 1. This can be made faster because MySQL can use table t2 before table t1 if doing so would result in a better query plan. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.11.2016, 11:30 |
|
||
|
Сджойнить 50 таблиц
|
|||
|---|---|---|---|
|
#18+
miksoftНе совсем то, но близко: ... Видимо я неудачно выразился. Я бы хотел увидеть подтверждение, что для соединения N таблиц оптимизатор MySQL всегда будет выполнять (N+1)! попыток соединить таблицы в разных сочетаниях. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.11.2016, 12:22 |
|
||
|
Сджойнить 50 таблиц
|
|||
|---|---|---|---|
|
#18+
А вообще, прежде чем дальше давать советы, было бы интересно от ТС-а получить DDL хотя бы на главную таблицу и на пару подчиненных ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.11.2016, 12:24 |
|
||
|
Сджойнить 50 таблиц
|
|||
|---|---|---|---|
|
#18+
schiЯ бы хотел увидеть подтверждение, что для соединения N таблиц оптимизатор MySQL всегда будет выполнять (N+1)! попыток соединить таблицы в разных сочетаниях.Нет, перебранных сочетаний будет гораздо меньше. Оптимизатор при выборе порядка соединения ориентируется на статистику таблиц, причём "плюс-минус лапоть", так что часть таблиц будет им заведомо задвинута. А вот все сочетания тех, что более-менее, он переберёт. Подтверждение или опровержение можешь поискать на MySQL Internals или в исходном коде. Буде не лень... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.11.2016, 12:26 |
|
||
|
Сджойнить 50 таблиц
|
|||
|---|---|---|---|
|
#18+
Так что, берём на веру что ничего менять нельзя и мучаемся как быстро склеить 50 таблиц? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.11.2016, 12:41 |
|
||
|
Сджойнить 50 таблиц
|
|||
|---|---|---|---|
|
#18+
schimiksoftНе совсем то, но близко: ... Видимо я неудачно выразился. Я бы хотел увидеть подтверждение, что для соединения N таблиц оптимизатор MySQL всегда будет выполнять (N+1)! попыток соединить таблицы в разных сочетаниях.Ну непосредственно (N+1)! он не будет пытаться перебрать, ибо на этого никакого времени не хватит, это лишь теоретический предел. Оптимизатор будет перебирать до некоторого своего предела. В Оракле он настраивается, насколько я помню, а в MySQL такой настройки я не нашел. Оптимизатор так же учитывает наличие индексов и старается строить план так, чтобы их использовать. См. также http://dev.mysql.com/doc/internals/en/optimizer-joins-access-methods.html Собственно, поэтому проблема ТС и возникла, что оптимизатор в своем переборе не доходит до оптимального плана и используется неподходящий порядок соединения таблиц, вероятно, в совокупности с отсутствием нужных индексов. P.S. Хотя, возможно, мы это все перемудрили, а в запросе просто какая-то банальная ошибка :) Мы же полного текста запроса и его плана не видели. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.11.2016, 12:44 |
|
||
|
Сджойнить 50 таблиц
|
|||
|---|---|---|---|
|
#18+
alex564657498765453Так что, берём на веру что ничего менять нельзя и мучаемся как быстро склеить 50 таблиц?Зачем мучаться-то? Помогаем оптимизатору (указанием LEFT или STRAIGHT_JOIN) и едем дальше. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.11.2016, 12:46 |
|
||
|
Сджойнить 50 таблиц
|
|||
|---|---|---|---|
|
#18+
miksoftОптимизатор будет перебирать до некоторого своего предела. В Оракле он настраивается, насколько я помню, а в MySQL такой настройки я не нашел. Что происходит в Oracle, довольно подробно у Льюиса описано. miksoftХотя, возможно, мы это все перемудрили, а в запросе просто какая-то банальная ошибка :) Мы же полного текста запроса и его плана не видели. И DDL мы тоже не видели, может там индексов/constraints нет совсем, тогда на 20 тысячах записей можно такой картезианский продукт получить, что недели не хватит его перебрать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.11.2016, 12:54 |
|
||
|
Сджойнить 50 таблиц
|
|||
|---|---|---|---|
|
#18+
miksoft, Отлично. Ответил за меня. Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.11.2016, 12:57 |
|
||
|
Сджойнить 50 таблиц
|
|||
|---|---|---|---|
|
#18+
schimiksoftОптимизатор будет перебирать до некоторого своего предела. В Оракле он настраивается, насколько я помню, а в MySQL такой настройки я не нашел. Что происходит в Oracle, довольно подробно у Льюиса описано. miksoftХотя, возможно, мы это все перемудрили, а в запросе просто какая-то банальная ошибка :) Мы же полного текста запроса и его плана не видели. И DDL мы тоже не видели, может там индексов/constraints нет совсем, тогда на 20 тысячах записей можно такой картезианский продукт получить, что недели не хватит его перебрать. я тебе больше скажу, на паре тысяч записей 4-5 джоинов и уже не быстро без индексов. а в 10 раз больше строк, и в 10 раз больше индексов...:) это в 100 раз дольше. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.11.2016, 12:58 |
|
||
|
|

start [/forum/topic.php?all=1&fid=47&tid=1831215]: |
0ms |
get settings: |
6ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
154ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
45ms |
get tp. blocked users: |
1ms |
| others: | 204ms |
| total: | 440ms |

| 0 / 0 |
