Nous avons une application Web simple fonctionnant sur une machine virtuelle qui enregistre ses données dans une base de données MySQL 5.5 avec le moteur InnoDB. Tout a bien fonctionné pendant environ trois ans, mais soudain, cela est devenu extrêmement lent.
Par exemple, j'ai une table très simple contenant des adresses:
CREATE TABLE `addresses` (
`address_id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(64) CHARACTER SET latin1 NOT NULL,
`firstname` varchar(64) CHARACTER SET latin1 NOT NULL,
`street` varchar(64) CHARACTER SET latin1 NOT NULL,
`housenumber` varchar(16) CHARACTER SET latin1 NOT NULL,
`zip` varchar(5) CHARACTER SET latin1 NOT NULL,
`city` varchar(64) CHARACTER SET latin1 NOT NULL,
`email` varchar(64) CHARACTER SET latin1 NOT NULL,
`phone` varchar(16) CHARACTER SET latin1 NOT NULL,
`birthdate` date NOT NULL,
PRIMARY KEY (`address_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin
Ce tableau contient environ 800 entrées, ce qui n'est vraiment pas beaucoup. Mais exécuter la requête
SELECT * FROM addresses
à des fins de test, il semble ne jamais finir. J'ai vérifié cela avec la CLI mysql sur le serveur lui-même: il sort quelques lignes de la table puis attend très longtemps jusqu'à ce qu'il sorte les lignes suivantes.
C'est peut-être un problème dans la phase d'envoi de données, mais je ne suis pas sûr.
La machine virtuelle a 2 Go de RAM et seulement 320 Mo sont utilisés. Le CPU fonctionne également à très faible 1 à 2%. mytop n'affiche aucune autre requête bloquant le serveur. L'administrateur informatique a déclaré qu'il n'avait rien changé du côté matériel.
J'ai déjà essayé quelque chose comme redémarrer le serveur de base de données, redémarrer la machine virtuelle. Rien n'a aidé.
Éditer:
EXPLAIN SELECT * FROM addresses
me donne ce résultat:
+----+-------------+-----------+------+---------------+------+---------+------+------+-------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-----------+------+---------------+------+---------+------+------+-------+
| 1 | SIMPLE | addresses | ALL | NULL | NULL | NULL | NULL | 793 | |
+----+-------------+-----------+------+---------------+------+---------+------+------+-------+
1 row in set (0.00 sec)
la source
mysql -u username -ppassword mydb -e 'SELECT * FROM addresses
est lente, mais en ajoutant `> test.txt`, elle s'exécute très rapidement. Maintenant, ce serait probablement une question différente!? Comment pourrais-je enquêter là-dessus?Réponses:
Si la charge du processeur est faible, cela indique qu'il n'y a pas de problème avec les index manquants, si c'était le cas, la requête aurait juste besoin de prendre plus de CPU et d'accès au disque. Vous avez également dit que cela fonctionnait bien pendant 3 ans.
Avez-vous vérifié la vitesse générale d'accès au disque (en particulier sur la partition où se trouve la base de données)? Par exemple en utilisant
dd
comme ici . Ce que vous décrivez ressemble à un disque mort ou à un raid à moitié mort. Vous avez des sauvegardes j'espère?la source
Vous pouvez essayer quelques trucs,
L'indexation permet de trouver rapidement des enregistrements sans effectuer d'abord une analyse complète de la table, ce qui réduit considérablement les temps d'exécution.
Lorsqu'il est utilisé devant une requête SELECT, il décrira comment MySQL a l'intention d'exécuter la requête et le nombre de lignes qu'il devra traiter avant de terminer.
Il existe de nombreux optimiseurs MySQL qui peuvent vous guider.
Aide cela aide
la source
htop
montre que seulement 307 Mo sur 2050 Mo de RAM sont utilisés.name
et `` prénom ''. Deuxièmement, êtes-vous sûr d'avoir correctement indexé? possible_keys: NULL si la colonne est NULL, cela indique qu'aucun index pertinent n'a pu être trouvé.