简单了解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根据字符集决定)

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

(0)

相关推荐

  • MySQL group by对单字分组序和多字段分组的方法讲解

    我这里创建了一个 goods 表,先看下里面的数据: mysql> select * from goods; +----+------+------+------------+-------------+------------+ | id | s_id | b_id | goods_name | goods_price | goods_desc | +----+------+------+------------+-------------+------------+ | 1 | 1 | 5

  • mysql 替换字段部分内容及mysql 替换函数replace()

    [mysql]replace的用法(替换某字段部分内容) [mysql]replace的用法 1.replace into replace into table (id,name) values('1','aa'),('2','bb')           此语句的作用是向表table中插入两条记录.如果主键id为1或2不存在就相当于           insert into table (id,name) values('1','aa'),('2','bb')           如果存在相

  • MySQL中可为空的字段设置为NULL还是NOT NULL

    经常用mysql的人可能会遇到下面几种情况: 1.我字段类型是not null,为什么我可以插入空值 2.为什么not null的效率比null高 3.判断字段不为空的时候,到底要用 select * from table where column <> '' 还是要用 select * from table where column is not null 带着上面几个疑问,我们来简单的研究一下null 和 not null 到底有什么不一样,他们之间的区别是什么以及各自的效率问题. 首先,

  • MySQL中字段类型char、varchar和text的区别

    在MySQL中,char.varchar和text类型的字段都可以用来存储字符类型的数据,char.varchar都可以指定最大的字符长度,但text不可以. 它们的存储方式和数据的检索方式也都不一样. 数据的检索效率是:char > varchar > text 具体说明: char:存储定长数据很方便,CHAR字段上的索引效率级高,必须在括号里定义长度,可以有默认值,比如定义char(10),那么不论你存储的数据是否达到了10个字节,都要占去10个字节的空间(自动用空格填充),且在检索的时

  • Mysql中批量替换某个字段的部分数据(推荐)

    MYSQL中批量替换某个字段的部分数据,具体介绍如下所示: 1.修改字段里的所有含有指定字符串的文字 UPDATE 表A SET 字段B = replace(字段B, 'aaa', 'bbb') example: update table set url= replace(url, 'aaa', 'bbb') [将url字段中的aaa批量更改为bbb] update table set url= REPLACE (url,'3','1.png') where 条件; 2.常规条件修改: upda

  • mysql创建存储过程实现往数据表中新增字段的方法分析

    本文实例讲述了mysql创建存储过程实现往数据表中新增字段的方法.分享给大家供大家参考,具体如下: 需求: 往某数据库的某个表中新增一个字段(若该字段已存在,则不做操作:若该字段不存在,则新增) 百度了n久,没有符合要求的例子,只有参考加自己琢磨,最终终于给弄出来了,以下是几个版本的更迭 第一版: DELIMITER $$ CREATE PROCEDURE insert_column() BEGIN IF NOT EXISTS(SELECT 1 FROM information_schema.c

  • mysql查询字段类型为json时的两种查询方式

    表结构如下: id varchar(32) info json 数据: id = 1 info = {"age": "18","disname":"小明"} -------------------------------------------- 现在我需要获取info中disanme的值,查询方法有: 1. select t.id,JSON_EXTRACT(t.info,'$.disname') as disname fro

  • MySQL根据某一个或者多个字段查找重复数据的sql语句

    sql 查出一张表中重复的所有记录数据 1.表中有id和name 两个字段,查询出name重复的所有数据 select * from xi a where (a.username) in (select username from xi group by username having count(*) > 1) 2.查询出所有数据进行分组之后,和重复数据的重复次数的查询数据,先列下: select count(username) as '重复次数',username from xi group

  • 简单了解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. 那么如果我们在明确不需要

  • 简单了解MySQL存储引擎

    1. MySql体系结构 在介绍存储引擎之前先来介绍下MySql的体系结构,以便大家知道存储引擎在MySql整个体系中处于什么位置.下图是官方提供的一张架构图: MySQL体系结构图 从上图可以发现,MySQL由以下几部分组成: 连接池组件 管理服务和工具组件 SQL接口组件 查询分析器组件 优化器组件 缓冲(Cache)组件 插件式存储引擎 物理文件 MySQL数据库区别于其他数据库的最重要的一个特点就是其插件式的表存储引擎,从上图中也可以看到,MySql支持很多种存储引擎.需要特别注意的是,

  • MySQL提升大量数据查询效率的优化神器

    目录 前言 查看SQL执行频率 定位低效率执行SQL explain分析执行计划 trace分析优化器执行计划 使用索引优化 SQL优化 大量插入数据 优化insert语句 优化order by语句 2.两种排序方式 3.Filesort 的优化 优化group by 子查询优化 limit优化 前言 在应用的的开发过程中,由于初期数据量小,开发人员写 SQL 语句时更重视功能上的实现,但是当应用系统正式上线后,随着生产数据量的急剧增长,很多 SQL 语句开始逐渐显露出性能问题,对生产的影响也越

  • mysql in语句子查询效率慢的优化技巧示例

    表结构如下,文章只有690篇. 文章表article(id,title,content) 标签表tag(tid,tag_name) 标签文章中间表article_tag(id,tag_id,article_id) 其中有个标签的tid是135,查询标签tid是135的文章列表. 690篇文章,用以下的语句查询,奇慢: select id,title from article where id in( select article_id from article_tag where tag_id=

  • 浅谈Mybatis+mysql 存储Date类型的坑

    场景: 把一个时间字符串转成Date,存进Mysql.时间天数会比实际时间少1天,也可能是小时少了13-14小时 Mysql的时区是CST(使用语句:show VARIABLES LIKE '%time_zone%'; 查) 先放总结: 修改方法: 1. 修改数据库时区 2. 在jdbc.url里加后缀 &serverTimezone=GMT%2B8 3. 代码里设置时区,给SimpleDateFormat.setTimeZone(...) 例外:new Date() 可以直接存为正确时间,其他

  • MySQL中字段类型为longtext的值导出后显示二进制串方式

    目录 MySQL字段类型为longtext的值导出后显示二进制串 使用MySQL的CAST()函数或者CONVERT()函数 MySQL的基本语句及用法 WHERE子句:条件查找 UPDATE子句:数据更新 DELETE子句:删除数据 LINK子句:元字符查找 UNION操作符:联合查询结果 MySQL字段类型为longtext的值导出后显示二进制串 MySQL中字段类型为 longtext 的字段值保存的是Blob (Binary large objects),所以在导出sql或者将sql查询

  • mysql enum字段类型的谨慎使用

    目录 为什么使用枚举 枚举类型使用陷阱 使用例子: 插入数字例子: 为什么使用枚举 限定值的取值范围,比如性别(男,女,未知)等. 枚举类型使用陷阱 1.超级不推荐在mysql中设置某一字段类型为enum,但是存的值为数字,比如‘0’,‘1’,‘2’: 解释1:你会混淆,因为enum可以通过角标取值,但它的角标是从1开始,对于不熟悉这个字段的人这里会出错 解释2:enum类型的字段对于0与‘0’有非常大的区别,如果你是用0当角标做操作,因它没有这个角标,所要会报错:如果你使用‘0’这个值去取枚举

  • Mysql修改字段类型、长度及添加删除列实例代码

    目录 1.mysql中修改字段长度: 2.mysql修改字段类型: 3.mysql中增加列: 4.mysql中修改列: 5.mysql中删除列 6.mysql 修改字段长度更多实例 总结 1.mysql中修改字段长度: ALTER TABLE tb_article MODIFY COLUMN NAME VARCHAR(50); 这里的tb_article为表名,NAME为字段名,50为修改后的长度 2.mysql修改字段类型: ALTER TABLE tb_article MODIFY COLU

  • 详解Mysql多表联合查询效率分析及优化

    1. 多表连接类型 1. 笛卡尔积(交叉连接) 在MySQL中可以为CROSS JOIN或者省略CROSS即JOIN,或者使用','  如: SELECT * FROM table1 CROSS JOIN table2 SELECT * FROM table1 JOIN table2 SELECT * FROM table1,table2 由于其返回的结果为被连接的两个数据表的乘积,因此当有WHERE, ON或USING条件的时候一般不建议使用,因为当数据表项目太多的时候,会非常慢.一般使用LE

随机推荐