Mysql Slow Insert
J'ai la suite de la table MyISAM:
+-----------+-----------+------+-----+-------------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------+-----------+------+-----+-------------------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| doc_id | char(32) | NO | | NULL | |
| staff | char(18) | NO | | NULL | |
| timestamp | timestamp | NO | MUL | CURRENT_TIMESTAMP | |
+-----------+-----------+------+-----+-------------------+----------------+
Avec les touches:
+--------------+------------+-----------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment |
+--------------+------------+-----------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| staff_online | 0 | PRIMARY | 1 | id | A | 277350 | NULL | NULL | | BTREE | |
| staff_online | 1 | timestamp | 1 | timestamp | A | 277350 | NULL | NULL | | BTREE | |
| staff_online | 1 | staff_timestamp | 1 | timestamp | A | 277350 | NULL | NULL | | BTREE | |
| staff_online | 1 | staff_timestamp | 2 | staff | A | 277350 | NULL | NULL | | BTREE | |
+--------------+------------+-----------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
Je viens de remarquer que in mysql-slow.log
j'ai parfois une requête d'INSERTION sur cette table qui dure plus de 1 seconde
INSERT INTO `staff_online` (`doc_id`, `staff`, `timestamp`) VALUES ('150b60a0ab8c5888bdbbb80bd8b7f8a2', 'asia', '2011-01-29 16:52:54')
Je suis vraiment perplexe pourquoi cela prend si longtemps. Comment puis-je accélérer?
BTW: Chaque jour il y a ~80 lent INSERTS et 40 lenteur des MISES à jour comme cela.
source d'informationauteur kalkin
Vous devez vous connecter pour publier un commentaire.
Parfois, il n'est pas la requête elle-même qui provoque un ralentissement dû à une autre requête d'exploitation sur la table peut facilement causer des inserts de ralentir en raison d'transactionnelle de l'isolement et de verrouillage. Vos requêtes lentes peut-être tout simplement été en attente pour une autre transaction(s) à compléter. C'est assez courant sur une longue table, ou si votre serveur est en cours d'exécution/d'opérations complexes.
Un autre facteur important sera la performance globale de votre base de données: comment votre
my.cnf
fichier est à l'écoute, comment le serveur lui-même est à l'écoute, quoi d'autre que le serveur est en cours d'exécution sur elle, et bien sûr, quel est le matériel le serveur est en cours d'exécution.Linux outil
mytop
et la requêteSHOW ENGINE INNODB STATUS\G
peut être utile pour voir les ennuis possibles spots. Linux en général outils de performance peuvent également montrer comment occupé votre disques, etc.Compte tenu de la nature de ce tableau, avez-vous envisagé une autre façon de garder une trace de qui est en ligne? Dans MySQL, j'ai utilisé un
MEMORY
table à ces fins dans le passé. Un NoSQL banque de données pourrait aussi être bon pour ce type d'information. Redis pourrait stocker présente comme un ensemble trié avec beaucoup de succès (score == timestamp).Pour en savoir plus:
Chaque fois qu'un Arbre-B page est pleine, il doit être divisé, ce qui prend du temps. La performance de l'Insert est également plus lent plus les indices que vous avez, puisque chaque insérer des mises à jour tous les index.
9000
a déjà indiqué correctement que votre (timestamp,personnel) indice couvre l' (timestamp) index dans 95% des cas, il existe de très rares cas où une seule colonne (timestamp) indice sera nécessaire pour de meilleures performances.Il y a aussi quelques périodique des tâches en arrière-plan qui peut parfois ralentir un insert ou deux au cours d'une journée.
En outre, une autre raison de retards est tout simplement la base de données d'activité. Si vous avez les transactions qui sont de verrouillage des pages que l'insert doit mettre à jour (ou de la page-split), l'insert doit attendre jusqu'à ce que les verrous en écriture sont acquiescé. Ces autres activités ne sont même pas besoin de démarrer une transaction, et ils n'ont même pas à lire-lire la querelle; vous pouvez aussi avoir d'écriture-écriture de contention ou une queue de forte activité.
Et la dernière raison - votre serveur de base de données est hors de ressources, que ce soit la mémoire ou le PROCESSEUR ou les e/s réseau. Il ya seulement tellement un serveur peut faire, il devra attendre jusqu'à ce qu'il dispose de suffisamment de ressources.
Si vous êtes à l'insertion dans une table dans la grande dense éclats, il peut avoir besoin de prendre un peu de temps pour le ménage, par exemple pour allouer plus d'espace pour la table et l'index.
Si vous ne voulez pas votre application à attendre, essayez d'utiliser
INSERT DELAYED
si elle a ses inconvénients.Si vous exécutez dans un cluster de l'environnement, de l'auto-incrémentation des colonnes peut ralentir les inserts. Essayez de peaufinage ndb_autoincrement_prefetch_sz (voir http://dev.mysql.com/doc/refman/5.1/en/mysql-cluster-system-variables.html#sysvar_ndb_autoincrement_prefetch_sz)
Si vous arrive d'être de retour au niveau de votre installation de MySQL, nous avons remarqué que beaucoup de ce genre de lenteur lors de l'utilisation de la version 4.1.
Que mon expérience MyISAM est moins performante que MyISAM.
Avez-vous essayez d'utiliser MyISAM à la place?
Ou peut-être vous avez besoin d'ajuster votre MyISAM configuration:
http://dev.mysql.com/doc/refman/5.0/en/innodb-configuration.html
Espérons que l'aide.