Mysql中的数据类型
字段类型
整型
TINYINT,SMALLINNT,MEDIUMINT,INT,BIGINT 分别使用8,16,24,32,64位的存储空间,一般情况下越小的列越好
INT(11)中的数字只是规定了交互工具显示字符的个数,对于存储和计算来说没有任何意义。
浮点数
FLOAT 和DOUBLE 为浮点类型,DECIMAL 为高精度小树类型,CPU原生支持浮点运算,但是不支持DECIMAL类型的运算,因此DEDECIMAL的计算比浮点类型需要跟高的代价
FLOAT,DOUBLE 和DECIMAL 都可以用指定列宽,例如DECIMAL(18,9)表示总共18位,取9位存储小数部分,剩下的9位存储整数那部分
字符串
主要有CHAR 和VARCHAR 两种类型,一种是定长的,一种是变长的
VARCHAR 这种变长类型能够节省空间,因为只需要存储必要的内容。但是在执行UPDATE时可以会使行变得比原来长,当超出一个能容纳的大小时,就要执行额外的操作,MyyISAM会将行拆成不同的片段存储,而InnoDB则需要分裂页来使行放进页内。
VARCHAR 会保留字符串末尾的空格,而CHAR会删除
时间和日期
Mysql提供了两种相似的日期时间格式: DATETIME和TIMESTAMP
-
DATETIME
能够保存从 10001年到9999年的日期和时间,精度为秒,使用8字节的存储空间。他与时区无关。
默认情况下,MySQL以一种可排序的,无歧义的格式显示DATETIME值,这是ANSLI标准定义的日期和时间表示方法 -
TIMESTAMP
和UNIX时间戳相同,保存从1970年1月1日午夜以来的秒数,使用4个字节,只能表示从1970年到2038年
他和时区有关,也就是说一个时间戳在不同的时区所代表的具体时间是不同的。
MYSQL 提供了 FROM_UNIXTMIME() 函数把UNIX时间戳转换为日期,并提供了UNIX_TIMESTAMP()函数把日期转换为UNIX时间戳
默认情况下如果插入时没有制定TIMESTAMP列的值,会将这个值设置为当前时间。
应该尽量使用TIMESTAMP,因为他比DATETIME空间效率更高
选择优化的数据类型
更小的通常更好;更小的数据类型通常更快,因为他们占用更少的磁盘,内存和CPU缓存,并且处理时需要的CPU周期也更少;
简单就好,尽量避免NULL,如果查询中包含可为NULL的列,对MYSQL来说更难优化,因为可为NULL的列使得索引,索引统计和值比较都更复杂。尽管把可为null的列改为NOT NULL 带来的性能提升比较小,但如果计划在列上创造索引,就应该尽量避免设计成为可为NULL的列
字符串类型
VARCHAR 和CHAR
VARCHAR是最常见的字符串类型,VARChar节省了存储空间,所以对性能也有帮助,但是,由于行是可变的,在UPDATE时可能,使行变得比原来更长,这就导致需要做额外的工作。
VARCHAR(5) 和VARCHAR(200)存储hello的空间开销都是一样的,那么使用更短的列有优势吗?
事实证明有很大的优势,更长的列会消耗更大的内存,因为mYSQL通常会分配固定大小的内存块来保存内部值,尤其是使用内存临时表来进行排序或其他操作时会特别糟糕,在利用磁盘临时表进行排序时也同样糟糕,
BLOB 和 TEXT
BLOB和TEXT都是为来存储很大的数据而设计的数据类型,分别采用二进制和字符方式存储。与其他类型不同,MYSQL吧每个BLOB和TEXT值当作一个独立的对象去处理,当BLOB和TEXT值太大时,InnoDB会使用专门的外部存储区域来存储,此时每个值在行内需要1-4个字节存储一个指针,然后在外部存储区域存储实际的值。MYSQL对BLOB和TEXT类进行排序和其他类型是不同的,他只对每个累的嘴欠max——sotlength个字节而不整个字符串做排序。同时MYSQL也不能嫁给你BLOB或TEXT全部的字符串做索引。
选择标识符
整数类型通常是标识列的最佳选择,因为他们很快并且可以使用AUTO——INCREMENT,如果可能,应该避免使用字符串类型作为标识符,因为他们很耗空间,并且比数字类型慢,对于完全随机的字符串也要多加注意,如果MD5 sha1 或者UUID产生的字符串,这些函数生成的新值会任意分布在很大的空间内,这回导致insert以及一些SELECT语句变得很慢:因为插入值会随机的写入到索引不同的位置,所以使得一些insert语句更慢,这回导致页分裂磁盘随机访问,select语句会变得更慢。因为逻辑上的相邻行会分布在磁盘和内存的不同地方。随机值导致缓存对所有类型的查询语句效果都很差。因为会使得缓存赖以工作的局部性原理失效
标签:存储,VARCHAR,TEXT,字符串,BLOB,Mysql,类型 From: https://www.cnblogs.com/pf666nb/p/17555092.html