当前位置: 首页 > 科技观察

MySQLSchema和数据类型的优化

时间:2023-03-12 16:30:15 科技观察

选择优化的数据类型:1.通常越小越好:一般来说,应该尽量使用能够正确存储数据的最小数据类型。较小的数据类型通常速度更快,因为它们占用更少的磁盘、内存和CPU缓存,并且需要更少的CPU周期来处理。2.简单就好。简单的数据类型操作通常需要较少的cpu周期。例如,对整数进行操作比对字符的操作成本更低,因为字符集和排序规则(collat??ions)使字符比较比整数更复杂。注意:应该使用mysql的内置类型来存储时间和日期,而不是字符串。3.尽量避免null如果查询中包含可为空的列,那么对于Mysql来说优化起来就比较困难,因为可为空的列使得索引、索引统计和值变得更加复杂。可为空的列使用更多的存储空间并且需要在mysql中进行特殊处理。为可为空的列编制索引时,每个索引记录都需要一个额外的字节。通常将一个可为空的列改为不为空所带来的性能提升是比较小的。在调优的时候,不需要先在现有的shema中发现并修复这种情况,除非确定它会导致问题。但是如果在列上建立索引,应该尽量避免设计一个可以为null的列。整数类型:整数类型包括TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT。分别使用8、16、24、32、64位存储空间。它们可以存储从-2(n-1)到2(n-1)-1的值,其中n是存储的位数。整数类型有一个可选的UNSIGNED属性,表示不允许负值,大致可以将正数的上限加倍。例如TINYINTUNSIGNED的存储范围是0~255,而TINYINT的存储范围是-128~127。实数类型:实数是带有小数部分的数字。但是,它们不仅用于存储小数部分;您还可以使用DECIMAL来存储大于BITINT的整数。MySQL支持精确和不精确类型。DECIMAL类型用于存储精确的小数,因为double类型和float类型在进行计算时会因为丢失精度而造成一些数据偏差。但是DECIMAL数据类型cpu不支持其直接计算,cpu直接支持原生浮点计算,所以浮点运算显然更快。由于额外的空间和计算开销,您应该尝试仅将DECIMAL用于带小数的精确计算——例如存储财务数据。但是当数据量比较大的时候,可以考虑用BITINT代替DECIMAL,将要存储的货币单位根据小数位数乘以相应的倍数。字符串类型(varchar和char)Varchar:Varchar类型用于存储变长字符串,是最常见的字符串类型。它比定长类型更节省空间,因为它只使用必要的空间(例如,较短的字符串使用较少的空间)。所以varchar节省了存储空间,对性能也有帮助。但是,由于该行是边长的,更新可能会使该行比原来的行长,这导致需要额外的操作。如果一行占用的空间增长,页面中没有更多的空间来存储它。MyISAM会将行拆分成不同的分片进行存储,而InnoDB则需要对页面进行拆分,这样才能将行放在页面中。注意:InnoDB更灵活,它可以将太长的varchar存储为BLOB。Char类型:Char类型适合存储很短的字符串,或者所有的值都接近相同的长度。例如,char类型非常适合存储密码的md5值,因为它是定长值。还有用户的身份证号码和手机号码。对于经常变化的数据,char也优于vachar,因为定长的char类型不易产生碎片。对于非常短的列,char在存储空间方面也比varchar更高效。比如用char(1)存储Y和N的值,如果使用单字节字符集,只需要一个字节,但是varchar(1)需要两个字节,因为记录长度多了一个字节.Varchar(5)和varchar(200)在存储'hello'时有相同的空间开销,但是Varchar(5)会有很大的优势,因为更长的列会消耗更多的内存,因为Mysql通常会分配固定的内存块保持内部价值。在使用内存中的临时表进行排序和操作时尤其糟糕。对磁盘上的临时表进行排序时,情况同样糟糕。时间类型DateTime和TimeStamp这种类型的DateTime可以保存范围很广的值,从1001年到9999年,精度为秒。它将日期和时间封装成格式为YYYYMMDDHHMMSS的整数,与时区无关。使用8字节的存储空间。TimeStamp:存储从1970年1月1日午夜开始的描述,与Unix时间戳相同。TimeStamp只占用4个字节的存储空间,所以它的范围比DateTime小很多;它只能代表从1970年到2038年的年份。TimeStamp显示的值也取决于时区。Mysql服务器、操作系统、客户端连接都有时区设置。TimeStamp还具有DATETIME没有的特殊属性。默认情况下,如果插入时没有指定第一个TimeStamp列的值,Mysql会将这一列的值设置为当前时间。当插入一行记录时,Mysql默认也会更新第一个TimeStamp列的insert和update操作。最后,TimeStamp列默认不为空,这也不同于其他数据类型。