首页 > 数据库 >Mysql

Mysql

时间:2023-07-14 21:56:37浏览次数:37  
标签:存储 VARCHAR TEXT 字符串 BLOB Mysql 类型

Mysql中的数据类型

字段类型

整型

TINYINT,SMALLINNT,MEDIUMINT,INT,BIGINT 分别使用8,16,24,32,64位的存储空间,一般情况下越小的列越好
INT(11)中的数字只是规定了交互工具显示字符的个数,对于存储和计算来说没有任何意义。

浮点数

FLOAT 和DOUBLE 为浮点类型,DECIMAL 为高精度小树类型,CPU原生支持浮点运算,但是不支持DECIMAL类型的运算,因此DEDECIMAL的计算比浮点类型需要跟高的代价
FLOAT,DOUBLE 和DECIMAL 都可以用指定列宽,例如DECIMAL(18,9)表示总共18位,取9位存储小数部分,剩下的9位存储整数那部分

字符串

主要有CHAR 和VARCHAR 两种类型,一种是定长的,一种是变长的

VARCHAR 这种变长类型能够节省空间,因为只需要存储必要的内容。但是在执行UPDATE时可以会使行变得比原来长,当超出一个能容纳的大小时,就要执行额外的操作,MyyISAM会将行拆成不同的片段存储,而InnoDB则需要分裂页来使行放进页内。
VARCHAR 会保留字符串末尾的空格,而CHAR会删除

时间和日期

Mysql提供了两种相似的日期时间格式: DATETIME和TIMESTAMP

  1. DATETIME
    能够保存从 10001年到9999年的日期和时间,精度为秒,使用8字节的存储空间。他与时区无关。
    默认情况下,MySQL以一种可排序的,无歧义的格式显示DATETIME值,这是ANSLI标准定义的日期和时间表示方法

  2. TIMESTAMP
    和UNIX时间戳相同,保存从1970年1月1日午夜以来的秒数,使用4个字节,只能表示从1970年到2038年
    他和时区有关,也就是说一个时间戳在不同的时区所代表的具体时间是不同的。
    MYSQL 提供了 FROM_UNIXTMIME() 函数把UNIX时间戳转换为日期,并提供了UNIX_TIMESTAMP()函数把日期转换为UNIX时间戳
    默认情况下如果插入时没有制定TIMESTAMP列的值,会将这个值设置为当前时间。
    应该尽量使用TIMESTAMP,因为他比DATETIME空间效率更高

选择优化的数据类型

更小的通常更好;更小的数据类型通常更快,因为他们占用更少的磁盘,内存和CPU缓存,并且处理时需要的CPU周期也更少;
简单就好,尽量避免NULL,如果查询中包含可为NULL的列,对MYSQL来说更难优化,因为可为NULL的列使得索引,索引统计和值比较都更复杂。尽管把可为null的列改为NOT NULL 带来的性能提升比较小,但如果计划在列上创造索引,就应该尽量避免设计成为可为NULL的列

字符串类型

VARCHAR 和CHAR
VARCHAR是最常见的字符串类型,VARChar节省了存储空间,所以对性能也有帮助,但是,由于行是可变的,在UPDATE时可能,使行变得比原来更长,这就导致需要做额外的工作。
VARCHAR(5) 和VARCHAR(200)存储hello的空间开销都是一样的,那么使用更短的列有优势吗?
事实证明有很大的优势,更长的列会消耗更大的内存,因为mYSQL通常会分配固定大小的内存块来保存内部值,尤其是使用内存临时表来进行排序或其他操作时会特别糟糕,在利用磁盘临时表进行排序时也同样糟糕,

BLOB 和 TEXT

BLOB和TEXT都是为来存储很大的数据而设计的数据类型,分别采用二进制和字符方式存储。与其他类型不同,MYSQL吧每个BLOB和TEXT值当作一个独立的对象去处理,当BLOB和TEXT值太大时,InnoDB会使用专门的外部存储区域来存储,此时每个值在行内需要1-4个字节存储一个指针,然后在外部存储区域存储实际的值。MYSQL对BLOB和TEXT类进行排序和其他类型是不同的,他只对每个累的嘴欠max——sotlength个字节而不整个字符串做排序。同时MYSQL也不能嫁给你BLOB或TEXT全部的字符串做索引。

选择标识符

