Pergunta

Estou tentando mover uma tabela que contém bilhões de linhas para um novo diretório no MySQL 5.6. Estou tentando copiar a Tabela 1 para a Tabela 2 e lá descartando a Tabela 1 e renomeando a Tabela2 à Tabela1.

    CREATE TABLE `table2` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `col1` int(11) DEFAULT NULL,
  `col2` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `unique_col1_col2` (`col1`,`col2`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 DATA DIRECTORY='/mysql_data/';

Estou usando o procedimento abaixo para fazer a cópia.

DROP PROCEDURE IF EXISTS copytables;
CREATE PROCEDURE `copytables`()
begin
DECLARE v_id INT(11) unsigned  default 0;
declare maxid int(11) unsigned  default 0;
select max(id) into maxid from table1;
while v_id < maxid  do
insert into table2(col1,col2)
select fbpost_id,fbuser_id from table1 where id >= v_id and id <v_id+100000 ;
set v_id=v_id+100000;
select v_id;
select max(id) into maxid from table1;
select maxid;
end while;
end;

Mas agora estou recebendo lacunas na coluna de ID após cada lote de 100000 na Tabela2 (após o ID 199999 O próximo ID é 262141). A Tabela1 não está contendo lacunas na coluna ID.

Foi útil?

Solução

Pergunte ao Google: https://www.google.com/search?q=AUTO_INCRENTIMENTOMYSQL+GAPS+Innodb o primeiro resultado explica esta questão.

Geralmente, você precisa contar para as pessoas o que você tentou até agora e por que não está funcionando. Nesse caso, esse é apenas um recurso/característica do mecanismo Innodb que permite que ele opere rapidamente em altos volumes.

Outras dicas

Os campos de incremento automático não são garantidos como densos, eles são apenas garantidos para fornecer valores exclusivos. Usualmente Isso o fará, dando a você valores densos (consecutivos), mas não precisa. Reservará vários valores, que podem ser descartados se não forem usados. Ver http://dev.mysql.com/doc/refman/5.6/en/example-auto-inncrement.html

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top