简单了解mysql存储字段类型查询效率

 更新时间:2020年09月19日 12:06:50   作者:贾树丙  
这篇文章主要介绍了简单了解mysql存储字段类型查询效率,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

检索性能从快到慢的是(此处是听人说的):

  • 第一:tinyint,smallint,mediumint,int,bigint
  • 第二:char,varchar
  • 第三:NULL

解释(转载):

整数类型

1、TINYINT,SMALLINT,MEDIUMINT,INT,BIGINT,分别用8,16,24,32,64存

2、整数都有UNSIGNED可选属性 (拿tinyint字段来举例,unsigned后,字段的取值范围是0-255,而signed的范围是-128 - 127。 那么如果我们在明确不需要负值存在的情况下,通常是不要设置signed来支持负数的。)

3、对于存储和计算来说INT(1)和INT(20)是相同的,INT(N)中N只是规定了一些交互工具来显示字符的个数

字符类型

char定长,存储效率不如varchar,对于短数据的查询优于varchar

固定长度的。比如使用uuid作为主键,那用char应该更合适。

NULL类型

1、索引NULL列要额外的空间

2、进行比较和计算时会对null值进行处理,可能导致索引失效

所以尽量不要使用NULL 类型,多使用整数类型

另外,时间日期数据类型

1、不要用字符串存储日期型数据,浪费空间

2、DATE能保存从1001到9999年,精度为秒,他把日期和时间封装到格式为YYYYMMDDHHMMSS的整数中,使用8字节

3、TIMESTAMP保存了从1970年以来的秒数,和Unix时间戳相同,只能保存1970到2038,使用4字节

4、FROM_UNIXTIME()和UNIX_TIMESTAMP()两个函数转换日期和Unix时间戳

5、DATE和TIMESTAMP中存的是时间,但是是哪里的时间呢???:前者不管哪里,他就是一个时间表示(与时区无关),后者是格林尼治时间。。就是说存储时DATE就按照给的时间存,TIMESTAMP则是在先根据所在时区和给的时间戳算出对应的格林尼治时间再存,访问时DATE就按照他存的时间返回,TIMESTAMP则是根据存的时间戳(看作格林尼治时间)和所在时区算出所在时区的对应时间。

6、通常用TIMESTAMP,空间效率高

7、MYSQL没有提供比秒更小粒度的日期和时间值,如果需要,可以用BIGINT存储微妙级别的时间戳,或用DOUBLE存储秒之后的小数部分。

实数类型

1、金融类要用DECIMAL

2、DECIMAL可以保存BIGINT范围外的整数

3、FLOAT和DOUBLE使用标准的浮点运算进行近似计算

char 和 varchar

1、char是定长,varchar是变长,也就是varchar节省空间(除非使用ROW——FORMAT=FIXED创建的话)

2、因为varchar是变长的,所以UPDATE时如果长度变长,就会做额外的工作

3、下列情况使用varchar:字符串列的最大长度比平均长度大很多;列的更新很少(所以碎片不是问题);使用了像UTF8这样的字符集(每个字符都使用不同的字节数进行存储)

4、CHAR适用情况:很短,或者所有值都接近同一个长度(如MD5);列经常变更

5、末尾空格问题:高版本varchar会保留末尾空格;char和低版本varchar会剔除末尾空格。

6、CHAR(N),VARCHAR(N)中N表示字符数,而非字节数(中文字符在UTF8中占用3字节)

7、虽然VARCHAR(N)数据类型在磁盘中存的就是他所表示的字符串的大小,但是读取到内存中的时候内存是会给他分配N*k+1or2(N<=255,1;else 2;)(k根据字符集决定)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • mysql主键id的生成方式(自增、唯一不规则)

    mysql主键id的生成方式(自增、唯一不规则)

    本文主要介绍了mysql主键id的生成方式,主要包括两种生成方式,文中通过代码示例介绍的非常详细,感兴趣的可以了解一下
    2021-09-09
  • Mysql Online DDL的使用详解

    Mysql Online DDL的使用详解

    在日常DBA运维过程中,对表结构进行变更算是个普遍的需求了。如果操作的对象是个热表、大表,难免心里一怵,这些DDL操作是否可以直接执行,哪些会影响线上读写,哪些会影响主从,甚至导致服务器压力骤升,本文做了梳理,希望对大家有所帮助。
    2021-05-05
  • 如何恢复MYSQL的ROOT口令

    如何恢复MYSQL的ROOT口令

    如何恢复MYSQL的ROOT口令...
    2006-11-11
  • SQL Server 数据库的备份详细介绍及注意事项

    SQL Server 数据库的备份详细介绍及注意事项

    这篇文章主要介绍了SQL Server 备份详细介绍及注意事项的相关资料,需要的朋友可以参考下
    2016-12-12
  • mysql优化limit查询语句的5个方法

    mysql优化limit查询语句的5个方法

    这篇文章主要介绍了mysql优化limit查询语句的5个方法,它们分别是子查询优化法、倒排表优化法、反向查找优化法、limit限制优化法和只查索引法,需要的朋友可以参考下
    2014-07-07
  • MySQL root密码忘记后更优雅的解决方法

    MySQL root密码忘记后更优雅的解决方法

    这篇文章主要给大家介绍了关于MySQL root密码忘记后更优雅的解决方法,文中通过示例代码介绍的非常详细,对大家学习或者使用mysql具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-07-07
  • 浅谈mysql的索引设计原则以及常见索引的区别

    浅谈mysql的索引设计原则以及常见索引的区别

    下面小编就为大家带来一篇浅谈mysql的索引设计原则以及常见索引的区别。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-03-03
  • MySql UNION 一行转多列的实现示例

    MySql UNION 一行转多列的实现示例

    在MySQL命令行中,有时候我们会遇到一行的数据需要以多列的形式呈现的情况,本文就详细介绍了一下一行转多列的实现示例,具有一定的参考价值,感兴趣的可以了解一下
    2023-08-08
  • 介绍一个针对C++程序的MySQL访问库soci

    介绍一个针对C++程序的MySQL访问库soci

    这篇文章主要介绍了介绍一个针对C++程序的MySQL访问库soci,文章中还讲了其中的一些操作方法,需要的朋友可以参考下
    2015-05-05
  • MySQL分组查询Group By实现原理详解

    MySQL分组查询Group By实现原理详解

    在MySQL 中,GROUP BY 的实现同样有多种(三种)方式,其中有两种方式会利用现有的索引信息来完成 GROUP BY,另外一种为完全无法使用索引的场景下使用。下面我们分别针对这三种实现方式做一个分析
    2016-05-05

最新评论