整数类型通常是标识列的最佳选择,因为他们很快并且可以使用AUTO——INCREMENT,如果可能,应该避免使用字符串类型作为标识符,因为他们很耗空间,并且比数字类型慢,对于完全随机的字符串也要多加注意,如果MD5 sha1 或者UUID产生的字符串,这些函数生成的新值会任意分布在很大的空间内,这回导致insert以及一些SELECT语句变得很慢:因为插入值会随机的写入到索引不同的位置,所以使得一些insert语句更慢,这回导致页分裂磁盘随机访问,select语句会变得更慢。因为逻辑上的相邻行会分布在磁盘和内存的不同地方。随机值导致缓存对所有类型的查询语句效果都很差。因为会使得缓存赖以工作的局部性原理失效

标签:存储,VARCHAR,TEXT,字符串,BLOB,Mysql,类型
From: https://www.cnblogs.com/pf666nb/p/17555092.html

相关文章

  • MySQL基础
    1.数据库登录  mysql-uroot-p  mysql-uroot-pmysql  mysql-uroot-p-h192.168.213.200  备份  mysqldump-uroot-p--all-dtabases>all_databasees_20210305.sql      //备份所有库  mysqldump-uroot-p--databasesmysql>mysql_20......
  • mysql数据库3 表关系/多表查询等
    表关系(外键)#外键的前戏建立一张表:emp"""1.表不清晰,现在到底是员工表还是部门表2.字段需要重复的写,浪费资源3.兼容性很差,牵一发而动全身(这个问题是最不能容忍的)"""#以上问题该如何解决呢?我们的思路是,把一张表拆分成两张表拆成emp和depart部门表......
  • Mysql刪除binlog的方法
    参考文献:Mysql刪除binlog的方法(https://blog.csdn.net/weixin_42324463/article/details/126801856)在mysql的data目录下的binlog文件会随着时间推移越来越大。binlog文件不是直接rm就能解决的。即使rm删除了,但是mysql-bin.index档案中,还是有记录。正确步骤:1.linux进入mysqls......
  • 学科知识图谱学习平台项目 :技术栈Java、Neo4j、MySQL等超详细教学
    学科知识图谱学习平台项目:技术栈Java、Neo4j、MySQL等超详细教学0.效果展示1.安装教程安装JavaSDK11,下载前需要登录Oracle账号,下载链接,安装教程,测试是否能在命令行工具调用javajava--versionjava17.0.12021-10-19LTSJava(TM)SERuntimeEnvironment(build......
  • windows下用mysqldump导出数据库中文乱码的解决方案
    解决方案是从这篇文章得到的启发:http://www.pcxitongcheng.com/server/anz/2022-12-06/33622.html先去mysql里确认字符编码是utf8:showvariableslike'%char%'主要确认character_set_results。先创建好sql文件,比如d:\backup.sql然后备份的时候用--result-file=指定刚创建的文......
  • MySQL报错: Unknown prepared statement handler (stmt2) given to DEALLOCATE PREPAR
    上面的报错,是在MySQL里执行动态拼接SQL后报错的。--先定义两段SQLset@update_sql_fm=concat('updateads_gcl3e_patient_',@base_group_short_name,'_detail1t1jointemp_gcl3e_record_listtmpont1.report_info_id=tmp.report_info_idleftjoin(',@select_sql_fm,�......
  • Mysqll判空的一个坑
    Mysql使用<>''判空时数值类型字段会过滤掉值为0的数据SELECT*FROMstudentSELECT*FROMstudentWHEREuserid<>''文本类型字段可以过滤掉为null和空串的数据并且不会把为0的数据过滤SELECT*FROMstudentWHERESname<>''......
  • mysql binlog
    mysql二进制日志(binnarylog)binlog记录了对MySQL数据库执行更改的所有操作binlog是记录所有数据库表结构变更(例如CREATE、ALTERTABLE…)以及表数据修改(INSERT、UPDATE、DELETE…)的二进制日志。不会记录SELECT和SHOW这类操作,因为这类操作对数据本身并没有修改,但可以通过查询通......
  • Oracle、MySQL、HQL的语法差异
    Oracle、MySQL、HQL查询语句的差异SQL是结构化查询语言,执行Select(选择)、Update(更新)、Delete(删除)和Insert(插入)等数据任务。关系数据库是指基于关系模型的数据库。在关系模型中,用于存储数据的逻辑结构就是二维表(Table)。表由行和列组成,行也称为记录,代表了单个实体;列也称为字段,代表......
  • MySQL中,存储小数类型的FLOAT、DOUBLE和DECIMAL常见面试问题
    面试考察范围在MySQL中,关于FLOAT、DOUBLE和DECIMAL类型的面试题常涉及以下几个方面:数据存储方式:问答关于这些类型数据在内存中的存储方式和字节大小的问题,如FLOAT占用多少字节,DOUBLE占用多少字节等。精度和范围:询问不同类型对数字精度和范围的影响,比如FLOAT能存储的有效位......