🍓char:固定長度的字符类型。varchar属于可变的字符类型。(那咱们究竟选哪一个,记住选择varchar没毛病!!!)mysql
🍓为何选择varchar,总结为三点sql
char与varchar的区别以下编程
在MySQL中,不一样的存储引擎对CHAR和VARCHAR的使用原则有所不一样,这里简单归纳以下。
MyISAM存储引擎:建议使用固定长度的数据列代替可变长度的数据列。
MEMORY 存储引擎:目前都使用固定长度的数据行存储,所以不管使用 CHAR 或VARCHAR列都没有关系。二者都是做为CHAR类型处理。
InnoDB存储引擎:建议使用VARCHAR类型。对于InnoDB数据表,内部的行存储格式没有区分固定长度和可变长度列(全部数据行都使用指向数据列值的头指针),所以在本质上,使用固定长度的CHAR列不必定比使用可变长度VARCHAR列性能要好。于是,主要的性能因素是数据行使用的存储总量。因为CHAR平均占用的空间多于VARCHAR,所以使用VARCHAR来最小化须要处理的数据行的存储总量和磁盘I/O是比较好的。网络
🍓保存少许字符串时,咱们会选择char或者varchar.在保存较大文本时,一般选择使用text或者blob。性能
🍓text与blob的区别优化
🍓text和blob执行大量删除操做后,在数据表中留下大量“空洞”。为提升性能咱们可按期使用optimize table功能对这类表进行碎片整理。ui
演示以下lua
咱们查看表的物理大小spa
这里数据文件显示为351.89MB。从表t1中删除id为“1”的数据3d
再查看表的大小
能够发现,表t1的数据文件仍然为351.89MB,并无由于数据删除而减小。接下来对表进行OPTIMIZE(优化)操做:
这里mysql给的提示是Note>> Table does not support optimize, doing recreate + analyze instead
Status>> OK
也就是说 optimize table 对于innodb来讲,没法做为
a single operation.以上无效。MySQL5.7已经推荐对于InnoDB的table使用 alter table table_name engine=innodb;语句的方式来进行表碎片优化。
finish!
🍓可使用合成的(Synthetic)索引来提升大文本字段(BLOB或TEXT)的查询性能。要注意这种技术只能用于精确匹配的查询.
🍓在没必要要的时候避免检索大型的BLOB或TEXT值。
例如,SELECT *查询就不是很好的想法,除非可以肯定做为约束条件的WHERE子句只会找到所须要的数据行。不然,极可能毫无目的地在网络上传输大量的值。这也是 BLOB 或TEXT标识符信息存储在合成的索引列中对用户有所帮助的例子。用户能够搜索索引列,决定须要的哪些数据行,而后从符合条件的数据行中检索BLOB或TEXT值。
🍓
把BLOB或TEXT列分离到单独的表中。
在某些环境中,若是把这些数据列移动到第二张数据表中,能够把原数据表中的数据列转换为固定长度的数据行格式,那么它就是有意义的。这会减小主表中的碎片,能够获得固定长度数据行的性能优点。它还可使主数据表在运行 SELECT *查询的时候不会经过网络传输大量的BLOB或TEXT值。
🍓
浮点数(float,double)定点数(decimal,numberic)
🍓定点数不一样于浮点数,定点数其实是以字符串形式存放的,因此定点数能够更精确的保存数据。
🍓
浮点数的精度问题。
在选择浮点型数据保存小数时,要注意四舍五入的问题,并尽可能保留足够的小数位,避免存储的数据不许确。
点数的比较也是一个广泛存在的问题,下面的程序片段中对两个浮点数作减法运算:
public class Test { public static void main(String[] args) throws Exception { System.out.print("7.22-7.0=" + (7.22f-7.0f)); } }
对上面Java程序的输出结果可能会想固然地认为是0.22,可是,实际结果倒是7.22-7.0=0.21999979,所以,在编程中应尽可能避免浮点数的比较,若是非要使用浮点数的比较则最好使用范围比较而不要使用“==”比较。
下面使用定点数来实现上面的例子
注意:在从此关于浮点数和定点数的应用中,用户要考虑到如下几个原则:
浮点数存在偏差问题;
对货币等对精度敏感的数据,应该用定点数表示或存储;
在编程中,若是用到浮点数,要特别注意偏差问题,并尽可能避免作浮点数比较;
要注意浮点数中一些特殊值的处理。
🍓日期类型包括:DATE \TIME\TIMESTAMP\DETATIME.
🍓
根据实际须要选择知足应用最小的存储的日期类型。
若是应用只须要记录“年份”,那么用1个字节来存储的YEAR类型彻底能够知足,而不须要用4个字节来存储的DATE类型。这样不只仅能节约存储,更可以提升表的操做效率。
若是要记录年月日时分秒,而且记录的年份比较久远,那么最好使用 DATETIME,而不要使用TIMESTAMP。由于TIMESTAMP表示的日期范围比DATETIME要短得多。
若是记录的日期须要让不一样时区的用户使用,那么最好使用TIMESTAMP,由于日期类型中只有它可以和实际时区相对应。
对于字符类型,要根据存储引擎来进行相应的选择。
对精度要求较高的应用中,建议使用定点数来存储数值,以保证结果的准确性。
对含有 TEXT 和 BLOB 字段的表,若是常常作删除和修改记录的操做要定时执行OPTIMIZE TABLE功能对表进行碎片整理。
日期类型要根据实际须要选择可以知足应用的最小存储的日期类型。