Кешируются ли подзапросы MySQL при использовании в предложении WHERE?

12

В следующем запросе:

SELECT column_a, column_b FROM table_a WHERE
    column_b IN (SELECT b_id FROM table_b)

Является ли подзапрос SELECT b_id FROM table_b кэшированным синтаксическим анализатором SQL, или было бы быстрее выполнить запрос заранее, сохранить его как переменную (например, в PHP), а затем передать эти значения в виде строки CSV?

например.

SELECT column_a, column_b FROM table_a WHERE
    column_b IN (1,3,4,6,8,10,16,18)
  • 0
    Использование IN с подзапросом - ужасная идея. Вам лучше получить желаемые результаты с помощью объединения, поскольку запрос по сути является равноправным объединением. SELECT column_a, column_b FROM table_a JOIN table_b ON column_b = b_id
  • 0
    @TimSeguine: Почему это ужасная идея? Если table_b является N: отношение таблица M, один будет получить несколько строк из table_a если JOIN используется. Это может быть нежелательным.
Показать ещё 3 комментария
Теги:
database
sql-server
optimization

1 ответ

6
Лучший ответ

Посмотрите на использование EXPLAIN EXTENDED, чтобы полностью проиллюстрировать эффекты, оказанные в подзапросе.

Например:

EXPLAIN EXTENDED
SELECT column_a, column_b FROM table_a WHERE
    column_b IN (SELECT b_id FROM table_b)

Если они не дают желаемых результатов кэширования, вы можете быть заинтересованы в их хранении в памяти (memcache, redis), в файле (используя библиотеки файлов PHP) или в отдельном кэше SQL.

  • 11
    Это самый неправильный ответ, который я видел сегодня.
  • 1
    @ypercubeᵀᴹ ypercubeᵀᴹ и всем, кто проголосовал против, можете ли вы объяснить или предоставить альтернативные ответы?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню