2010-06-22 5 views
1

J'ai une table ISAM avec ~ 50'000'000 enregistrements (tâches pour web crawler):Grande table MyISAM lent, même pour les insertions non simultanées/mises à jour

CREATE TABLE `tasks2` (
    `id` int(11) NOT NULL auto_increment, 
    `url` varchar(760) character set latin1 NOT NULL, 
    `state` varchar(10) collate utf8_bin default NULL, 
    `links_depth` int(11) NOT NULL, 
    `sites_depth` int(11) NOT NULL, 
    `error_text` text character set latin1, 
    `parent` int(11) default NULL, 
    `seed` int(11) NOT NULL, 
    `random` int(11) NOT NULL default '0', 
    PRIMARY KEY (`id`), 
    UNIQUE KEY `URL_UNIQUE` (`url`), 
     KEY `next_random_task` (`state`,`random`) 
) ENGINE=MyISAM AUTO_INCREMENT=61211954 DEFAULT CHARSET=utf8 COLLATE=utf8_bin 

Une fois toutes les quelques secondes une des options suivantes les opérations se déroulent (mais jamais en même temps):

  1. INSERT ... VALUES (500 lignes) - insère de nouvelles tâches
  2. UPDATE ... WHERE id IN (jusqu'à 10 IDs) - état des mises à jour pour le lot de tâches
  3. SELEC T ... WHERE (par next_random_task index) - charges lot de tâches pour le traitement

Mon problème est que les insertions et les mises à jour sont très lents - en cours d'exécution de l'ordre de dizaines de secondes, parfois plus d'une minute. Les sélections sont rapides, cependant. Pourquoi cela pourrait-il arriver et comment améliorer la performance?

Répondre

2

~ 50M sur un matériel normal est un nombre décent.

S'il vous plaît passer par this question sur sf (même si il est écrit pour InoDB, il y a des paramètres similaires pour MyISAM)

Après cela, vous devriez commencer le cycle de

  • identification (exploitation forestière) lente requêtes pour vous comprendre les modèles (ou confirmer vos hypothèses)
  • peaufiner my.cnf ou ajouter/supprimer des index (en fonction des modèles)
  • mesurer les améliorations
1
  • EXPLAIN un échantillon UPDATE sur la table complète pour assurer l'index de clé primaire est utilisé. Envisagez de remplacer state par TINYINT ou ENUM afin de réduire l'indice. (ENUM ne pourrait pas réellement faire cela).

  • Avez-vous besoin de la clé unique sur url? Cela ralentira les insertions.

Questions connexes