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

Performances CASE dans MySQL ?

À peu près tous les fonctions par ligne auront un impact sur les performances, la seule vraie question est :"L'impact est-il suffisamment faible pour ne pas s'inquiéter ?".

C'est quelque chose que vous devriez découvrir en mesurant plutôt qu'en devinant. L'administration de la base de données n'est qu'une activité définie et oubliée si ni vos données ni vos requêtes ne changent jamais. Sinon, vous devez surveiller périodiquement les performances pour vous assurer qu'aucun problème ne se produit.

Par "assez petit" dans les commentaires ci-dessus, je veux dire que vous n'avez probablement pas à vous soucier de l'impact sur les performances de quelque chose comme :

select * from friends where lowercase(lastname) = "smith"

si vous n'avez que trois amis.

L'impact de ces choses devient plus grave à mesure que la table augmente en taille. Par exemple, si vous avez cent millions de clients et que vous voulez trouver tous ceux qui sont susceptibles d'être liés à l'informatique, vous ne voudriez pas essayer :

select name from customers where lowercase(name) like '%comp%'

Cela risque de faire tomber vos DBA sur vous comme une tonne de briques.

L'une des façons dont nous avons résolu ce problème dans le passé consiste à introduire de la redondance dans les données. En utilisant ce premier exemple, nous ajouterions une colonne supplémentaire appelée lowerlastname et remplissez-le avec la valeur minuscule de lastname . Ensuite, indexez-le à des fins de recherche et votre select les déclarations deviennent extrêmement rapides, comme elles devraient l'être.

Et qu'est-ce que cela fait à notre 3NF bien-aimé, je vous entends demander? La réponse est "pas grand-chose", si vous savez ce que vous faites :-)

Vous pouvez configurer la base de données pour que cette nouvelle colonne soit remplie par un déclencheur d'insertion/mise à jour, afin de maintenir la cohérence des données. Il est parfaitement acceptable de casser 3NF pour des raisons de performances, à condition de comprendre et d'atténuer les conséquences.

De même, cette deuxième requête pourrait avoir un déclencheur d'insertion/mise à jour qui remplissait une nouvelle colonne indexée name_contains_comp chaque fois qu'une entrée contenant le texte pertinent a été mise à jour ou insérée.

Étant donné que la plupart des bases de données sont lues beaucoup plus souvent qu'elles ne sont écrites, cela déplace le coût du calcul vers l'insertion/la mise à jour, l'amortissant ainsi sur toutes les opérations de sélection. La requête serait alors :

select name from customers where name_contains_comp = 'Y'

Encore une fois, vous trouverez la requête extrêmement rapide au prix d'insertions et de mises à jour légèrement plus lentes.