码迷,mamicode.com
首页 > 其他好文 > 详细

Schemal和数据类型的优化

时间:2018-01-13 18:49:21      阅读:180      评论:0      收藏:0      [点我收藏+]

标签:带来   iam   mysql   根据   高版本   存储引擎   row   宽度   部门   

一、选择优化的数据类型

 1.尽量更小

   更小的数据类型会占用更小的磁盘、内存和CPU,并且处理时需要的CPU周期也更少。

 2.简单的数据类型通常需要更小的CPU周期

  列如:整型比字符操作代价更低,因为字符集和校对规则使得字符比较比整型更加复杂。

 3.尽量避免NULL

  很多表都包含NULL列,即使应用程序并不需要保存NULL也是如此,这是因为NULL值是列的默认属性。通常情况下面最好指定列为NOT NULL,除非真的需要存储NULL值。

  由于可为NULL的列使得索引、索引统计和值比较都比较复杂。可为NULL的列需要更多的存储空间,需要特殊的处理。当可为NULL的列添加索引的时候,每一个索引记录需要一个额外的字节。但是由于把NULL值改为NOT NULL值得所带来的提升比较小,所以调优的时候没有必要改掉这个情况,除非他引起了问题。

二、基本数据类型

 1.1).整数类型

 有两种类型的数字:整数和实数

 如果存储整数:TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT。分别使用8,16,24,32,64位存储空间。他们的存储范围可以从-2(N-1)到2(N-1)-1 其中N是位数。整数类型有可选的UNSIGNED 属性 表示不允许负值,这大致可以是正数的上限提高一倍。列如:TINYINT UNSIGNED 的存储范围是 0-255 而TINYINY的存储范围是 -128~127。

MYSQL可以为整数类型指定宽度,列如:INT(11),对于大多数应用这个是没有意义的,它不会限制值得合法范围,知识规定了MYSQL的一些交互工具用来显示字符的个数,对于存储和计算来说,没有任何意义。

2).实数类型

实数是带有小数部门的数字。然而实数类型不仅可以存储实数类型也可以使用DECIAML存储比BIGINT更大的整数。MYSQL同时支持精确和不精确的类型。因为CPU不支持对DECIMAL的直接计算,所以在MYSQL5.0或者更高的版本的中,MYSQL服务器自身实现了对DECIAML更加精准的计算。相对而言,CPU直接支持原生浮点数计算,所以浮点运算明显更快。然而在早期的MYSQL版本中 DECIAML只是一个存储格式,在进行计算的时候,DECIMAL会转换为DOUBLE类型。因为DECIMAL需要额外的空间和计算开销,所以尽量只是对小数进行精确计算的时候,才进行使用 例如:存储财务数据。

2.字符串类型

 01).varchar和char类型是最主要的字符串类型。存储引擎存储CHAR或者VARCHAR值得方式在内存中和磁盘中是不一样的,所以MYSQL服务器从存储引擎读出的值可能需要转换为另一种存储格式。

VARCHAR

  varchar类型用于存储可变长度的字符串。由于它仅仅使用必要的空间,所以它比长类型更节省空间。有一种情况列外,如果MYSQL表使用ROW_FORMAT=FIXED创建的话,每一行都会使用定长存储,这个会很浪费空间。varchar需要使用1或者2个额外的字节记录字符串的长度,如果列的最大长度小于255个字节,则使用1一个字节保存长度,否则使用2个字节保存长度。例如 varchar(10)需要1个字节保存长度,varchar(1000)需要2个字节保存长度。在5.0或者更高版本的时候会保存末尾空格,在早期的版本中的时候,会剔除末尾空格。

CHAR

char类型的长度是定长的:MYSQL总是根据定义的字符串长度分配足够的空间,当存储CHAR值得时候,MYSQL会剔除末尾空格。

BINARY和VARBINARY

他们存储的是二进制字符串,二进制字符串和常规字符串非常相似,但是二进制字符串存的是字节码而不是字符,填充也不一样:MYSQL在填充的时候填充的是\0(零字节)而不是空格,在检索的时候也会去掉填充值。

BLOB和TEXT类型

该两个类型都是为了存储很大的数据而设计的字符串类型的数据类型,分别采用二进制和字符方式进行存储。实际上TEXT的家族包括:TINYTEXT,SMALLTEXT,TEXT,MEDIUMTEXT,LONGTEXT;对应的BLOB的家族类型是:TINYBLOB,SMALLBLOB,BLOB,MEDIUMBLOB,LONGBLOB。BLOB是SMALLBLO的同义词,TEXT是SMALLTEXTd的同义词。BLOB存储的是二进制数据,没有排序规则和字符集,而TEXT则正好相反。

ENUM(使用枚举类型来代替字符串类型)

 

Schemal和数据类型的优化

标签:带来   iam   mysql   根据   高版本   存储引擎   row   宽度   部门   

原文地址:https://www.cnblogs.com/histlyb/p/8279943.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!