2015-04-27 1 views
0

N'a pas trouvé de réponse claire à cette question ici.Évolutivité d'insertion/mise à jour (recherche dans une liste de plus en plus longue pour la mise à jour impossible à mettre en correspondance)

J'effectuer une base « Insérer/Mettre à jour » - canalisant de nouvelles données dans une base de données MySQL de « billets »

Par exemple:

ticket_id: 154 
status: open 
messages: 2 

Ce serait un billet dans le. DB

Un enregistrement entrant serait inséré/mis à jour en fonction du ticket_id. Aka si le ticket_id est nouveau, il sera inséré, s'il est recherché et trouvé, il sera mis à jour. tickets_ids sont incrémentés séquentiellement dans l'ordre croissant. cket_id 1 est le premier ticket, etc.

Voici mon problème. En ce moment, je suis insertion/mise à jour contre 100 000 ticket_ids dans la base de données. Chaque insertion/mise à jour d'écriture (contrairement à une insertion pure) - doit rechercher chaque ID entrant contre 100 000 ID pour déterminer une correspondance potentielle pour la mise à jour. Chaque mois, cela sera augmenté de 60 000 billets supplémentaires jusqu'à ce que plus de 1 000 000 ticket_ids soient "recherchés" lors de chaque insertion/mise à jour quotidienne. Ce n'est pas évolutif. En fait, il semble que ce soit un problème extrêmement commun pour toute insertion/mise à jour régulière dans une grande base de données MySQL.

Voici les potentiels de bonnes choses:

  1. Ticket_IDs sont uniques et augmentent de manière séquentielle
  2. billets deviennent Statut: Fermé après 30 jours d'inactivité. Cela signifie qu'ils ne seront jamais mis à jour à nouveau. C'est la clé ici. Je ne sais pas comment techniquement "ignorer" ces tickets lors d'une insertion/mise à jour sans les "regarder" tous les jours. Une méthode consiste à transférer tous les jours, ou tous les mois, les tickets «fermés» vers une table DB distincte et à utiliser une union pour les requêtes de base de données. Des pensées à ce sujet? Je ne suis aucun administrateur de DB par aucun moyen.

Est-ce la réponse? 2 tables, et l'archivage des tickets?

Et aussi ... Y at-il avantage à indexer Ticket_ID? J'ai entendu que cela augmente le temps d'écriture, mais diminue le temps de lecture.

Mon problème en ce moment, je pense, est l'heure d'écriture pour l'insertion/mise à jour, pas les instructions SELECT. Mais un gars m'a dit que l'insertion/mise à jour est essentiellement un SELECT/recherche de toute façon.

+0

Vous avez probablement déjà un index sur Ticket_id en fonction de la configuration de votre table. Cela permettra à votre table d'augmenter à presque n'importe quelle taille avec peu de changement à la vitesse de votre requête. Non seulement cela, mais avec la simplicité de vos requêtes, le temps de lecture/écriture devrait être négligeable de toute façon. –

Répondre

0

La première chose que vous devez faire est de revoir les indices que vous avez déjà

SHOW CREATE TABLE my_table_name\G 

Si vos UPSERTs deviennent plus lents, l'ajout d'un index TICKET_ID est sans aucun doute un bon endroit pour commencer. Je suggère que vous en fassiez un index unique.

CREATE UNIQUE INDEX my_index_name my_table_name (ticket_id); 

Ajout d'indices ne ralentissent INSERTs, mais pour une base de données avec 60.000 nouveaux dossiers par mois et 1.000.000 dossiers au total, vous ne remarquerez probablement pas.

+0

Merci, il semble que l'index peut aider, mais je ne sais pas exactement combien.A la fin de la journée, il y aura toujours un log croissant à "rechercher" contre --- à moins que l'index Ticket_ID ne change un temps d'écriture de 10 minutes en quelques secondes ou quelque chose de cette ampleur. Qu'en est-il de l'idée des deux tables? Cela ne réduirait-il pas un peu le travail? Merci – user45867

+0

Il est possible qu'un index puisse réduire une requête de 10 minutes à quelques secondes. Bien que l'on puisse théoriquement analyser ces choses, il est généralement plus rapide et plus fiable de l'essayer. Comme pour deux tables, c'est une possibilité. Mais pour la quantité de données que vous avez, c'est probablement plus de travail que de valeur. – phylae

+0

Il se trouve un index simple (je pense que c'est un B-tree, pas sûr que les cas d'utilisation pour une table de hachage, semble mieux pour les comparaisons directes d'égalité) sur un champ unique 'Ticket ID' minutes à environ 2 minutes. (Ceci est 1000 lignes contre 250k). Je préférerais que 1000 lignes soient mises à jour/insérées encore plus rapidement, mais c'est un grand pas en avant. Je pourrais devoir examiner de plus près l'optimisation des types de données pour chaque colonne, mais oui - je ne savais pas que les index étaient essentiels. – user45867