SQLinfo.ru - Все о MySQL Webew.ru: теория и практика веб-технологий

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 20.04.2024 23:59:02

LazY
_cмельчак
MySQL Authorized Developer and DBA
Зарегистрирован: 02.04.2007
Сообщений: 849

Переменная типа JSON или временная таблица?

Нужно сохранить результат запроса, который затем использовать в нескольких других.

Пример:

SELECT JSON_ARRAYAGG(id)
FROM (
    SELECT id
    FROM products
    LIMIT 5    
) AS t
INTO @ids;

SELECT * FROM products
WHERE id MEMBER OF (@ids);
 


JSON выиграет по производительности у временной таблицы, так ведь?

Неактивен

 

#2 22.04.2024 12:33:09

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Переменная типа JSON или временная таблица?

Не факт.

Например, если переписать запрос через временную таблицу

SELECT * FROM products
WHERE id IN (SELECT id FROM `temporary_table`);
то оптимизатор на большой `temporary_table` может её проиндексировать во время выполнения запроса. Не знаю как будет работать в таком случае MEMBER OF.

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

Неактивен

 

#3 26.04.2024 19:21:38

LazY
_cмельчак
MySQL Authorized Developer and DBA
Зарегистрирован: 02.04.2007
Сообщений: 849

Re: Переменная типа JSON или временная таблица?

оптимизатор на большой `temporary_table` может её проиндексировать во время выполнения запроса

Честно говоря, для меня это что-то новенькое. То есть, MySQL может по своим соображениям построить некий скрытый индекс, даже если ей нигде это явно не указывали?

Неактивен

 

#4 28.04.2024 20:54:13

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Переменная типа JSON или временная таблица?

Это индекс над временной таблицей, которая создана в ходе выполнения запроса, и существует он соответственно тоже только во время выполнения запроса.
В примере выше

SELECT * FROM products
WHERE id IN (SELECT id FROM `temporary_table`);
оптимизатор понимает, что ему не нужна вся твоя `temporary_table`, а достаточно оставить из неё уникальные id, записать их в свою временную таблицу и проиндексировать её.

Т.е. строго говоря он индексирует не твою временную таблицу, а свой результат работы с ней.


Вот:

https://dev.mysql.com/doc/refman/8.0/en/subquery-materialization.html написал:

Materialization speeds up query execution by generating a subquery result as a temporary table, normally in memory. ..  The optimizer may index the table with a hash index to make lookups fast and inexpensive.

В целом: оптимизатор разными способами умеет выполнять подзапросы. Вопрос - умеет ли он применять эти стратегии при работе member of?

Неактивен

 

#5 05.05.2024 06:51:47

LazY
_cмельчак
MySQL Authorized Developer and DBA
Зарегистрирован: 02.04.2007
Сообщений: 849

Re: Переменная типа JSON или временная таблица?

строго говоря он индексирует не твою временную таблицу, а свой результат работы с ней

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

Может даже получиться так, что я создам временную таблицу, а MySQL над ней создаст еще одну, если оптимизатор недостаточно умен, чтобы понять, что моя таблица - ровно то, что ему нужно.

Вопрос - умеет ли он применять эти стратегии при работе member of?

Думаю, это зависит от того, что в подзапросе. Если там выбор id, оптимизатор по нему индекс и построит. Либо вообще строить не будет. Но вряд ли он построит неправильный индекс, тем более в данном случае.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson