I am optimizing DB and there is something which is not clear to me about fixed-length data types.
As far as I know these data types are fixed-length:
And these are variable-length:
Please correct me if I am wrong!
Now, my question is: Are these data types fixed-length or variable-length?
Thanks.
You are not correct on some datatypes.
DATETIME/TIMESTAMP
TIMESTAMP
and DATETIME
are similar, however TIMESTAMP uses only half the storage space when compared to DATETIME
. There are however notable disadvantages to using TIMESTAMP
so you should check the official docs to see which one you need. But most of the the DATETIME
would be the better choice.
You don't have to worry about fix/variable lengths for this datatype
NUMBERS
You are able to store integer by setting a length i.e int(20)
but in terms of storage it has no difference and hence has no meaning.
TINYINT SMALL INT MEDIUMINT BIGINT
These datatypes require 8, 16, 24, 32, and 64 bits of storage space respectively. Each of them has different maximum and minimum values. If you are sure your values will not exceed a certain number, you should choose the smallest int datatype to conserve space and improve performance. You should consult the official docs for more information on the figures.
FLOAT
and DOUBLE
are approximate calculations and you don't have to specify a precision. Setting a precision and inserting a value beyond the specification, your value will be rounded to the specification. Again see the official docs for this.
VARCHAR
VARCHAR
, as you expect is variable-length, but keep in mind, don't specify something like VARCHAR(100)
when you only need 5 characters, because although the length is variable when stored on disk, it takes the length you specify when working with RAM, so you will be wasting precious memory.
BLOB and TEXT
BLOB
and TEXT
are stored in a specially way, depending on the storage engine you use. They are usually stored in an "external" area. You should avoid using this unless if the string is VERY long. This datatype cannot index the full length and also is not supported by the Memory and so is not used by the system's memory. When calling for it a temp table will be created on disk with the MyISAM storage engine and this would cause a huge performance degradation.
ENUM
This is very compact and you set specific values to a field when you create a table. The strings are fixed and changing an ENUM
column requires an ALTER TABLE
, so you won't have to worry about fix/variable lengths for this one.
I found a page in the official docs that answers all your questions Data Type Storage Requirements