2013-03-06 7 views
9

Quel est le meilleur pour le champ d'index, et le jeton d'espace sur le disque dur/RAM? Biginteger ou Varchar (15)? Je peux avoir par exemple tel numéro d'index:Mysql Bigint VS Varchar

from 10000001 to 45281229703 and higher... 

Mais ce qui vaut mieux choisir? Également sur le champ non indexé quel type de champ est le meilleur?

+1

Une meilleure question est quel type * correctement * représente le champ .. une fois que répond, utiliser. S'il n'y a pas de problème de performance * mesuré * (avec une configuration qui peut également mesurer la performance des alternatives), alors il n'y a pas de problème de performance - ne pas "optimiser" comme ceci. –

+0

@pst problème est que bigint et varchar - les deux représentent le champ normalement et donc, comment j'ai besoin – brabertaser19

+0

Non. One représente un nombre. L'autre représente le texte (qui pourrait être la représentation textuelle d'un nombre). Qui est correct? –

Répondre

23

BIGINT est toujours 8 octets, VARCHAR(15) est 1..16 octets en fonction de la longueur de la valeur, donc BIGINT a besoin de moins de mémoire sur les grands numnbers, mais plus de mémoire sur un petit nombre (moins de 7 chiffres). En outre, BIGINT est plus rapide.

+0

mais en tant que clé étrangère dans l'autre table? par exemple: id text for_id, que pour id je dois faire aussi bigint aussi, non? Alors que choisir?) si j'ai de 1 à 45281229703 et plus haut – brabertaser19

+0

de la ligne non signé/signé ici est grande différence? – brabertaser19

+0

Rappelez-vous également que Varchar nécessite une traduction d'encodage et est donc ambigu, un nombre brut n'a pas ce problème. – 0xCAFEBABE

3

varchar ajoute les frais généraux:

longueur des besoins de chaîne stockés (2 octets IIRC supplémentaire dans MySQL) par champ et dans l'indice nécessite plus de traitement pour la collation sur la comparaison

+0

mais en tant que clé étrangère dans l'autre table? par exemple: id text for_id, que pour id je dois faire aussi bigint aussi, non? – brabertaser19

+0

oui aussi bigint – PSR

+0

aussi non signé/signé ici est grande différence? – brabertaser19

3

Nous avons couru tests en simulation environnement.

  1. Créé avec 1 paramètre BIGINT et 1VARCHAR.
  2. Insertion de lignes 30Lac.
  3. créé un index sur les deux champs.
  4. Le résultat est: BIGINT répondre presque 20time plus vite que VARCHAR.

est le script ici pour étapes ci-dessus:

Create table r5(mob bigint,m_mob varchar(30)); 

Create index i_d on r5(mob,m_mob); 


do $$ 
begin 
for i in 1..3000000 loop 
insert into r5(mob,m_mob) values(i,i||’abc’); 
end loop; 
end; $$ 

select * from r5 
where mob=2900000; 

select * from r5 
where m_mob=’2900000abc’;