web-dev-qa-db-fra.com

SQL SELECT vitesse int vs varchar

Je suis en train de créer une table et cela m'a fait réfléchir.

Si je stocke, disons des voitures qui ont une marque (fx BMW, Audi ect.), Cela changera-t-il la vitesse de la requête si je stocke la marque en tant qu’int ou varchar.

Donc est

SELECT * FROM table WHERE make = 5 AND ...;

Plus rapide/plus lent que

SELECT * FROM table WHERE make = 'audi' AND ...;

ou la vitesse sera-t-elle plus ou moins la même?

87
googletorp

Les comparaisons Int sont plus rapides que les comparaisons varchar, pour le simple fait que les ints prennent beaucoup moins de place que varchars.

Cela est vrai à la fois pour les accès non indexés et indexés. Le moyen le plus rapide consiste à utiliser une colonne int indexée.


Comme je vois que vous avez tagué la question postgreql, l'utilisation de l'espace de différents types de date pourrait vous intéresser:

84
Robert Munteanu

Quelques repères approximatifs:

4 millions de disques dans Postgres 9.x

Table A = base table with some columns
Table B = Table A + extra column id of type bigint with random numbers
Table C = Table A + extra column id of type text with random 16-char ASCII strings

Résultats sur 8 Go de RAM, i7, SSD portable:

Size on disk:                A=261MB        B=292MB        C=322MB
Non-indexed by id: select count(*), select by id: 450ms same on all tables
Insert* one row per TX:       B=9ms/record        C=9ms/record
Bulk insert* in single TX:    B=140usec/record    C=180usec/record
Indexed by id, select by id:  B=about 200us       C=about 200us

* inserts to the table already containing 4M records

donc, il semble que pour cette configuration, tant que vos index tiennent dans la RAM, le texte bigint vs 16 caractères ne fait aucune différence de vitesse.

19
Grzegorz Luczywo

Ce sera un peu plus rapide en utilisant un int au lieu d'un varchar. Le plus important pour la rapidité est d’avoir un index sur le champ que la requête peut utiliser pour trouver les enregistrements.

Il existe une autre raison d'utiliser un int: la normalisation de la base de données. Au lieu d'avoir le texte «Mercedes-Benz» stocké des milliers de fois dans le tableau, vous devez stocker son identifiant et le nom de la marque stocké une fois dans un tableau séparé.

16
Guffa

Décrire les performances réelles de la comparaison de chaînes par rapport aux non-flottants, dans ce cas, toute taille non signée et signée importe peu. La taille est en réalité la vraie différence de performance. Que ce soit 1 octet ou plus (jusqu’à 126 octets) par rapport à une comparaison de 1,2,4 ou 8 octets ... les non-float sont évidemment plus petits que les chaînes et les float, et sont donc plus conviviaux en CPU dans Assembly.

La comparaison chaîne à chaîne dansall languages ​​est plus lente que ce qui peut être comparé en 1 instruction par la CPU. Même comparer 8 octets (64 bits) sur un processeur 32 bits est toujours plus rapide qu'un VARCHAR (2) ou supérieur. * Encore une fois, regardez l’Assemblée produite (même à la main), il faut plus d’instructions pour comparer caractère par caractère que de 1 à 8 octets numériques.

Maintenant, combien plus vite? dépend aussi du volume de données. Si vous comparez simplement 5 à 'audi' - et que c'est tout ce que votre base de données a, la différence qui en résulte est si minime que vous ne la verriez jamais. Selon le processeur, l’implémentation (client/serveur, Web/script, etc.), vous ne le verrez probablement pas tant que vous n’aurez pas effectué quelques centaines de comparaisons sur le serveur de base de données (peut-être même quelques milliers de comparaisons avant que cela soit perceptible).

  • Pour annuler le conflit incorrect sur les comparaisons de hachage. La plupart des algorithmes de hachage eux-mêmes sont lents, vous ne pouvez donc pas tirer parti de choses comme CRC64 et plus petites. Pendant plus de 12 ans, j'ai développé des algorithmes de recherche pour les moteurs de recherche multi-pays et 7 ans pour les agences d'évaluation du crédit. Tout ce que vous pouvez conserver en numérique le plus rapidement possible ... par exemple les numéros de téléphone, les codes postaux, même la devise * 1000 (stockage) la devise div 1000 (récupération) est plus rapide que DECIMAL pour les comparaisons.

Ozz 

6
Ozz Nixon

En général, l'int sera plus rapide. Plus le varchar est long, plus il ralentit

4
anthares

Index ou non, int est beaucoup plus rapide (plus le varchar est long, plus il est lent).

Une autre raison: index sur le champ varchar sera beaucoup plus grand que sur int. Pour les tables plus volumineuses, cela peut signifier des centaines de mégaoctets (et des milliers de pages). Cela rend les performances bien pires car la lecture de l'index nécessite à elle seule de nombreuses lectures sur le disque.

4
Konrad Garus

Conseil: Si les valeurs possibles du champ make ne changeront jamais jamais (ou rarement), vous pouvez utiliser ENUM comme compromis. Il combine une bonne vitesse avec une bonne lisibilité.

3
Thomas Schaub

Si vous activez l'indexation sur l'un des champs, ce sera plus rapide. En ce qui concerne votre question, je pense que intest plus rapide que varchar.

1
Sarfraz

Un peu relatif. Oui, les INT seront plus rapides, mais la question est de savoir si cela se remarque dans votre situation. Les VARCHARs ne sont-ils que de petits mots ou des textes plus longs? et combien de lignes y a-t-il dans la table? S'il n'y a que quelques lignes, il sera probablement entièrement mis en mémoire tampon (lorsque demandé fréquemment), dans ce cas, vous ne remarquerez pas beaucoup de différence. Ensuite, il y a bien sûr l'indexation, qui devient plus importante lorsque la table s'agrandit. L'utilisation de disques SSD peut être plus rapide que celle d'un disque dur avec des requêtes optimisées. De même, les bons contrôleurs de disque accélèrent parfois les requêtes> 10x. Cela pourrait laisser de la place à l'utilisation de VARCHAR, ce qui facilite la lecture et l'écriture de requêtes (plus besoin d'écrire des jointures complexes) et accélère le développement. Cependant les puristes seront en désaccord et normaliseront toujours tout. 

0
Alex