Supposons que j'ai cette base de données MySQL sous le nom Ce serait la représentation des données de la table , basicaly: p> 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: p> sur celui-ci: p> 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 Au fait, l'avantage dans ce cas est que je peux facilement calculer enregistrements code>. Schéma de table serait la suivante, où
ID code> est une clé d'index et
URL code> est unique:
num_chars code> est le nombre de caractères de l'URL. p>
num_chars code> avant
URL code> Amélioration de l'efficacité. p>
num_chars code> à partir de
URL code> avant d'effectuer la requête MySQL, en utilisant php , Java, python, etc. p> p>
3 Réponses :
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.) P>
Quoi de problème, qu'est-ce que la différence pour les grands ensembles est une utilisation efficace d'un indice disponible. P>
Avec plusieurs millions de lignes, nous devons envisager la distribution des valeurs Je voudrais simplement créer un index de couverture pour la requête: P > 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. p> p> num_chars CODE>, pour les valeurs aberrantes, où il n'y a qu'une douzaine de lignes et une recherche d'index sur
num_chars code > sera rapide. Mais pour des ensembles plus importants, nous devons toujours évaluer l'URL
code> pour voir si elle correspond si elle correspond si elle correspond. P>
Merci pour votre réponse. Eh bien, la table décrite comporte 2 index, bien sûr, URL code> (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.
Vous avez un 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. P>
Lorsque vous avez un index unique, il n'est pas nécessaire d'ajouter des contrôles supplémentaires. P>
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. P>
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. P> index unique code> sur l'URL. Ainsi, les deux requêtes utiliseront cet index. P>
Merci pour votre réponse. Je ne sais pas vraiment comment MySQL moteur fonctionne des profondeurs, donc je pensais que vérifier num_chars code> (entier) avant
URL code> (chaîne) ferait la requête plus rapide. Je l'envisageais comme un
num_chars code> Pré-filtrage avant le filtrage code> URL code>, 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.
Y a-t-il une amélioration de la performance? P> blockQuote>
La réponse dépend de deux étagères: p>
- la sélectivité
forte> de la colonne num_chars code>. 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 code> La condition va toujours correspondre à beaucoup de lignes et ne pas filtrer beaucoup les choses. li>
- L'index
Index Strong> fait pour la table. Un index sur URL code> directement, sans autre index, il est susceptible de rendre cette condition surperformer l'état
num_chars code> quelle que soit la sélectivité. Cependant, placer les deux
num_charars code> et
URL code> 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é. LI > ol>
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. P>
Enfin, si vous voulez vraiment faire cela, envisagez de le faire un colonne générée . p>
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 i> d'un indice composite n'a pas d'importance! Pensez à la Bree comme étant la concaténation des deux colonnes.
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. ..