0
votes

Amélioration des performances de la requête MySQL, où l'état entier avant condition de chaîne

Supposons que j'ai cette base de données MySQL sous le nom enregistrements . Schéma de table serait la suivante, où ID est une clé d'index et URL est unique: xxx

Ce serait la représentation des données de la table , basicaly: xxx

num_chars est le nombre de caractères de l'URL.

ma question est, étant donné que ce tableau va probablement frapper plusieurs millions d'enregistrements: y a-t-il une amélioration de la performance de cette requête: xxx

sur celui-ci: xxx

Je sais que les requêtes basées sur les entiers sont plus efficaces que celles basées sur des cordes (corrigez-moi si je me trompe), je me demande donc si filtrant par num_chars avant URL Amélioration de l'efficacité.

Au fait, l'avantage dans ce cas est que je peux facilement calculer num_chars à partir de URL avant d'effectuer la requête MySQL, en utilisant php , Java, python, etc.


7 commentaires

Pourquoi ne pas insérer plusieurs millions de disques manneaux et le tester? Cela prend 5 minutes.


Pourquoi stocker num_chars? Finira facilement par incompatible.


@ T1F Merci pour votre commentaire. Cela m'a fallu plus de 10 mines pour écrire cette question, donc non, ce n'est pas une question de temps. Cette question pourrait également aider les autres à être éclairées. Si une personne avec les connaissances requises peut répondre à cette question, ou du moins légitimement la marque comme dupliquée, ce serait merveilleux!


@jarlh Je ne sais pas où l'incohérence aurait lieu, si vous pouvez expliquer cela, s'il vous plaît.


Quelques URL de mise à jour, mais oublient les numéros num_chars. Erreur classique.


@jarlh ce n'est pas le problème dans ce cas. Nous devons nous concentrer sur la partie d'optimisation.


Pas maintenant, mais ce sera peut-être, puis vous ne trouverez pas le ' Yahoo.com ' rangée du tout. ..


3 Réponses :


0
votes

Sans index approprié défini, ces deux requêtes vont sucer.

Ce n'est pas vrai que les requêtes entier sont plus efficaces que celles basées sur le texte; Nous pouvons démontrer des requêtes de texte qui fleurissent rapidement et les requêtes entière qui sont glaciales. (Au moins, ce n'est pas assez vrai dans ce cas pour faire toute différence.)

Quoi de problème, qu'est-ce que la différence pour les grands ensembles est une utilisation efficace d'un indice disponible.


Avec plusieurs millions de lignes, nous devons envisager la distribution des valeurs num_chars , pour les valeurs aberrantes, où il n'y a qu'une douzaine de lignes et une recherche d'index sur num_chars sera rapide. Mais pour des ensembles plus importants, nous devons toujours évaluer l'URL pour voir si elle correspond si elle correspond si elle correspond.


Je voudrais simplement créer un index de couverture pour la requête: xxx

puis exécutez la requête que vous voulez; Nous prévoyons le même plan d'exécution, la performance sera la même.


3 commentaires

Merci pour votre réponse. Eh bien, la table décrite comporte 2 index, bien sûr, URL (unique) est celui qui compte dans ce cas. Quoi qu'il en soit, vous avez mentionné quelque chose qui conduit à un point important: où les conditions ordonnent. Je vais enquêter à ce sujet tout de suite.


J'ai manqué l'index unique sur la colonne URL. L'ordre des prédicats (conditions) de la clause de l'endroit où l'optimiseur n'a pas d'importance. Utilisez Expliquez pour voir le plan d'exécution.


Désolé, c'était une faute de frappe, mon mauvais.



1
votes

Vous avez un index unique sur l'URL. Ainsi, les deux requêtes utiliseront cet index.

Ajout d'un contrôle supplémentaire sur la longueur ne va pas accélérer la requête. Il y aura une surcharge supplémentaire très très faible pour la vérification de la longueur, mais c'est immatériel.

Lorsque vous avez un index unique, il n'est pas nécessaire d'ajouter des contrôles supplémentaires.

Remarque: L'avantage d'une comparaison entière sur une comparaison de chaîne survient lorsque vous n'avez pas besoin de faire une comparaison de chaîne. Dans ce cas, vous devez faire la comparaison des chaînes.

Il pourrait y avoir un gain minuscule si vous avez hashé la chaîne à un entier et comparé qu'avant de comparer la chaîne.


2 commentaires

Merci pour votre réponse. Je ne sais pas vraiment comment MySQL moteur fonctionne des profondeurs, donc je pensais que vérifier num_chars (entier) avant URL (chaîne) ferait la requête plus rapide. Je l'envisageais comme un num_chars Pré-filtrage avant le filtrage URL , si je ne me trompe pas à l'aide du mot "filtre" dans ce cas.


@Eduardoescobar. . . Vous n'obtenez aucun gain en filtrant avant d'utiliser un index unique.



0
votes

Y a-t-il une amélioration de la performance?

La réponse dépend de deux étagères:

  1. la sélectivité de la colonne num_chars . Si beaucoup de vos données proviennent de quelques sources différentes: des choses comme des raccourcisseurs d'URL, des liens de produits Amazon, etc. - vraiment n'importe quel système où vous avez un nombre relativement petit des longueurs possibles - en ajoutant que num_chars = 17 La condition va toujours correspondre à beaucoup de lignes et ne pas filtrer beaucoup les choses.
  2. L'index Index fait pour la table. Un index sur URL directement, sans autre index, il est susceptible de rendre cette condition surperformer l'état num_chars quelle que soit la sélectivité. Cependant, placer les deux num_charars et URL dans un seul index, dans cet ordre, pourrait être capable de faire bon avantage du champ supplémentaire, même avec une mauvaise sélectivité.

    Mais rappelez-vous: les vendeurs de la base de données ne sont pas stupides. Ils consacrent beaucoup d'efforts pour trouver des moyens d'optimiser les requêtes. Il y a de bonnes chances que le moteur peut déjà faire ce genre de chose dans les coulisses. La meilleure chose à faire est de générer des données d'échantillonnage dans une table et de le tester, de savoir ce qui va vraiment arriver.

    Enfin, si vous voulez vraiment faire cela, envisagez de le faire un colonne générée .


2 commentaires

Merci, je garderai ça à l'esprit. À la fin, il semble que je devrais effectuer des tests par moi-même.


La sélectivité des composants d'un indice composite n'a pas d'importance! Pensez à la Bree comme étant la concaténation des deux colonnes.