J'ai une table de restriction de la région pour les codes de produit. Le code de produit n'a pas de longueur fixe, il pourrait varier entre 10 et 25 numéros. La restriction pourrait contenir un préfixe d'un produit afin que tous les produits de cette plage seront interdits.
Utilisé db est mariadb / mysql et voici une définition de table: En ce moment, j'utilise 15 requêtes définies par la longueur du code de produit cible, donc je suis en mesure de trouver tout Parmi les préfixes, donc dans mon code, j'ai 15 questions comme celle-ci: p> dans ce tableau est d'environ 100 millions d'enregistrements. Ma question est qu'il y a un moyen de réduire ceci à une seule requête avec la même performance de sélection? Le changement de structure de table est malheureusement sorti de ma puissance. P> édité après l'instrument () indice de @PHAM X. BACH: EM> P> P> Quelques tests sur mon échantillon local DB, où je n'ai que 6 70 000 enregistrements d'échantillons, et l'INSTR () fonctionne, mais du point de vue de la performance, cela ressemble beaucoup. Je devrai attendre demain, pour faire ce test sur l'échantillon de production. P> ici est analyser (expliquer) pour ma requête d'origine: p> Et ici pour l'INSTR: P>
SELECT *
FROM product_restrict
WHERE
region='XXX' AND
INSTR('98765432109876543', id) = 1 AND (
now() >= from_dttm AND
( now() < to_dttm OR to_dttm is null)
);
3 Réponses :
Vous pouvez utiliser une condition simple comme une condition
Premièrement, il n'y a aucune raison pour ne pas simplement ajuster votre requête actuelle:
WHERE pr.region = 'XXX' AND now() >= pr.from_dttm AND ( now() < pr.to_dttm OR pr.to_dttm is null) AND ('98765432109876544' LIKE concat(pr.id, '%') OR '98765432109876543' LIKE concat(pr.id, '%') OR . . . )
Merci, la version dans code> est parfaite.
Une autre façon de vérifier le préfixe.
AND LEFT('9876543210987654', LENGTH(id)) = id
Pouvez-vous s'il vous plaît fournir des échantillons de données avec la sortie requise?
1. Votre
(... ou ...) code> La condition peut être remplacée par une fonction simple
instrtr () code> (et pourrait combiner avec
longueur () code > aussi). 2. Vous avez dit que vous utilisez 15 questions, mais vous ne montrez que 2 questions dans votre question.
ID de champ est Varchar malgré le fait que c'est le numéro. La longueur de ce nombre est entre 1 et 25 et cela pourrait être vraiment un nombre avec cette longueur. Région de terrain est un code de pays numérique Alfa numérique ("USA", "MEX", "DEU" et SO ON ") Date de_DTTM est la date et l'heure d'insertion de cet élément à la table. Champ TO_DTTM est date et heure, ce qui signifie que cet article est de cette date invalide.
Oui, je ne montre que deux requêtes, par exemple, pourriez-vous me montrer l'équivalent de celui avec
instr () code> utilisation?
et instrtré ('98765432109876543', ID) = 1 code>