Mysql学习笔记三, 数据类型的选择

原创 2015年11月18日 20:13:05

Char和VarChar

char和varchar
如图所示:
1 最后一列是指在非严格模式, 严格模式下会直接报错。
2 即使插入同样的数据,也可能返回不一样的数据:
create table vc(id1 char(4),id2 varchar(4));
insert into vc values('1 ','1 ');
select concat(id1,'|'), concat(id2,'|') from vc;
分别返回了1| 和2 |
3 char处理效率高于varchar, 但varchar更节省空间,随着mysql版本的上升,效率上
的差距越来越小 。

在各个存储引擎下使用原则:
1 MyIsam: 使用char。
2 Innodb: 使用varchar。引擎内部没有区分定长和非定长,所以使用char并不会带来
效率提升。
3 Memory: 即使使用varchar,也会被当做char使用。

Text和Blob

存放大量数据的时候需要考虑使用text和blob, text存放字符型数据,blob存放二进制数据。
TextText、MediumText、LongText,Blob类似。

1 这些大字段,执行了删除操作后,会留一下空洞, 后面插入这些空洞的记录插入性能
比较差,建议在删除操作后进行optimize table。

create table t1(id int,val text); --建表,val为大字段
insert into t1 values(1, repeat('haha',2000));--使用repeat来构建大字段
insert into t1 values(2, repeat('haha',2000));
insert into t1 select * from t1;--执行N次,以指数式增长方式来添加数据
/databasehome/du -sh t1.*  --查看t1.ibd文件的大小(表数据和索引的大小)
delete from t1 where id =1; --清空一半的数据
/databasehome/du -sh t1.*  --此时文件大小未变。
optimize table t1;  --优化表t1
/databasehome/du -sh t1.*  --此时空间被回收,文件大小变小。

2 通过合成索引(字段的散列指作为索引)来提高对大字段的检索,只适用精确检索。

create table t (id varchar(100),context blob,hash_value varchar(40));
insert into t values(1,repeat('beijing',2),md5(context)); --hash_value存放context被hash后的数据, 用于精确检索时使用

3 模糊检索使用前缀索引。

create index t1_idx2 on t1(val(10)); --将val的前10个字符作为前缀索引
desc select * from t1 where val like 't%'; --通过查看查询语句的执行情况,发
现是用来了前缀索引。
  • %放在前面无法使用前缀索引。
    4 尽量避免检索大字段,如少使用select *。将大字段做一个单独表存放。

浮点数和定点数

浮点数: float,double(real) 含有一部分小数位的数值, 如果超过其精度,数据可以插入, 但是不会被四舍五入。是一种近似值的方式。
定点数: decimal(numberic) ,以字符串方式存放,相对浮点数精度更加准确。 适合用于计算。 如果超过精度,在默认SqlMode下会告警并插入数据, 如果在传统模式下直接报错。

create table t1(a float(10,2), b decimal(10,2));
insert into t1 values(131072.32,131072.32); --插入131072.32 ,浮动数的情况下,查询出来的是131072.31
  • 编程中,比较和运算。尽量使用定点数。

日期类型的选择

  1. 按需选择。如果只需要记录年份,能使用YEAR即可。
  2. 如果要记录年月日时秒分, 并且记录时间较久远,可以使用DATETIME, 因为它比TIMESTAMP时间跨度更长。
  3. 如果记录要在不同时区使用, 可以使用TIMESTAMP, 它和实际时区相对应。

Mysql学习笔记(一)(有点乱,但是知识点比较齐全)新手必看。

良好的理解sql语句: 列:理解可以运算的成变量 where: 理解成表达式,放在行中看是否成立 查出来的结果可以当成一张表理解,select 套用select综合查询; ...
  • leilei107
  • leilei107
  • 2013年11月19日 17:26
  • 2395

MySQL学习笔记---基础概念和一些基础SQL语句(一)

MySQL学习笔记,以防遗忘 数据库基本概念 数据库:保存有组织的数据的容器(通常是一个文件或一组文件)。 表:某种特定类型数据的结构化清单,数据库中的表都有一个唯一的名字用来标识自己。 模式:关于数...
  • Jung_zhang
  • Jung_zhang
  • 2016年04月14日 20:11
  • 1714

《高性能MySQL》学习笔记二

今天打算继续学习《高性能MySQL》的第四章,有关数据库的优化。Schema与数据类型优化前置知识:如何设计数据库? 关于这方面我是在CSDN博客上找文章看的。选择优化的数据类型三大原则:(简单、小...
  • u012723607
  • u012723607
  • 2017年08月09日 15:35
  • 105

mysql数据库字段类型的选择原则

数据库类型的选择对数据库的性能影响很大 1 . 数据类型会影响存储空间的开销2 . 数据类型会影响数据查询性能所以当一个数据类型可以有多种选择多种类型的时候,应该优先考虑数字类型,其次是日期或二进制...
  • u013412790
  • u013412790
  • 2016年06月08日 21:14
  • 2592

Chrome学习笔记(三):UI组件,皮肤引擎

原创文章,转载请注明:转载自Soul Apogee 本文链接地址:Chrome学习笔记(三):UI组件,皮肤引擎 —— 控件库 这篇文章是接着上篇文章继续聊的,Chrome的代码实在太多,每一...
  • wanfengnianhua
  • wanfengnianhua
  • 2017年04月25日 18:56
  • 252

mysql创建字段选数据类型参考大全

分类 子类型 数据类型 上限 数据类型说明  日期和时间数据类型   date 3字节 日期,格式:2...
  • imail2016
  • imail2016
  • 2016年06月26日 15:32
  • 1296

Dubbo框架学习笔记(三)

Dubbo源码地址:https://github.com/alibaba/dubbo Dubbo开发指南:http://dubbo.io/Developer+Guide-zh.htm Dubbo服务...
  • koalacoco
  • koalacoco
  • 2017年04月03日 20:46
  • 217

≪统计学习精要(The Elements of Statistical Learning)≫课堂笔记(三)

照例文章第一段跑题,先附上个段子(转载的哦~): I hate CS people. They don't know linear algebra but want to teach pro...
  • xiebaochun
  • xiebaochun
  • 2014年06月29日 10:02
  • 3687

MySQL学习之数据类型选择

数据分类 在使 存储数据 更有一致性、提高存储效和速度方面起了重要的作用。 下面是 MySQL 的字段在选取数据类型时的几个标准 允许值 允许输入一个字段中的值的范围和类型是决定哪个...
  • PrairieLoneWolf
  • PrairieLoneWolf
  • 2013年02月01日 23:09
  • 300

MySQL表结构优化、数据类型选择方法

思维导图   点击图片,可查看大图。    介绍   情况:如果你的表结构设计不良或你的索引设计不佳,那么请你优化你的表结构设计和给予合适的索引,这样你的查询性能就能提高几个数量级。——...
  • aya19880214
  • aya19880214
  • 2015年05月20日 15:48
  • 1717
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Mysql学习笔记三, 数据类型的选择
举报原因:
原因补充:

(最多只允许输入30个字)