In genere, è più veloce leggere da una tabella in cui non sono memorizzati varchar o altri dati di lunghezza variabile? In MySQL, questo è più veloce perché può calcolare esattamente dove verrà archiviata una riga sul disco.È più veloce leggere le colonne a larghezza fissa in SQLite?
risposta
Questa domanda non è significativa nel contesto di SQLite in quanto supporta solo un singolo tipo di campo TEXT
. La distinzione tra "larghezza fissa" e "lunghezza variabile" non esiste qui.
Mentre SQLite consente di definire un campo con un determinato tipo, tutto questo è (al massimo) imposta la preferenza di quel campo per il tipo da utilizzare quando si memorizzano dati ambigui (ad esempio, se "3" verrà archiviato come INTEGER, REAL, o TEXT). È comunque possibile memorizzare qualsiasi tipo di dati in qualsiasi campo SQLite indipendentemente dal suo tipo.
In particolare in materia di CHAR vs VARCHAR, http://www.sqlite.org/datatype3.html ci dice:
Se il tipo dichiarato della colonna contiene una qualsiasi delle stringhe "char", "CLOB", o "TEXT" allora che la colonna ha l'affinità TEXT . Si noti che il tipo VARCHAR contiene la stringa "CHAR" e viene quindi assegnato affinità TEXT.
Solo dal SQLite uses variable-length records, suppongo che non abbiano implementato l'ottimizzazione della ricerca a larghezza fissa quando le righe hanno la stessa lunghezza.
E come Dave ha sottolineato, si può ancora memorizzare il testo nei campi INT. A partire da SQLite never truncates data, ciò significa che SQLite consente una colonna di larghezza apparentemente fissa come INT per memorizzare anche dati di lunghezza variabile. Quindi è impossibile implementare l'ottimizzazione della ricerca a larghezza fissa.
Ma potrei anche rimuovere tutte le colonne text/varchar/char da una tabella. Sarebbe quindi a larghezza fissa. Le mie domande sono se questo consentirà o meno una ricerca più rapida della colonna (a parte il fatto che è di dimensioni ridotte). – David
No, non lo farebbe. Come spiega il documento collegato, SQLite utilizza tipi di campi dinamici. Anche se dichiari un campo come INTEGER, puoi comunque memorizzare float, testo o anche blob. La dichiarazione "INTEGER" fornisce al campo una preferenza per l'archiviazione dei dati come numeri interi, ma non lo limita a farlo. Sarebbe comunque una colonna/record a larghezza variabile. (E questo è anche ignorando i dettagli che INTEGER non è in formato fisso in SQLite comunque ...) –