10.12 Comment constituer une table pour qu'elle soit petite et rapide?

Vous pouvez accélerer le traitement et minimiser l'espace de stockage d'une table en utilisant les techniques suivantes :

  • Déclarez mes colonne comme NOT NULL si possible. Cela accélère l'ensemble, et vous économisez un bit par colonne
  • Profitez du fait que toutes les colonnes ont une valeur par défaut. Insérez les valeurs explicitement uniquement lorsque la valeur insérée diffère de la valeur par défaut. Vous n'avez ainsi pas besoin d'affecter de valeur à la première colonne de type TIMESTAMP ou de type AUTO_INCREMENT lors d'une commande INSERT. mysql_insert_id().
  • Utilisez autant que possible la plus petite taille d'entier. Les tables en seront réduites d'autant. Par exemple, MEDIUMINT est souvent plus efficace que INT.
  • Si vous n'avez pas de colonne de longueur variable (VARCHAR, TEXT ou BLOB), la ligne est de longueur fixe. Cela nettement plus rapide, mais cela peut gaspiller un peu de place . 10.17 Quel sont les différents formats de lignes? Quand utiliser VARCHAR/CHAR?.
  • Pour aider MySQL à optimisez les requêtes, utilisez isamchk --analyze sur une table, après l'avoir chargée avec les données adéquates. Cela met à jours une caractéristiques de la table, qui indique le nombre moyen de ligne qui ont la même valeur. (Pour les index uniques, cette valeur vaudra 1, bien entendu).
  • Pour classer un index et des données en fonction d'un index, utilisez isamchk --sort-index --sort-records=1 (pour trier avec l'index 1). Si vous avez un index unique dont vous voulez lire toutes lignes dans l'ordre de l'index, c'est une bonne idée pour accélèrer la requête. Remarquez bien que ce classement n'est pas optimal, et qu'il peut s'avérer long pour une grande table.
  • Pour les commandes INSERT, utilisez des insertions multiples. C'est beaucoup plus rapide que de faire des insertions séparées.
  • Lorsque vous chargez des données, utilisez LOAD DATA INFILE. Cette commande est généralement 20 fois plus rapide que des commandes INSERT repétées. LOAD DATA. Vous pouvez même gagner encore plus de vitesse en chargeant les données dans une table avec de nombreux index en utilisant la procédure suivante :
    1. Créez une table avec mysql ou Perl avec CREATE TABLE.
    2. Exécutez mysqladmin flush-tables.
    3. Utilisez isamchk --keys-used=0 -rq /path/to/db/nom_table. Cela va effacer tous les index de cette table.
    4. Insérez les données dans la table avec LOAD DATA INFILE.
    5. Si vous avez pack_isam et voulez compresser les tables, lancez pack_isam.
    6. Recréez les index avec isamchk -r -q /path/to/db/nom_table.
    7. Exécutez mysqladmin flush-tables.
  • Pour gagner un peu de vitesse avec LOAD DATA INFILE et INSERT, agrandissez le buffer de clés. Cela peut se faire avec l'option -O key_buffer=# option de mysqld ou safe_mysqld. Par exemple, 16M est une bonne valeur si vous disposez de beaucoup de RAM
  • Lorsque vous créez des textes d'exportation pour les réutilisez dans d'autres programmes, utilisez SELECT ... INTO OUTFILE. Reportez vous à la section LOAD DATA.
  • Lorsque vous faites des insertions ou des modifications nombreuses et successives, vous pouvez gagner de la vitesse en verrouillant la table avec LOCK TABLES. LOAD DATA INFILE et SELECT ...INTO OUTFILE sont atomique, ce qui rend inutile l'utilisation de LOCK TABLES lors de leur utilisation. LOCK TABLES.

Pour vérifier l'état de fragmentation de vos tables, utilisez isamchk -evi sur le fichier``.ISM''. Reportez vous à la section 13 Maintenance d'un serveur MySQL