В следующем запросе:
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)
Посмотрите на использование 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.
IN
с подзапросом - ужасная идея. Вам лучше получить желаемые результаты с помощью объединения, поскольку запрос по сути является равноправным объединением.SELECT column_a, column_b FROM table_a JOIN table_b ON column_b = b_id
table_b
является N: отношение таблица M, один будет получить несколько строк изtable_a
еслиJOIN
используется. Это может быть нежелательным.