powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / полный перебор таблицы в запросе к view с подзапросами и индексным полем
5 сообщений из 5, страница 1 из 1
полный перебор таблицы в запросе к view с подзапросами и индексным полем
    #39475240
Darkripple
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
добрый день.
более понятного краткого названия для темы пока не придумал.

суть вопроса:
как заставить mysql использовать индекс при выборке данных из view c вложенными подзапросами?

Код: sql
1.
select * from (select id, aa, (select bb from t2 where ... ) bb from t1) as view_1 where id=5

подробности:
есть view
Код: sql
1.
2.
3.
4.
5.
6.
create or replace 
  view vv (...много полей...) 
as 
select  ГТ.ID, ...много полей, функции, подзапросы... 
from ...Главная_Таблица ГТ, еще несколько таблиц включая left join-ы...
where ...несколько условий...

у Главной_Таблицы есть поле ID (primary key).
запрос
Код: sql
1.
select * from vv where ID = 999

не хочет использовать индекс и выполняет полный перебор Главной_Таблицы, на что тратится 3 секунды времени.

select_typetablepartitionstypepossible_keyskeyDERIVEDГТ(null)ALLPRIMARY IDX_GT_01(null)
если я убираю из view все вложенные подзапросы, то сразу всё становится хорошо
select_typetablepartitionstypepossible_keyskeySIMPLEГТ(null)constPRIMARY IDX_GT_01PRIMARY и время выполнения запроса падает до сотых долей секунды.
возвращаю назад хотя бы один подзапрос - всё опять рушится. причем дело не в самих вложенных подзапросах, а в их наличии, потому что исходный запрос из view, с прописанным идентификатором сразу в условии WHERE, выполняется за те же сотые доли секунды несмотря на все те же подзапросы.

если необходимо - приведу полные тексты ddl, но предполагаю, что решение где-то на поверхности (я же не первый такой), хотя найти его (форум, гугл) пока не удалось.
...
Рейтинг: 0 / 0
полный перебор таблицы в запросе к view с подзапросами и индексным полем
    #39475805
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Darkripple,

https://dev.mysql.com/doc/refman/5.7/en/derived-table-optimization.html It is possible to disable merging by using in the subquery any constructs that prevent merging, although these are not as explicit in their effect on materialization. Constructs that prevent merging are the same for derived tables and view references:
Aggregate functions (SUM(), MIN(), MAX(), COUNT(), and so forth)

DISTINCT

GROUP BY

HAVING

LIMIT

UNION or UNION ALL

Subqueries in the select list

Assignments to user variables

Refererences only to literal values (in this case, there is no underlying table)
...
Рейтинг: 0 / 0
полный перебор таблицы в запросе к view с подзапросами и индексным полем
    #39476177
Darkripple
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoft,
Я видел эти ограничения, но вот строка про подзапросы как-то проскочила мимо меня.. видимо остановился на LIMIT-ах, которые у меня тоже были сначала.
еще возможно добавил сомнений комментарий к теме про обработку представлений
https://dev.mysql.com/doc/refman/5.7/en/view-algorithms.html
так что я поверил, что такое возможно... печально.
ладно, буду обходить ограничение по другому.
Спасибо!
...
Рейтинг: 0 / 0
полный перебор таблицы в запросе к view с подзапросами и индексным полем
    #39476467
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Darkripple https://dev.mysql.com/doc/refman/5.7/en/view-algorithms.html Эту ссылку я тоже хотел дать, но там изрядную часть страницы вытащили (по сравнению с документацией по предыдущим версиям) туда, на что я дал ссылку.
Darkrippleладно, буду обходить ограничение по другому.В MySQL вообще VIEW весьма корявые. Лучше бы совсем от них отказаться.
...
Рейтинг: 0 / 0
полный перебор таблицы в запросе к view с подзапросами и индексным полем
    #39476528
Darkripple
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoftВ MySQL вообще VIEW весьма корявые. Лучше бы совсем от них отказаться.
не в обиду MySQL - после Oracle натыкаюсь на многие вещи, которые на мой взгляд "недореализованы", или логику которых я "не принимаю".
пример - разный подход к неявному преобразованию строки в число в отдельных запросах и в хранимых процедурах.
или из недавнего:
Код: sql
1.
2.
select JSON_SEARCH(cast('{"aa":"305"}' as json), 'one', '305', NULL, '$') j;
select JSON_SEARCH(cast('{"aa":305}' as json), 'one', '305', NULL, '$') j;

первый выдаёт результат, второй - нет.
или вот тоже
Код: sql
1.
2.
SELECT jj->>'$."Продукт"' a1, JSON_UNQUOTE(JSON_EXTRACT((jj->>'$**."Продукт"'),'$[0]')) a2
FROM (SELECT CAST('{"aa":{"Продукт":null}}' AS JSON) jj) q;

как это объяснить? зачем он NULL во втором случае превращает в слово "null" ???

возвращаясь к view-хе - как бы криво ни была реализована работа с ними, альтернативы ей, как заранее подготовленному запросу, с возможностью "компактного" использования в разных местах/средах и единой точкой изменения - пока не нашёл.
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / полный перебор таблицы в запросе к view с подзапросами и индексным полем
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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