Мы используем cookies для улучшения работы сайта и предоставления наших услуг. Продолжая использовать наш веб-сайт вы подтверждаете согласие с Политикой Конфиденциальности

Я согласен
Россия
8 800 551 94 15 все звонки бесплатно

Как перевести все таблицы в движок MyISAM

Когда речь идет об интернет-магазине, MyISAM более предпочительный движок, так как 99% операций – это чтение таблиц. Но иногда по каким-то причинам, может быть указан движок InnoDB при создании таблиц для своего модуля, и тогда приходится вручную это исправлять.

Для того, чтоб сэкономить время можно использовать программное решение, которое переведет все таблицы в MyISAM в один клик:

DROP PROCEDURE IF EXISTS convertToMyIsam;
DELIMITER //
CREATE PROCEDURE convertToMyIsam()
BEGIN
mainloop: LOOP
  SELECT TABLE_NAME INTO @convertTable FROM information_schema.TABLES
  WHERE `TABLE_SCHEMA` LIKE DATABASE()
  AND `ENGINE` LIKE 'InnoDB' ORDER BY TABLE_NAME LIMIT 1;
  IF @convertTable IS NULL THEN 
    LEAVE mainloop;
  END IF;
  SET @sqltext := CONCAT('ALTER TABLE `', DATABASE(), '`.`', @convertTable, '` ENGINE = MyISAM');
  PREPARE convertTables FROM @sqltext;
  EXECUTE convertTables;
  DEALLOCATE PREPARE convertTables;
  SET @convertTable = NULL;
END LOOP mainloop;
END//
DELIMITER ;

CALL convertToMyIsam();
DROP PROCEDURE IF EXISTS convertToMyIsam;

Если вы предпочитаете использовать InnoDB и вас тяготит наличие таблиц MyISAM, то можно использовать обратный вариант скрипта:

DROP PROCEDURE IF EXISTS convertToInnodb;
DELIMITER //
CREATE PROCEDURE convertToInnodb()
BEGIN
mainloop: LOOP
  SELECT TABLE_NAME INTO @convertTable FROM information_schema.TABLES
  WHERE `TABLE_SCHEMA` LIKE DATABASE()
  AND `ENGINE` LIKE 'MyISAM' ORDER BY TABLE_NAME LIMIT 1;
  IF @convertTable IS NULL THEN 
    LEAVE mainloop;
  END IF;
  SET @sqltext := CONCAT('ALTER TABLE `', DATABASE(), '`.`', @convertTable, '` ENGINE = INNODB');
  PREPARE convertTables FROM @sqltext;
  EXECUTE convertTables;
  DEALLOCATE PREPARE convertTables;
  SET @convertTable = NULL;
END LOOP mainloop;
END//
DELIMITER ;

CALL convertToInnodb();
DROP PROCEDURE IF EXISTS convertToInnodb;