|
Заменить подзапросы JOIN или упростить запрос
|
|||
---|---|---|---|
#18+
Есть запрос в котором помимо данных на период (начало месяца) нужно выбрать еще несколько данных из следующего периода (начало следующего месяца), например: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9.
Вот прямо чувствую, что подзапросы можно убрать, оптимизировав весь запрос, но не могу сообразить как. Помогите, пожалуйста! ... |
|||
:
Нравится:
Не нравится:
|
|||
09.10.2019, 16:14 |
|
Заменить подзапросы JOIN или упростить запрос
|
|||
---|---|---|---|
#18+
Сделал так, из плана ушли подзапросы: Код: sql 1. 2. 3. 4. 5. 6. 7. 8.
Корректно? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.10.2019, 16:59 |
|
Заменить подзапросы JOIN или упростить запрос
|
|||
---|---|---|---|
#18+
LiYingКорректно?Да, вполне. Если не считать того момента, что даже навскидку некоторые LEFT JOIN (первый из трёх - так уж почти наверняка) просто просятся замениться на INNER JOIN. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.10.2019, 08:22 |
|
Заменить подзапросы JOIN или упростить запрос
|
|||
---|---|---|---|
#18+
Akina, Все таблицы в запросе связаны посредством primary/foreign ключей, так что Вы, видимо, правы насчет замены на INNER JOIN. Заменил все LEFT-ы на INNER-ы, вот такой получается explain: idselect_typetablepartitionstypepossible_keyskeykey_lenrefrowsfilteredExtra LEFT JOIN 1SIMPLEmconstPRIMARYPRIMARY4const1100"Using index; Using temporary; Using filesort"1SIMPLEcrefPRIMARY;fk_mkdfk_mkd5const126100Using index condition1SIMPLEdreffk_contr;i_perfk_contr5direct_contracts.c.id80.57Using where1SIMPLEd1reffk_contr;i_perfk_contr5direct_contracts.c.id8100Using where INNER JOIN 1SIMPLEmconstPRIMARYPRIMARY4const1100"Using index; Using temporary; Using filesort"1SIMPLEcrefPRIMARY;fk_mkdfk_mkd5const126100(Null)1SIMPLEdreffk_contr;i_perfk_contr5direct_contracts.c.id80.57Using where1SIMPLEd1reffk_contr;i_perfk_contr5direct_contracts.c.id80.57Using where Различие только в filtered и Extra. Не очень понимаю, что оно значит, не поясните? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.10.2019, 09:14 |
|
Заменить подзапросы JOIN или упростить запрос
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
10.10.2019, 09:31 |
|
Заменить подзапросы JOIN или упростить запрос
|
|||
---|---|---|---|
#18+
:) Не так выразился, описание я читал... В контексте моего запроса последний INNER получается выгоднее LEFT? Если rows=8 и filtered=0.57, количество строк, подлежащих соединению со следующей таблицей составляет 8*0.57% = 4,56 для INNER и 8*100% = 800 для LEFT. Этот момент мне не ясен. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.10.2019, 09:44 |
|
Заменить подзапросы JOIN или упростить запрос
|
|||
---|---|---|---|
#18+
LiYingВ контексте моего запроса последний INNER получается выгоднее LEFT?Конечно... Нахрена добавлять пустые записи и обрабатывать потом все записи, когда можно добавить и обработать только имеющие ответную часть? LiYingЕсли rows=8 и filtered=0.57, количество строк, подлежащих соединению со следующей таблицей составляет 8*0.57% = 4,56 для INNER и 8*100% = 800 для LEFT. Этот момент мне не ясен.По-моему, наоборот - если rows=8 и filtered=0.57, то в таблице всего 8 * 100% / 0,57% ~ 1400 записей, из которых выбираются для дальнейшей обработки только указанные 8. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.10.2019, 10:32 |
|
Заменить подзапросы JOIN или упростить запрос
|
|||
---|---|---|---|
#18+
AkinaПо-моему, наоборот - если rows=8 и filtered=0.57, то в таблице всего 8 * 100% / 0,57% ~ 1400 записей, из которых выбираются для дальнейшей обработки только указанные 8. Считал по доку из Вашей ссылки :) Либо у них ошибка в описании: The filtered column indicates an estimated percentage of table rows that will be filtered by the table condition. The maximum value is 100, which means no filtering of rows occurred. Values decreasing from 100 indicate increasing amounts of filtering. rows shows the estimated number of rows examined and rows × filtered shows the number of rows that will be joined with the following table. For example, if rows is 1000 and filtered is 50.00 (50%), the number of rows to be joined with the following table is 1000 × 50% = 500. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.10.2019, 10:41 |
|
Заменить подзапросы JOIN или упростить запрос
|
|||
---|---|---|---|
#18+
Да? ну мож и так - я на этот столбец в общем и не смотрю. Всё равно он оценочный, из статистики берётся. Мне как бы использование правильных индексов и время выполнения важнее, чем сомнительные цифири. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.10.2019, 11:03 |
|
|
start [/forum/topic.php?fid=47&fpage=30&tid=1828928]: |
0ms |
get settings: |
9ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
43ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
43ms |
get tp. blocked users: |
2ms |
others: | 11ms |
total: | 138ms |
0 / 0 |