Tenho uma tabela MySQL que possui 95929357 registros, abaixo segue o esquema da tabela para o mesmo
CREATE TABLE `Friends` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`createdTime` datetime DEFAULT NULL,
`friendUserId` bigint(20) DEFAULT NULL,
`friendshipStatus` int(11) DEFAULT NULL,
`remarks` varchar(255) DEFAULT NULL,
`updatedTime` datetime DEFAULT NULL,
`userId` bigint(20) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `userId` (`userId`,`friendUserId`),
KEY `createdTime` (`createdTime`)
) ENGINE=InnoDB AUTO_INCREMENT=1321597934 DEFAULT CHARSET=latin1
tenho duas perguntas a fazer
Questão 1# Se tiver apenas 95929357 registros, como o AUTO_INCREMENT aumenta para 1321597934(Nota-entradas são inseridas por código com valor padrão 0). Também notei que há uma lacuna no id (exp- do id 50001124 para o novo id 50001393)
| 50001122 | 2021-09-19 03:33:06 | 116176872 | 0 | NULL | 2021-09-19 03:33:06 | 103802246 |
| 50001123 | 2021-09-19 03:33:06 | 114361519 | 0 | NULL | 2021-09-19 03:33:06 | 116176872 |
| 50001124 | 2021-09-19 03:33:06 | 116176872 | 0 | NULL | 2021-09-19 03:33:06 | 114361519 |
| 50001393 | 2021-09-19 03:33:07 | 109233877 | 0 | NULL | 2021-09-19 03:33:07 | 125715813 |
| 50001394 | 2021-09-19 03:33:07 | 125715813 | 0 | NULL | 2021-09-19 03:33:07 | 109233877 |
| 50001395 | 2021-09-19 03:33:07 | 105588884 | 0 | NULL | 2021-09-19 03:33:07 | 125715813 |
| 50001396 | 2021-09-19 03:33:07 | 125715813 | 0 | NULL | 2021-09-19 03:33:07 | 105588884 |
| 50001397 | 2021-09-19 03:33:07 | 106198652 | 0 | NULL | 2021-09-19 03:33:07 | 125715813 |
| 50001398 | 2021-09-19 03:33:07 | 125715813 | 0 | NULL | 2021-09-19 03:33:07 | 106198652 |
Pergunta 2 # Eu estava tentando adicionar uma nova coluna com o comando abaixo
ALTER TABLE Friends ADD COLUMN source INT(11) DEFAULT '0';
mas ficando abaixo do erro enquanto a tabela altera
ERROR 1062 (23000): Duplicate entry '126750770-127846472' for key 'userId'
ATUALIZAR -
Selecione o resultado da chave acima
mysql> select * from Friends where userId = 126750770 AND friendUserId = 127846472;
+------------+---------------------+--------------+------------------+---------+---------------------+-----------+--------+
| id | createdTime | friendUserId | friendshipStatus | remarks | updatedTime | userId | source |
+------------+---------------------+--------------+------------------+---------+---------------------+-----------+--------+
| 1120753287 | 2022-01-27 12:36:12 | 127846472 | 0 | NULL | 2022-01-27 12:36:12 | 126750770 | 0 |
+------------+---------------------+--------------+------------------+---------+---------------------+-----------+--------+
1 row in set (0.00 sec)
mysql> select * from Friends where userId = 127846472 AND friendUserId = 126750770;
+------------+---------------------+--------------+------------------+---------+---------------------+-----------+--------+
| id | createdTime | friendUserId | friendshipStatus | remarks | updatedTime | userId | source |
+------------+---------------------+--------------+------------------+---------+---------------------+-----------+--------+
| 1120753288 | 2022-01-27 12:36:12 | 126750770 | 0 | NULL | 2022-01-27 12:36:12 | 127846472 | 0 |
+------------+---------------------+--------------+------------------+---------+---------------------+-----------+--------+
1 row in set (0.00 sec)
Existem várias causas de lacunas em
AUTO_INCREMENT
:REPLACE
,INSERT IGNORE
,ROLLBACK
, IODKU e outros. Por favor, apresente algumas de suas declarações tipo insert; Vou fornecer mais detalhes. Suponho que você não saiba o que aconteceu em 2021-09-19 03:33:07.Duplicate entry '126750770-127846472'
não deveria ter acontecido. Isso é preocupante como se houvesse uma falha que não foi recuperada adequadamente (incomum). "268" toca algum sino? (Isso é quantos ids estão faltando lá .Você converteu de MyISAM para InnoDB em algum momento no passado?
Eu sugiro que você faça mais algumas investigações, começando com
Isso pode ser apenas uma das várias "chaves duplicadas".
Deixe-nos saber o que você descobrir.
Sugestão adicional
Se a combinação
(userId, friendUserId)
é única, por que não se livrarid
e promover o UNIQUE paraPRIMARY KEY(userId, friendUserId)
? Isso economizaria espaço e agilizaria algumas consultas. Provavelmente não há uso paraid
nenhuma outra tabela.ALTERAR
Uma execução longa
ALTER
na mesa pode ter bloqueadoINSERTs
o tempo suficiente para atingir o tempo limite. Isso pode levar a que eles sejamROLLBACK'd
depois que os ids já tenham sido atribuídos.