Question

J'ai une collection d'enregistrements de taille moyenne - environ 20 millions - que je dois charger dans mySQL pour une utilisation dans l'analyse de données. Ce sont des enregistrements de personnes visitant des lieux. Ils sont identifiés de manière unique par trois éléments de données:

  • place - un INT unique
  • personne - chaîne de caractères, parfois numérique et parfois alphanumérique, par exemple AB12345678
  • visite -similaire à personne

Je n'ai aucun contrôle sur la personne ni sur le contenu du champ de visite, car ceux-ci sont fournis par différents endroits et chaque endroit fait sa propre chose.

Je peux trouver tous les enregistrements d'une personne en faisant correspondre les lieux et les personnes, et un enregistrement individuel en faisant correspondre les trois.

Je peux faire en sorte que cela fonctionne correctement dans mySql en créant un tableau comme celui-ci:

CREATE TABLE ENCOUNTER (
  PLACE int(11) NOT NULL,
  PERSON varchar(255) NOT NULL,
  VISIT varchar(255) NOT NULL,
  ARRIVAL_TIME datetime DEFAULT NULL,
  DEPARTURE_TIME datetime DEFAULT NULL,
  EVENT varchar(255) NOT NULL,
  PRIMARY KEY (PLACE,PERSON,VISIT)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC;

J'ai choisi MyISAM car je n'ai pas besoin de l'intégrité transactionnelle ACID sur cette table. il est utilisé pour les rapports statistiques, donc s'il ne contient qu'une ou deux lignes, ce n'est pas un problème.

La table sera souvent touchée par les messages UPDATE qui modifient simplement l'un des champs, comme DEPARTURE_TIME. Ces mises à jour seront probablement environ deux fois plus fréquentes que les nouvelles commandes INSERT. Il ne sera pas nécessaire de mettre à jour les identifiants de lieu, de personne ou de visite.

Voici quelques questions:

Est-ce que je serais mieux en termes de performances avec un seul index et une colonne clé concaténant les informations de lieu / personne / visite?

Quel succès dois-je avoir pour les index varchar? Vaut-il la peine d’essayer de les contraindre à un champ de longueur fixe?

D'autres suggestions de la sagesse recueillie?

Merci.

Était-ce utile?

La solution

vos index sont corrects. tu ne pourras pas faire beaucoup mieux que ça.

C’est une occasion parfaite et non évidente d’utiliser des partitions. J'ai le sentiment que toute votre analyse sera basée sur l'endroit. si tel est le cas, créez une partition de hachage basée sur la colonne Place, comme suit:

ALTER TABLE encounter PARTITION BY KEY(place) PARTITIONS 12;

Cela rendra vos requêtes beaucoup plus rapides, car mysql sait qu'il peut ignorer la visualisation de 1 / 12ème des lignes lors de l'analyse d'un emplacement.

Autres conseils

  

Je peux trouver tous les enregistrements d'une personne en faisant correspondre les lieux et les personnes, et un enregistrement individuel en faisant correspondre les trois.

Si vous souhaitez rechercher tous les lieux visités par une personne, vous devez créer un index supplémentaire sur (personne, lieu) .

  

Quel succès dois-je avoir pour les index varchar? Vaut-il la peine d’essayer de les contraindre à un champ de longueur fixe?

Un appui sur une touche prend le même temps pour les enregistrements INT et VARCHAR .

Une clé manquante coûte plus cher pour les champs VARCHAR .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top