powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Сджойнить 50 таблиц
25 сообщений из 52, страница 2 из 3
Сджойнить 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
25 сообщений из 52, страница 2 из 3
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Сджойнить 50 таблиц
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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