MySQL FIND_IN_SET ou un équivalent peut-il utiliser des indices ?
La requête SELECT * FROM Foo WHERE FIND_IN_SET(id, '2,3') ne profite pas de l'index de clé primaire. Cela est évident lorsque l'on compare sa sortie EXPLAIN à la sortie de SELECT * FROM Foo WHERE id IN (2,3) qui utilise l'index.
Objectif : Construire une procédure stockée qui se comporte comme la deuxième requête, en utilisant l'index sans connaissance préalable de la chaîne séparée par des virgules contenant les identifiants.
Solution :
Créez une instruction préparée qui accepte une chaîne comme un paramètre :
CREATE PROCEDURE my_sp(@id_string NCHAR(1000))
L'instruction préparée peut ensuite être exécutée avec la chaîne séparée par des virgules comme argument :
EXEC my_sp '2,3'
Cette approche permet d'atteindre les conditions souhaitées suivantes :
Ces conditions indiquent que l'index est utilisé.
Considérations de sécurité :
Les instructions préparées atténuent le risque d'attaques par injection SQL. Cependant, il est toujours crucial de garantir que les données fournies par l'utilisateur sont nettoyées pour empêcher les attaques par injection SQL de 2e niveau.
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!