2013-03-06 22 views
9

Was ist das beste für Indexfeld und Speicherplatz Token auf Festplatte/RAM? Biginteger oder Varchar (15)? Ich kann haben Beispiel solche Indexnummer:Mysql Bigint VS Varchar

from 10000001 to 45281229703 and higher... 

Aber was ist besser zu wählen? Auch auf Non-Indexing-Feld welcher Feldtyp ist besser?

+1

Eine bessere Frage ist, welche Art * richtig * das Feld darstellt .. einmal, dass beantwortet wird, es zu benutzen. Wenn es kein * gemessenes * Leistungsproblem gibt (mit einem Setup, das auch die Leistung von Alternativen messen kann), gibt es kein Leistungsproblem - nicht "optimieren" so. –

+0

@ pst Problem ist, dass bigint und varchar - beide repräsentieren das Feld normal und so, wie ich brauche – brabertaser19

+0

Nr. Eins steht für eine Zahl. Der andere repräsentiert Text (der die textliche Darstellung einer Zahl sein könnte). Welches ist richtig? –

Antwort

23

BIGINT ist immer 8 Byte, VARCHAR(15) 1..16 Bytes auf Wertlänge abhängig, so BIGINT braucht weniger Speicher auf großen numnbers, aber mehr Speicher auf eine kleine Anzahl (weniger als 7 Stellen). Außerdem ist BIGINT schneller.

+0

aber als Fremdschlüssel in anderen Tabelle? zum Beispiel: id text for_id, das für id muss ich auch bigint machen, oder? Also was soll ich wählen?) wenn ich von 1 bis 45281229703 und höhere Zeile – brabertaser19

+0

auch unsigned/signed hier ist großen Unterschied? – brabertaser19

+0

Denken Sie auch daran, dass Varchar eine Kodierungsübersetzung erfordert und daher nicht eindeutig ist, eine rohe Zahl hat dieses Problem nicht. – 0xCAFEBABE

3

varchar fügt Kopf:

Länge der Saite Bedürfnisse gespeichert (extra 2 Byte IIRC in MySQL) pro Feld und im Index mehr Verarbeitung für die Sortierfunktion Vergleich erfordert

+0

aber als Fremdschlüssel in anderen Tabelle? zum Beispiel: id text for_id, das für id muss ich auch bigint machen, oder? – brabertaser19

+0

ja das bigint – PSR

+0

auch unsigned/signed hier ist ein großer Unterschied? – brabertaser19

3

Wir Test in der Simulation ausgeführt haben Umgebung.

  1. Erstellt mit 1 BIGINT- und 1 VARCHAR-Parameter.
  2. Eingesetzte 30Lac Reihen.
  3. erstellt Index für beide Felder.
  4. Ergebnis ist: BIGINT reagieren fast 20time schneller als VARCHAR.

Hier Skript obigen Schritte ausführen:

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’;