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

MySQL select semble très lent mais ne sait pas comment s'améliorer ?

Je pense qu'il y a des problèmes avec la requête et la définition de table elle-même.

  • Table.name est une colonne de caractères de 4K
  • La requête est triée par cette colonne

Vous triez en fonction d'une colonne dans laquelle vous stockez des chaînes. Afin de trier par chaînes, des comparaisons de chaînes doivent être effectuées. La comparaison de chaînes a tendance à être une opération lente et, compte tenu de la taille de la colonne que vous utilisez, il est très probable qu'elle entraîne une baisse notable des performances.

Nous n'avons aucune indication sur le contenu de votre name colonne et il semble difficile de penser à un nom réel qui exigerait que plusieurs caractères.

Si cette chaîne contient plusieurs éléments de données qui sont conceptuellement différents, peut-être que la colonne doit être décomposée en plusieurs colonnes distinctes, si possible, puis normalisée selon le cas.

Si vous pouvez diviser le contenu de cette colonne en plusieurs colonnes plus petites, puis les utiliser, les comparaisons de chaînes, bien que toujours coûteuses, seraient "plus rapides" simplement parce que les chaînes comparées seront nettement plus courtes qu'elles ne le sont actuellement.

Une autre chose à considérer est si vous pouvez optimiser la recherche en évitant comparaisons de chaînes ou en évitant les requêtes qui entraîneront une analyse complète de la table malgré le fait que vous ayez défini des index.

Pour cela, vous devriez envisager d'utiliser explain avec votre requête, afin que vous puissiez mieux comprendre les Plan d'exécution des requêtes

Citant les docs (c'est moi qui souligne):

Modifier 1

Vous avez précisé que votre name colonne est en fait pour les notes de l'utilisateur. Dans ce cas, je pense que vous devriez considérer ce qui suit (en plus à ce qui a déjà été mentionné):

  1. Renommer la colonne en quelque chose qui correspond à son contenu réel
  2. Supprimer l'index de la colonne
  3. Ne pas utilisez cette colonne pour la recherche, le tri ou toute autre opération autre que la simple sélection pour l'afficher (ce serait très rare s'il devait être utilisé pour autre chose, à mon humble avis.)
  4. Facultativement, envisagez de remplacer la colonne par un text tapez et vous n'aurez pas à vous soucier autant des essais des utilisateurs être tronqué sans avertissement (sauf si l'interface graphique a imposé la même limite de longueur d'entrée à l'utilisateur)