下载安卓APP箭头
箭头给我发消息

客服QQ:3315713922

MYSQL中如何选择合适的数据类型?

作者:课课家教育     来源: http://www.kokojia.com点击数:950发布时间: 2017-09-02 08:00:00

标签: 数据库MYSQL数据类型

  MySQL提供了大量不同的数据类型,选择合适的数据类型y有时是决定性能好坏的关键。如下是一些关于更好选择数据类型的建议:

  选择数据类型的基本原则

  前提:使用适合存储引擎

  选择原则:根据选定的存储引擎,确定如何选择合适的数据类型

  下面的选择方法按存储引擎分类:

  MyISAM数据存储引擎和数据列:MyISAM数据表,最好使用固定长度(CHAR)的数据列代替可变长度(VARCHAR)的数据列。

  MEMORY存储引擎和数据列:MEMORY数据表目前都使用固定长度的数据行存储,因此无论使用CHAR或VARCHAR列都没有关系。两者都是作为CHAR类型处理的。

  InnoDB存储引擎和数据列:建议使用VARCHAR类型。

  对于InnoDB数据表,内部的行存储格式没有区分固定长度和可变长度列(所有数据行都使用指向数据列值的头指针),因此在本质上,使用固定长度的CHAR列不一定比使用可变长度VARCHAR列简单。因而,主要的性能因素是数据行使用的存储总量。由于CHAR平均占用的空间多于VARCHAR,因此使用VARCHAR来最小化需要处理的数据行的存储总量和磁盘I/O是比较好的。

  下面说一下固定长度数据列与可变长度的数据列。

  一、char和varchar

  char是固定长度的,查询速度比varchar速度快的多。char的缺点是浪费存储空间。

  检索char列时,返回的结果会删除尾部空格,所以程序需要对为空格进行处理。

  对于长度变化不大且对查询速度有较高要求的数据可以考虑使用char。

  随着MySQL的不断升级,varchar的性能不断改进并提高。

  下面的表显示了将各种字符串值保存到CHAR(4)和VARCHAR(4)列后的结果,说明了CHAR和VARCHAR之间的差别:

  随着MySQL的不断升级,varchar的性能不断改进并提高。    下面的表显示了将各种字符串值保存到CHAR(4)和VARCHAR(4)列后的结果,说明了CHAR和VARCHAR之间的差别:

  请注意上表中最后一行的值只适用不使用严格模式时;如果MySQL运行在严格模式,超过列长度不的值不保存,并且会出现错误。

  存储引擎使用原则:

  MyISAM:建议使用固定长度列代替可变长度列。

  InnoDB:建议使用varchar类型

  二、text和blob

  在保存大文本时,通常选择text或者blob。

  二者的差别是blob可以保存二进制数据,比如照片。

  text和blob又包括text、mediumtext、longtext和blob、mediumblob、longblob,他们之间的区别是存储文本长度不同和存储字节不同。

  在使用text和blob字段类型时要注意以下几点,应根据情况选择满足需求的最小存储类型,以便更好的发挥数据库的性能。

  ①BLOB和TEXT值也会引起自己的一些问题,特别是执行了大量的删除或更新操作的时候。删除这种值会在数据表中留下很大的"空洞",以后填入这些"空洞"的记录可能长度不同,为了提高性能,建议定期使用OPTIMIZETABLE功能对这类表进行碎片整理.

      blob和text执行大量删除操作时,产生数据“空洞”

 ①BLOB和TEXT值也会引起自己的一些问题,特别是执行了大量的删除或更新操作的时候。删除这种值会在数据表中留下很大的"空洞",以后填入这些"空洞"的记录可能长度不同,为了提高性能,建议定期使用OPTIMIZETABLE功能对这类表进行碎片整理.

      删除id为7记录前后数据库所占内存,没有发生变化。

删除id为7记录前后数据库所占内存,没有发生变化。

