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根据字符集决定)
参考链接:
[1].https://blog.csdn.net/hjvgf/article/details/70037701
相关文章
- Error connecting to database [Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (13)]
- 【Mysql 学习】mysql 的使用入门
- Mac Pro 解压安装MySQL二进制分发版 mysql-5.6.30-osx10.11-x86_64.tar.gz(不是dmg的)
- mysql分享一:运维角度浅谈MySQL数据库优化
- Mysql中count(*),DISTINCT的使用方法和效率研究
- Java通过mysql-connector-java-8.0.11连接MySQL Server 8.0遇到的几个问题
- centos7中安装mysql
- mysql 在c# EF 中无法生成对象
- Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result
- MYSQL随机抽取查询 MySQL Order By Rand()效率问题
- Mysql一个非常有用的内置函数今天碰到要把MySQL数据库中的varchar转换成date类型进
- MySQL · 8.0.0新特性 · ROLE
- 1-爬虫框架-download和MySQL封装
- MySql 里的IFNULL用法
- MySQL 查询速度慢与性能差的原因与解决方法
- Mysql 如果有多个可选条件怎么加索引_MySQL|mysql-索引
- MySQL存储过程(三)——存储过程分支流控语句
- MySQL计算在线时长(超过2分钟未上传不在计算范围)
- Atitit mysql存储过程编写指南
- ERROR 2002 (HY000): Can‘t connect to local MySQL server through socket ‘/tmp/mysql.sock‘
- MySQL Study之--Mysql无法启动“mysql.host”
- MYSQL提权之反弹SHELL——数据库提权属于webshell到管理员的纵向提权,本质还是利用udf提权,无非是在mysql自定义函数中使用了反弹shell而已
- Groonga开源搜索引擎——列存储做聚合,没有内建分布式,分片和副本是随mysql或者postgreSQL作为存储引擎由MySQL自身来做分片和副本的
- mysql_21 _ 为什么我只改一行的语句,锁这么多
- Mysql报错:Can't connect to local MySQL server through socket '/tmp/mysql.sock'
- Mysql之修改mysql的视图定义者
- golang操作mysql数据库(Go-SQL-Driver/MySQL)
- 【高可用MySQL解决方案】centos7配置mysql主从复制
- 基于Apache和MySQL安装完成之后继续安装PHP。以构建LAMP动态网站平台。