2011-07-18 5 views
1

Je voudrais savoir lequel des deux opérations suivantes sous champ varchar indexé est plus efficace (ils jouent comme des alternatives dans ma requête plus difficile):Comparer l'égalité de longueur des chaînes

length(field) == 5 

ou

field == "12345" 

D'abord, il me semblait évident que cette première clause si plus rapide. Mais comme le champ est indexé, la comparaison est plutôt rapide. Mais qu'en est-il de la longueur? Je suppose que l'index ne stocke pas d'informations sur la longueur de la chaîne ...

+0

Je ne connais pas MySQL, mais je pense que certaines bases de données comme Oracle autorisent les index basés sur les fonctions, comme la longueur d'un champ. – FrustratedWithFormsDesigner

Répondre

2

La seconde est beaucoup plus efficace dans un champ varchar indexé. Spécifiquement, le critère de restriction (correspondance exacte) est beaucoup plus restrictif qu'une restriction de longueur; cette plus grande restriction accélère la sélection.

0

Dans tous les cas, la comparaison de longueur est meilleure. Même si ces chaînes sont hachées et indexées de quelque façon que ce soit, leur comparaison ne peut pas devenir plus rapide qu'une simple comparaison d'entiers. Même si la longueur n'est pas stockée (mais je ne le crois pas), la boucle vide while(s[i] != '\0'); pour le calcul de la longueur sera plus rapide que la comparaison de la boucle char-by-char.

+1

Votre boucle s'exécute dans O (n). La comparaison exacte des valeurs hachées est O (1). –

+0

En outre, la comparaison de boucle char-by-char n'est pas TOUT le fonctionnement des bases de données. Pas même proche. –

+0

@Paul Sonier Bien sûr, db ne fait pas de char-by-char en réalité. Mais, en réalité, comme je l'ai dit, la longueur est également stockée (!) Et non calculée chaque fois que vous en avez besoin. – RReverser

Questions connexes