MySQL FIND_IN_SET peut-il utiliser des indices ?
Dans le domaine de l'optimisation des bases de données, les indices jouent un rôle crucial dans l'amélioration des performances des requêtes. Cependant, FIND_IN_SET, une fonction couramment utilisée pour rechercher une valeur dans une chaîne séparée par des virgules, est connue pour contourner l'utilisation de l'index, ce qui entraîne un ralentissement des performances.
Réalisation de requêtes indexées avec des paramètres de chaîne
Malgré la limitation perçue, il est possible de réaliser des requêtes indexées même lorsqu'il s'agit de chaînes séparées par des virgules. En utilisant des instructions préparées qui acceptent des chaînes comme paramètres, nous pouvons utiliser dynamiquement des indices pour améliorer l'efficacité des requêtes.
Création d'une instruction préparée
CREATE PROCEDURE my_procedure(IN csv_str VARCHAR(255)) BEGIN SET @csv_list = CONCAT('(', csv_str, ')'); SELECT * FROM users WHERE id IN @csv_list; END
Dans cette procédure stockée, le paramètre d'entrée csv_str sert de source pour la chaîne séparée par des virgules. Nous construisons dynamiquement la clause IN en utilisant la concaténation et l'attribuons à une variable de session @csv_list.
Exécuter l'instruction préparée
Pour exécuter l'instruction préparée avec une virgule spécifique- chaîne séparée, vous utiliserez la syntaxe suivante :
CALL my_procedure('1,2,3');
Optimisation de la requête
L'instruction préparée, une fois exécutée, déclenche l'optimiseur pour analyser la requête et utiliser l'index sur la colonne id. Cette utilisation de l'index est apparente dans la sortie EXPLAIN, garantissant une exécution efficace de la requête.
Conclusion
Bien que FIND_IN_SET seul n'utilise pas intrinsèquement d'index, l'utilisation d'instructions préparées avec une chaîne Les paramètres nous permettent de réaliser des requêtes indexées. Cette technique contourne les inconvénients de performances associés à FIND_IN_SET et offre des temps d'exécution de requêtes optimaux.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!