删除id为7记录前后数据库所占内存,没有发生变化。

      可以发现数据文件并没有因为数据删除而减少。

      对表进行optimize(优化)操作:

      optimize table t1;

      可以发现数据文件并没有因为数据删除而减少。        对表进行optimize(优化)操作:        optimize table t1;

      可以发现表数据文件大大缩小,“空洞”空间已经被回收。

  ②使用合成的(synthetic)索引。合成的索引列在某些时候是有用的。一种办法是根据其它的列的内容建立一个散列值,并把这个值存储在单独的数据列中。接下来你就可以通过检索散列值找到数据行了。但是,我们要注意这种技术只能用于精确匹配的查询(散列值对于类似<或>=等范围搜索操作符是没有用处的)。我们可以使用MD5()函数生成散列值,也可以使用SHA1()或CRC32(),或者使用自己的应用程序逻辑来计算散列值。请记住数值型散列值可以很高效率地存储。同样,如果散列算法生成的字符串带有尾部空格,就不要把它们存储在CHAR或VARCHAR列中,它们会受到尾部空格去除的影响。

 ②使用合成的(synthetic)索引。合成的索引列在某些时候是有用的。一种办法是根据其它的列的内容建立一个散列值,并把这个值存储在单独的数据列中。接下来你就可以通过检索散列值找到数据行了。但是,我们要注意这种技术只能用于精确匹配的查询(散列值对于类似<或>=等范围搜索操作符是没有用处的)。我们可以使用MD5()函数生成散列值,也可以使用SHA1()或CRC32(),或者使用自己的应用程序逻辑来计算散列值。请记住数值型散列值可以很高效率地存储。同样,如果散列算法生成的字符串带有尾部空格,就不要把它们存储在CHAR或VARCHAR列中,它们会受到尾部空格去除的影响。

      如果需要对blob或clob字段进行模糊查询,可以用前缀索引:

 如果需要对blob或clob字段进行模糊查询,可以用前缀索引:

  合成的散列索引对于那些BLOB或TEXT数据列特别有用。用散列标识符值查找的速度比搜索BLOB列本身的速度快很多。

  ③在不必要的时候避免检索大型的BLOB或TEXT值。例如,SELECT*查询就不是很好的想法,除非你能够确定作为约束条件的WHERE子句只会找到所需要的数据行。否则,你可能毫无目的地在网络上传输大量的值。这也是BLOB或TEXT标识符信息存储在合成的索引列中对我们有所帮助的例子。你可以搜索索引列,决定那些需要的数据行,然后从合格的数据行中检索BLOB或TEXT值。

  ④把BLOB或TEXT列分离到单独的表中。在某些环境中,如果把这些数据列移动到第二张数据表中,可以让你把原数据表中的数据列转换为固定长度的数据行格式,那么它就是有意义的。这会减少主表中的碎片,使你得到固定长度数据行的性能优势。它还使你在主数据表上运行SELECT*查询的时候不会通过网络传输大量的BLOB或TEXT值。

  三、浮点数和定点数

  浮点数相对于定点数的优点是在长度一定的情况下,浮点数能够表示更大的数据范围;它的缺点是会引起精度问题。在今后关于浮点数和定点数的应用中,大家要记住以下几点:

  1.浮点数存在误差问题;

  2.对货币等对精度敏感的数据,应该用定点数表示或存储;

  3.编程中,如果用到浮点数,要特别注意误差问题,并尽量避免做浮点数比较;

  4.要注意浮点数中一些特殊值的处理。

  四、日期类型的选择

  1.根据实际需要选择能够满足应用的最小存储日期类型。

  2.如果记录年月日时分秒,并且记录年份比较久远,最好使用datetime,不要使用timestamp。

  3.如果记录的日期需要让不同时区的用户使用,最好使用timestamp,因为日期类型中只有它能够和实际时区相对应。

  小编结语:

  更多内容尽在课课家教育!

赞(12)
踩(0)
分享到:
华为认证网络工程师 HCIE直播课视频教程