BIGINT mysql prestazioni rispetto a INT

Sto cercando di capire se la mia tabella si ottiene meno performante, se cambio la chiave primaria di tipo BIGINT(20). Al momento, sto usando INT(7) e hanno 300.000 voci già IDs (7 o 8 cifre).
Ho cercato un sacco, ma già solo scoperto che si utilizza, più di spazio su disco (che è ovvio).

Tutti il mio Id dispone di 7 cifre, ma il mio cliente vuole cambiare a 8 cifre. Ho vinto ‘ t essere in grado di cambiare facilmente il software in futuro, così ho pensato di usare il BIGINT(20) ora, solo in caso. Sarebbe meno performante, se io uso BIGINT, anche se non ho bisogno di sicurezza?

Qualcuno con esperienza fare questo se avete dei suggerimenti per quanto riguarda la velocità e le prestazioni?

InformationsquelleAutor rubo77 | 2012-02-21



2 Replies
  1. 99

    Per rispondere alla tua domanda: sì, si otterrà meno performante. Ovviamente, più grande è il tipo, il più grande della tabella, più lenta è la query (più I/O più indici, più il tempo di accesso, risultato meno probabile per adattarsi in vari nascondigli, e così via). Quindi, come regola generale, utilizzare sempre il più piccolo tipo adatta alle tue necessità.

    Detto questo, prestazioni non importa. Perché? Perché quando si raggiunge un punto in cui si overflow di un INT, quindi BIGINT è l’unica soluzione e dovrete vivere con esso. Anche a questo punto (considerando che si sta utilizzando un incremento automatico PK, sarete più di 4 miliardi righe), avrai più problemi di prestazioni, e l’overhead di un BIGINT rispetto ad un INT sarà l’ultima delle preoccupazioni.

    Quindi, considerare i seguenti punti:

    • Usare UNSIGNED se non avete bisogno di valori negativi, che sarà il doppio del limite.
    • UNSIGNED INT il valore max è 4.294.967.295. Se si utilizza un incremento automatico di PK, e hai solo 300.000 voci, davvero non c’è bisogno di preoccuparsi. Si potrebbe anche usare un MEDIUMINT al momento, a meno che non sei pianificazione per davvero rapida crescita. (vedere http://dev.mysql.com/doc/refman/5.1/en/integer-types.html)
    • Il numero tra parentesi dopo il tipo di non influenza il valore max del tipo. INT(7) è la stessa come INT(8) o INT(32). È usato per indicare la larghezza di visualizzazione se si specificare ZEROFILL (vedi http://dev.mysql.com/doc/refman/5.1/en/numeric-type-overview.html)
    • Questo dice tutto ciò che stavo per. Si hanno praticamente alcuna possibilità di colpire il limite di un campo INT a meno che non hai a che fare con un SACCO di dati (di cui 300.000 voci NON è). Inoltre, come ho detto qui (7) non davvero fare qualcosa per limitare ciò che il campo di negozi. Hai ancora un limite di 4,3 miliardi di euro (supponendo che si fanno senza segno)
    • conosco le dimensioni di int(7), e così via. ma io non lo uso con incremento automatico nella tabella, causa i numeri sono importati da un altro database, e sono molto più di 2 caratteri
    • Il fatto che sia importati non impedisce di utilizzare AUTO_INCREMENT – l’IA valore viene automaticamente impostato il max valore di PK dopo una serie di inserire (e se non è possibile utilizzare l’istruzione ALTER per cambiare). Ora, se avete bisogno di BIGINT, perché è possibile avere numeri più di 10 cifre (questo accade con numeri di serie, per esempio), allora sì, sarà un po ‘ meno efficiente. Se siete davvero preoccupati e hanno un enorme traffico, si potrebbe usare un altro (piccolo) incremento automatico PK e memorizzare i BIGINT come un INDICE UNIVOCO (ma francamente non credo che vale la pena di problemi)
    • così si pensa che non è molto meno performante? non hai trovato un test da qualche parte? o un link?
    • Sì, io penso che in questo caso l’overhead è marginale e non si dovrebbe notare. (Sto lavorando con tavoli con più di 40 milioni di righe con un BIGINT per il PK con nessun problema)
    • in modo che questa risposta possa essere contrassegnati risolto, se vogliamo trovare una citazione in cui qualcuno effettivamente testato
    • Ho aggiunto questo alla mia risposta più in basso, la causa di questi commenti che qui a lungo: qualcuno ha effettivamente provato da qualche parte? Le prestazioni con “solo” 300.000 voci e una sub-ottimale field-type?
    • 40 milioni di arachidi. Si sono solo l ‘ 1% della dimensione ci sono parlando di.
    • Correzione: Anche in quel punto sarai oltre i 4 miliardi di righe, avrete più problemi di prestazioni, e la 4 miliardi di euro l’overhead di un BIGINT rispetto ad un INT saranno una delle vostre preoccupazioni.
    • si potrebbe aggiungere questo alla tua risposta, per favore? “Nel tuo caso con solo 300000 righe l’overhead è marginale e non si dovrebbe notare.”

  2. 2

    Che non vogliono resuscitare uno zombie, ma ‘moderno’ mysql utilizza il tipo di colonna seriali, che è un bigint(20) unsigned NOT NULL AUTO_INCREMENT – e certamente suggerisce che mysql sarà (o è) sarà ottimizzato per l’utilizzo bigint come chiave primaria.

    Inoltre, piuttosto che tramite seriale, bigint primaria consente (lo facciamo) per utilizzare uuid_short() per la chiave primaria (non uuid – che è molto lento da usare come primario, perché è una stringa) – che ha la caratteristica di garantire che ogni record è una chiave che è unico in tutto l’intero database (infatti in rete).

    Ma essere consapevoli del fatto – la coercizione della volontà degradare bigint int con risultati pessimi. Se, per esempio, si stanno confrontando una rappresentazione in forma di stringa con un grande int – si potrebbe scoprire che si ottiene falsi positivi. Quindi, si deve confrontare con le opzioni binarie…. ad esempio

    where id = binary id_str

    Personalmente vorrei chiamare questo un non fissati bug…

Lascia un commento