t-alexashka
@t-alexashka
Сразу пишу legacy код

Как исправить ошибку MySQL 1071 при смене движка таблиц с innodb на myisam?

В базе около 40 таблиц, и все похожи, все переконвертировались в myisam нормально кроме одной. что с ней не так?
сама ошибка говорит о каком то слишком большом ключе, который не может быть более 1000 байт.

CREATE TABLE `ru_enterprises` (
	`id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
	`city` INT(7) UNSIGNED NOT NULL DEFAULT '0',
	`alias` VARCHAR(255) NOT NULL DEFAULT '',
	`fullName` VARCHAR(255) NOT NULL DEFAULT '',
	`address` VARCHAR(255) NOT NULL DEFAULT '',
	`site` VARCHAR(255) NOT NULL DEFAULT '',
	`email` VARCHAR(255) NOT NULL DEFAULT '',
	`phone` VARCHAR(255) NOT NULL DEFAULT '',
	`fax` VARCHAR(255) NOT NULL DEFAULT '',
	`lat` VARCHAR(20) NOT NULL DEFAULT '',
	`lon` VARCHAR(20) NOT NULL DEFAULT '',
	`elasticsearch` INT(1) UNSIGNED NOT NULL DEFAULT '0' COMMENT 'elasticsearch: 0 - no, 1 - processed, 2 - need update',
	PRIMARY KEY (`id`),
	UNIQUE INDEX `Індекс 2` (`city`, `fullName`, `address`),
	INDEX `city` (`city`),
	INDEX `alias` (`alias`),
	INDEX `elasticsearch` (`elasticsearch`),
	INDEX `address` (`address`),
	INDEX `fullName` (`fullName`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
AUTO_INCREMENT=1612052;
  • Вопрос задан
  • 2611 просмотров
Решения вопроса 1
Melkij
@Melkij
PostgreSQL DBA
Вы хорошо подумали?
Ты точно хорошо подумали?
Вы очень хорошо подумали?
Даже на небольшой таблице в лям строк по собственной воле делать myisam? Вы уверены? Зачем?

Без перекомпиляции mysql размер индекса у myisam ограничен 1000 байтами.
1 символ utf8 в mysql всегда занимает 3 байта
Ваш индекс `city`, `fullName`, `address` занимает: 4 байта + 255 символов * 3 байта + 255 * 3 = 1534 байта, он не влезает в лимит. Поскольку этот индекс уникальный, нативных решений нет.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы