Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comprendre la structure d'enregistrement MyISAM

Les informations que vous avez dans la question concernant MyISAM sont exactes. Cependant, je voudrais répondre à vos deux questions supplémentaires :

DERNIÈRE QUESTION

Selon le Livre

Chapitre 10 :"Moteurs de stockage" Page 196 Le paragraphe 7 indique

Sur la base de ce paragraphe, l'ancien enregistrement est remplacé par des données de liaison uniquement si les nouvelles données à insérer ne peuvent pas tenir dans le bloc précédemment alloué. Cela peut entraîner de nombreuses lignes gonflées.

QUESTION SUPPLÉMENTAIRE

D'après ma réponse précédente, il y aurait beaucoup de blocs qui ont

  • bloc d'espace
  • la longueur de l'enregistrement
  • le nombre d'octets inutilisés dans le bloc
  • Indicateurs de valeur NULL
  • éventuellement un pointeur vers la suite de l'enregistrement si l'enregistrement ne tenait pas dans l'espace précédemment créé et devait être fractionné

De tels liens d'enregistrement commenceraient au début de chaque ligne contenant des données surdimensionnées insérées. Cela peut gonfler une table MyISAM .MYD fichier très rapidement.

SUGGESTIONS

Le format de ligne par défaut d'un MyISAM est Dynamique. Lorsqu'une table est dynamique et subit de nombreux INSERT, UPDATE et DELETE, une telle table doit être optimisée avec

OPTIMIZE TABLE mytable;

Il existe une alternative :basculez le format de lignes du tableau sur Fixe. De cette façon, toutes les lignes ont la même taille. Voici comment rendre le format de ligne fixe :

ALTER TABLE mytable ROW_FORMAT=Fixed;

Même avec un format de ligne fixe, il faut du temps pour localiser un enregistrement disponible, mais le temps serait de O (1) temps de recherche (en termes simples, il faudrait le même temps pour localiser un enregistrement disponible, quel que soit le nombre de lignes la table a ou combien de lignes supprimées il y a). Vous pouvez contourner cette étape en activant concurrent_insert comme suit :

Ajoutez ceci à mon.cnf

[mysqld]
concurrent_insert = 2

Redémarrage de MySQL non requis. Courez simplement

mysql> SET GLOBAL concurrent_insert = 2;

Cela entraînerait l'envoi de tous les INSERTS à l'arrière de la table sans rechercher d'espace libre.

Avantage des tableaux à lignes fixes

  • Les INSERT, UPDATE et DELETE seraient un peu plus rapides
  • SELECT est 20 à 25 % plus rapide

Voici quelques-uns de mes messages sur SELECT étant plus rapides pour les formats de lignes en cours de correction

Inconvénient des tableaux à lignes fixes

Dans la plupart des cas, lorsque vous exécutez ALTER TABLE mytable ROW_FORMAT=Fixed; , le tableau peut croître de 80 à 100 %. Le .MYI fichier (pages d'index pour la table MyISAM) augmenterait également au même rythme.

ÉPILOGUE

Si vous voulez de la vitesse pour les tables MyISAM et que vous pouvez vivre avec des tables plus grandes, mes suggestions alternatives seraient nécessaires. Si vous souhaitez économiser de l'espace pour chaque table MyISAM, laissez le format de ligne tel quel (Dynamique). Vous devrez compresser la table avec OPTIMIZE TABLE mytable; plus fréquent avec les tableaux dynamiques.