Domanda

Sto ottimizzando alcune tabelle InnoDB in MySQL, così mi sono imbattuto procedura analsye () per vedere quali sono le raccomandazioni erano.

I risultati consigliata TINYTEXT invece di varchar (255) per tutti i campi precedentemente impostati come varchar (255)

C'è un guadagno di prestazioni per essere avuto utilizzando TINYTEXT ? Sono solo preoccupato per la velocità qui, non taglia.

È stato utile?

Soluzione

Non credere se qualcuno ti dice che TINYTEXT è memorizzato in altro modo, oltre VARCHAR.

Le differenze reali sono:

  • TINYTEXT e altri campi di testo sono memorizzate separatamente dal braccio in memoria all'interno MySQL mucchio, mentre VARCHAR () campi aggiungere fino a 64k limite (in modo da poter avere più di 64k in TINYTEXTs, mentre non lo farai con VARCHAR).

  • TINYTEXT e altri campi 'blob-like' forzeranno strato SQL (MySQL) per utilizzare tabelle temporanee su disco ogni volta che vengono utilizzati, che VARCHAR sarà ancora risolto 'memoria' (se saranno convertiti CHAR per l'intera larghezza).

  • InnoDB internamente in realtà non importa se si tratta di TINYTEXT o varchar. È molto facile verificare, creare due tabelle, una con VARCHAR (255), un altro con TINYINT, e inserire un record di entrambi. Entrambi prenderanno singola pagina 16K -. Mentre, se si utilizzano le pagine di overflow, tavolo TINYTEXT dovrebbe apparire come prendere almeno 32k in 'SHOW TABLE STATUS'

solito preferisco VARCHAR (255) - non causano troppo di cumulo frammentazione per fila singola, e può essere trattato come oggetto 64k singolo in memoria all'interno MySQL. Su InnoDB differenze di dimensioni sono trascurabili.

Altri suggerimenti

mi aspetterei varchar di essere più veloce di TINYTEXT, e dal mio Googling in giro che sembra essere il consenso generale. Naturalmente si dovrebbe testare il sistema per essere veramente certi.

Il motivo è più veloce è perché quando MySQL fa certi tipi di operazioni (si unisce, tipi, ecc) sarà spesso creare tabelle temporanee. Quando si dispone di un tipo BLOB (come TINYTEXT) in una tabella temporanea nella tabella sarà basata su disco piuttosto che la memoria base, che ovviamente avrebbe un impatto sulle prestazioni.

CHAR / VARCHAR sta per essere più veloce come queste colonne sono memorizzati nella stessa pagina i dati di riga principale *, mentre i tipi di testo vengono memorizzati fuori pagina (mi sbagliavo, vedi commento di Harrison ).

Chi è abituato a utilizzare TINYTEXT molto perché varchar (fastidiosamente) rifilato spazi finali. Questo comportamento è stato rimosso in MySQL 5.0.

(* Almeno per i primi 768 byte, e con built-in InnoDB, non il nuovo plugin InnoDB).

Si consiglia inoltre di guardare con char(255) - mentre si fa uso di più spazio, è stato sostanzialmente più veloce (nella mia esperienza) per utilizzare un campo che è una dimensione costante quando si fa il confronto più tardi. Lo spazio extra può essere riempito con imbottitura se stai cercando solo la velocità, quindi ignorare gli spazi più tardi.

Tuttavia, nota: MySQL non permetterà varchar e char tipi di esistere nella stessa tabella. Né [normalmente] consentono confronti tra <=> e <=>. Ho trovato questo l'anno scorso quando si fa un'implementazione tavolo per un hobby progetto .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top