0
votes

Requête de substring mysql

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: xxx pré>

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> xxx pré>

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> xxx pré>

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)
);


5 commentaires

Pouvez-vous s'il vous plaît fournir des échantillons de données avec la sortie requise?


1. Votre (... ou ...) La condition peut être remplacée par une fonction simple instrtr () (et pourrait combiner avec longueur () 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 () utilisation?


et instrtré ('98765432109876543', ID) = 1


3 Réponses :


0
votes

Vous pouvez utiliser une condition simple comme une condition xxx


0 commentaires

1
votes

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
       . . .
      )


1 commentaires

Merci, la version dans est parfaite.



0
votes

Une autre façon de vérifier le préfixe.

AND LEFT('9876543210987654', LENGTH(id)) = id


0 commentaires