J'ai une table avec environ 1 milliard de lignes qui ressemble à ceci:Comment partitionner cette grande table MySQL?
CREATE TABLE `ghcnddata` (
`date` date NOT NULL ,
`TMIN` float(6,2) NULL DEFAULT NULL ,
`TMAX` float(6,2) NULL DEFAULT NULL ,
`PRCP` float(6,2) NULL DEFAULT NULL ,
`SNOW` float(6,2) NULL DEFAULT NULL ,
`SNWD` float(6,2) NULL DEFAULT NULL ,
`station` varchar(30),
PRIMARY KEY (`station`, `date`),
INDEX `date` (`date`) USING BTREE ,
INDEX `station` (`station`) USING BTREE
) ENGINE=InnoDB
Toutes les requêtes I Run ont une ligne qui ressemble à ceci:
WHERE `station` = "ABSUXNNSDIA3"
et une ligne qui ressemble comme ceci:
AND `date` BETWEEN "1990-01-01" AND "2010-01-01"
Il y a environ 30 000 valeurs uniques pour le champ station
, et aucune requête se réfèrent à plus de 1 poste. Idéalement, j'aimerais simuler 33 333 tables différentes; un par station (1 milliard/30 000 = 33 333).
Initialement, je pensais que je pouvais accomplir cela en définissant un HASH index
sur station
, mais apparemment, c'est seulement pour MEMORY
tables. Ensuite, je pensais que je PARTITION BY KEY (station) PARTITIONS 33333
, mais il semble que ce soit beaucoup trop de partitions.
Que dois-je faire dans ce scénario? Je ne peux pas vraiment expérimenter parce que la table est si grande que les modifications prennent beaucoup de temps.
Il n'y a pas de maître/esclave ou de réplication ou de clustering ou quoi que ce soit de fantaisie.
Etes-vous sûr que le partitionnement est une bonne idée? –
Eh bien, non - mais si ce n'est pas une bonne situation pour le partitionnement, c'est quoi? Les requêtes sur cette table prennent une éternité, mais si je copie l'une des 33333 stations dans sa propre table, et interroge cela - c'est rapide. Est-ce qu'il n'y a aucun moyen de simuler cela sans réellement faire 33333 tables? –
La raison pour laquelle il est rapide avec l'une table ne s'adapte pas à autant de tables - vous aurez seulement 1/33333 de la clé et du cache de la piscine par opposition à la table unique. –