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
편집 :
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 문서]에 따르면 (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
감사합니다. 이것이 결국 내가 그 일을 끝낸 방법입니다. select의 결과마다 별도의 prepared statement를 생성/실행하면 파일 사용을 피할 수 있지만 현재로서는 임시 파일로 충분합니다. –