
Optimiser la structure de la base de données
Optimiser la taille des données
→ Réduire la quantité de données écrites et lues sur le disque
→ Moins de mémoire principale pendant que leur contenu est activement traité lors de l'exécution de la requête
→ Permet d'obtenir des index plus petits qui peuvent être traités plus rapidement
Colonnes du tableau
- Utilisez les types de données les plus efficaces (les plus petits) possibles
- Déclarez les colonnes comme NON NULL si possible → meilleure utilisation des index et élimination de la surcharge pour tester si chaque valeur est NULL.
Index
- L'index principal d'une table doit être aussi court que possible
- Créez uniquement les index dont vous avez besoin pour améliorer les performances des requêtes. Les index sont utiles pour la récupération, mais ralentissent les opérations d'insertion et de mise à jour.
- recherche sur une combinaison de colonnes → créer un index composite
- la première colonne de l'index doit être celle avec le plus de doublons → pour obtenir une meilleure compression de l'index.
Joint
- Déclarer les colonnes avec des informations identiques dans différentes tables avec des types de données identiques → même type de données
- Gardez les noms de colonnes simples,
Normalisation
- Normalement, essayez de conserver toutes les données non redondantes
- Si la vitesse est plus importante que l'espace disque et les coûts de maintenance liés à la conservation de plusieurs copies de données
Optimiser le type de données
- Pour les identifiants uniques ou d'autres valeurs pouvant être représentées sous forme de chaînes ou de nombres, → les valeurs numériques peuvent être stockées dans moins d'octets que les chaînes correspondantes, plus rapidement et nécessitent moins de mémoire pour les transférer et les comparer.
- Lorsque vous comparez les valeurs de différentes colonnes, déclarez ces colonnes avec le même jeu de caractères et le même classement dans la mesure du possible → évitez les conversions de chaînes
- Pour les valeurs de colonne inférieures à 8 Ko, utilisez le binaire VARCHAR au lieu de BLOB. Les clauses GROUP BY et ORDER BY peuvent générer des tables temporaires, et ces tables temporaires peuvent utiliser le moteur de stockage MEMORY si la table d'origine ne contient aucune colonne BLOB .
- Si une table contient des colonnes de chaîne et n'y accède pas fréquemment → diviser en une autre table et rejoindre → Lorsque MySQL récupère une valeur d'une ligne, il lit un bloc de données contenant toutes les colonnes de cette ligne (et éventuellement d'autres lignes adjacentes). Garder chaque ligne petite, avec uniquement les colonnes les plus fréquemment utilisées, permet d'insérer davantage de lignes dans chaque bloc de données.
- Lorsque vous utilisez une valeur générée aléatoirement comme clé primaire dans une table InnoDB, préfixez-la avec une valeur ascendante telle que la date et l'heure actuelles si possible.
- Pour une table comportant plusieurs colonnes, afin de réduire les besoins en mémoire pour les requêtes qui n'utilisent pas la colonne BLOB, envisagez de diviser la colonne BLOB en une table distincte et de la référencer avec une requête de jointure si nécessaire
- • Étant donné que les exigences de performances pour récupérer et afficher une valeur BLOB peuvent être très différentes de celles d'autres types de données, vous pouvez placer la table spécifique au BLOB sur un autre périphérique de stockage ou même sur un séparé. instance de base de données. Par exemple, la récupération d'un BLOB peut nécessiter une lecture séquentielle volumineuse sur disque, mieux adaptée à un disque dur traditionnel qu'à un périphérique SSD.
- Plutôt que de tester l'égalité par rapport à une chaîne de texte très longue, vous pouvez stocker un hachage de la valeur de la colonne dans une colonne distincte, indexer cette colonne et tester la valeur hachée dans les requêtes. (Utilisez la fonction MD5() ou CRC32() pour produire la valeur de hachage.)
Optimisation des instructions SQL
Nous avons trouvé utile d'analyser une requête peu performante en deux étapes :
- Découvrez si votre application récupère plus de données que vous n'en avez besoin. Cela signifie généralement qu'il accède à trop de lignes, mais il se peut également qu'il accède à trop de colonnes.
- Découvrez si le serveur MySQL analyse plus de lignes qu'il n'en a besoin.
Optimisation des instructions SELECT
- Évitez d'utiliser des fonctions dans les prédicats
- Éviter d'utiliser un caractère générique (%) au début d'un prédicat
- Utilisez DISTINCT et UNION uniquement si nécessaire