Usei o guia de particionamento e indexação de Rick James para criar isso alguns anos atrás, mas agora, depois de ler o tutorial novamente, não tenho tanta certeza se entendi corretamente e se a tabela abaixo é a ideal. ( referência do guia )
Acho que um dos índices normais é redundante e não tenho certeza se devo deixar de fora a coluna de chave de particionamento (data/hora) ou alterar um dos índices para ter a coluna de chave de particionamento (data/hora) por último. Tê-lo como parte do índice ajudará no desempenho ao selecionar um intervalo de data/hora específico dentro de uma partição?
Também seria melhor ter a chave primária (deviceService, datetime) e ter um índice no incremento automático (id)?
A tabela baseada em séries temporais abaixo tem cerca de 80+ milhões de linhas por partição mensal. Ela é quase sempre consultada para um intervalo de data/hora específico e para um subconjunto de deviceServiceId's.
O particionamento é puramente para arquivamento e manutenção de tabelas e não para desempenho.
CREATE TABLE `serviceResultLinkState`
(
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`deviceServiceId` int(10) unsigned NOT NULL,
`dateTime` datetime NOT NULL DEFAULT current_timestamp(),
`priority` tinyint(1) unsigned NOT NULL,
`alias` varchar(20) NOT NULL,
`active` tinyint(3) unsigned DEFAULT NULL,
`stable` tinyint(3) unsigned DEFAULT NULL,
`attempts` int(5) unsigned DEFAULT NULL,
`retries` int(5) unsigned DEFAULT NULL,
`resultState` tinyint(3) unsigned NOT NULL DEFAULT 0,
PRIMARY KEY (`id`,`dateTime`),
KEY `dt_ds_idx` (`deviceServiceId`),
KEY `datetime_idx` (`dateTime`,`deviceServiceId`)
) ENGINE=InnoDB AUTO_INCREMENT=24814201874 DEFAULT CHARSET=latin1 COLLATE=latin1_swedish_ci
PARTITION BY RANGE COLUMNS(`dateTime`)
(PARTITION `p_202405` VALUES LESS THAN ('2024-06-01 00:00:00') ENGINE = InnoDB,
PARTITION `p_202406` VALUES LESS THAN ('2024-07-01 00:00:00') ENGINE = InnoDB,
PARTITION `p_202407` VALUES LESS THAN ('2024-08-01 00:00:00') ENGINE = InnoDB,
PARTITION `p_202408` VALUES LESS THAN ('2024-09-01 00:00:00') ENGINE = InnoDB,
PARTITION `p_202409` VALUES LESS THAN ('2024-10-01 00:00:00') ENGINE = InnoDB,
PARTITION `p_202410` VALUES LESS THAN ('2024-11-01 00:00:00') ENGINE = InnoDB,
PARTITION `p_202411` VALUES LESS THAN ('2024-12-01 00:00:00') ENGINE = InnoDB,
PARTITION `p_max` VALUES LESS THAN (MAXVALUE) ENGINE = InnoDB);