Вы должны использовать prepared statements.
SET @s:='';
SELECT @s:=concat(@s, 'OPTIMIZE TABLE `', ist.TABLE_SCHEMA,'`.', ist.TABLE_NAME, ';') FROM INFORMATION_SCHEMA.TABLES ist where table_schema = 'my_schema';
PREPARE stmt FROM @s;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
Но вы должны поместить все операторы таблицы Оптимизируйте в одной переменной, поэтому я конкатенации @s
с самим собой. Иначе вам придется работать с курсором, что лишней работой.
С MySQL 5.0.23, следующие дополнительные операторы поддерживаются:
ANALYZE TABLE
OPTIMIZE TABLE
REPAIR TABLE
EDIT: еще более простой подход заключается в следующем:
SELECT CONCAT('OPTIMIZE TABLE `', ist.TABLE_SCHEMA,'`.', ist.TABLE_NAME, ';') FROM INFORMATION_SCHEMA.TABLES ist WHERE table_schema = 'my_schema'
INTO OUTFILE '/tmp/my_optimization';
SOURCE 'tmp/my_optimization';
Этот подход может больше работать для MySQL 5.6 и новее. Согласно [MySQL 5.7 documentation] (http://dev.mysql.com/doc/refman/5.7/en/sql-syntax-prepared-statements.html) Синтаксис SQL для подготовленных операторов не поддерживает многозадачность (то есть , несколько операторов в пределах одной строки, разделенной символами;). Когда запрос многозадачности с OPTIMIZE TABLE или REPAIR TABLE передается в PREPARE stmt FROM @s; MySQL сообщает об ошибке. –
@ Mr.Girgitt Добавлен лучший способ сделать это в моем ответе. – fancyPants
Спасибо. Вот как я это сделал. Создание/выполнение отдельного подготовленного оператора в результате выбора исключает использование файлов, но на данный момент временный файл для меня достаточно хорош. –