• 您可以到这里下载本篇博文所使用的数据库以及优化工具mysqldumpslow和pt-query-digest:

  • https://blog.csdn.net/IT_TIfarmer/article/details/92224646

  • 关于explain语句的结果参数详解也可以参考如上博文。

数据类型的选择,重点在于合适二字,如何确定选择的数据类型是否合适?

请记住以下几个原则:

  1. 使用可以存下我们的数据的最小的数据类型。
  2. 使用简单的数据类型。Int要比varchar类型在mysql处理上简单。
  3. 尽可能使用not null定义字段。
  4. 尽量少用text类型,非用不可时考虑好分表。

举个栗子,当我们要存取一个日期时,我们可以用varchar进行存储,也可用date、datetime、timestamp、甚至是int来存储。int无疑是上述几种数据类型中最小的,也比较简单,而在mysql数据库中,timestamp所占字节与int一样,但int在出具库引擎中的处理要比timestamp简单的多,所以我们首选int,其次是timestamp。

为什么要尽可能使用not null来定义字段呢?

原因就是innodb对允许为null的字段,会额外的消耗一些内存对其进行存储,而且,就算我们将一个数据的该字段设为空值,它还是会占用跟其它非空字段一样的存储空间,更何况,空值对索引是不友好的,因此我们尽量用一个默认值来取代空值。

那么对于第四条如何解释呢?

众所周知,text和blob这些大的数据类型是非常占用空间的,它会对我们的查询操作造成不小的影响,因为查询操作对这些字段内容的遍历会白白浪费很多资源。如果我们非用不可的话,就需要把这些字段单独开一张或几张表来存储,并与原来的主表关联,以此来提高主表查询的效率。

有些同鞋可能对此有些疑惑,用int如何存储时间呢?

我们可以借助FROM_UNIXTIME()和UNIX_TIMESTAMP()这两个函数对我们的int进行转换,FROM_UNIXTIME()可以把我们的int类型的时间戳(时间戳就是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数)转换为标准的日期时间格式,而UNIX_TIMESTAMP()则可以把时间转换为int类型,因此如果我们想用int来对时间进行存储,就需要经常用到这两个函数,用法如下:

create table test(
id int auto_increment not null,
timeint int,
primary key(id)
);
insert into test(timeint) values (UNIX_TIMESTAMP('2014-06-01 13:12:00'));
select FROM_UNIXTIME(timeint) from test;

执行结果如下:

+------------------------+
| FROM_UNIXTIME(timeint) |
+------------------------+
| 2014-06-01 13:12:00    |
+------------------------+

如此一来,我们就达到了int来存取时间的目的。

我们再举一个存储ip的栗子:

在我们的一些web应用中,不可避免的会遇到对ip地址进存储,如用户注册IP、用户下订单的IP、访问的IP等。
这时我们首先想到的可能是varchar类型,因为192.168.48.189这种地址看起来就很像字符串,用字符串自然是比较方便。可我们应该知道的是,一个varchar在mysql中是15个字节,而一个bigint只占8个字节,如果我们用bigint来进行存储的话,那么这就近乎节省了一半的存储空间!

怎么做呢?
我们需要利用INET_ATON()、 INET_NTOA()这两个函数进行装换。

create table sessions(
id int AUTO_INCREMENT NOT NULL,
ipaddress BIGINT,
PRIMARY KEY(id)
);insert into sessions(ipaddress) values(INET_ATON('192.168.0.1'));select INET_NTOA(ipaddress) from sessions;

查询结果如下:

+----------------------+
| INET_NTOA(ipaddress) |
+----------------------+
| 192.168.0.1          |
+----------------------+

千万不要小看这节省下来的7个字节,当数据两非常庞大的时候,它会为我们节省很大的存储空间,而且还会对我们查询操作的IO效率和内存带来可观的优化。

在今后的开发中,大家也可以经常去尝试这些mysql函数的使用,使用int或bigint来代替varchar的存储,字段的对比操作也会更加简单和高效。

MySQL中级优化教程(五)——数据库建表时数据类型的选择相关推荐

  1. MYSQL建表时数据类型的选择

    1.为表中的字段选择合适的数据类型 当一个列可以选择多种数据类型时,应该优先考虑数字类型,其次是日期或二进制类型,最后是字符类型. 对于相同级别的数据类型,应该优先选择占用空间小的数据类型. 2.如何 ...

  2. MySQL数据库建表时对于某个字段设置了默认值,但是使用Spring Data Jpa的save后默认值没有生效

    问题描述:MySQL数据库建表时对于某个字段设置了默认值,但是使用Spring Data Jpa的save后默认值没有生效.MySQL数据库中构建的用户表表结构如下所示: DROP TABLE IF ...

  3. 数据库建表时一定要设置外键约束关系吗?

    数据库建表时一定要设置外键约束关系吗? 我们都知道每张数据表都有一个能够确定每行数据唯一性的字段,也就是主键.而在关系数据库中,常常有两表存在一定关系的情况.即一张表的主键跟另一张的外键存在对应关系, ...

  4. 设计数据库表时数据类型的选择

    设计数据库表时数据类型的选择 1. 整数类型 整数类型有:tinyint.smallint.mediumint.int.bigint,分别使用 8.16.24.32.64 位存储空间. 它们可以存储的 ...

  5. MySQL中级优化教程(一)——SQL常用优化工具及explain语句的使用

    序言: 说来惭愧,java学了两年,期间虽在博客上记了一些东西,可也不曾写过什么系统的教程,前一段时间开始学习MySQL数据库优化相关的知识,就想着趁着这个机会好好整理一份电子档出来,即方便自己之后回 ...

  6. mysql数据库建表关键字_关于数据库建表时的有趣实例--关键字重复

    今天 使用CMD连接mysql进行简单的数据库的建表操作.信心满满的写了如下的代码: 然后就爆了个大大的错误 .简直有点莫名其妙的感觉,我是按照昨天学习的步骤写的代码,为什么会出错? 初步开始怀疑: ...

  7. mysql建表时建外键约束_数据库建表时一定要设置外键约束关系吗?

    如果被引用的表需要做分库分表,那么无法建立外键约束. 使用外键会降低数据库性能,这个说法并不细致.需要详细分析. 建立外键,那么一般引用字段上需要建立索引.如果不建立索引,被引用的表上删除数据,会全表 ...

  8. mysql建表时数据类型解释_关于数据库建表时字段数据类型

    基础: char.varchar.text和nchar.nvarchar.ntext的区别 1.CHAR.CHAR存储定长数据很方便,CHAR字段上的索引效率级高,比如定义char(10),那么不论你 ...

  9. 数据库建表时,对于字段的数据类型的选择

    本文是<数据库设计那些事>的笔记和思考. 有如下几种情形: 当字段可选择多个类型时(比如生日字段,可以用时间戳,即整数类型,可以用字符串 类型,也可以用日期 类型):整数.二进制 优于 日 ...

最新文章

  1. oschina的博客还让不让人用了?发的文章竟然不见了!!
  2. MS SQL2005数据库备份
  3. 【每天读一遍,不久你就会变!】【送给迷茫的朋友】
  4. VC++2019 使用wininet下载文件
  5. 布朗大学和FAIR开源LA-MCTS,及其在神经网络结构搜索的应用
  6. boost::hana::drop_back用法的测试程序
  7. Istio 1.7——进击的追风少年
  8. sublime mysql插件_开发者最常用的8款Sublime text 3插件
  9. java 路由_RabbitMQ入门:路由(Routing)
  10. php和python-python与php比较
  11. 在线数据库设计ERD-ONLINE
  12. 酒店ETL管理解决方案
  13. FFmpeg的音频处理详解
  14. 生物信息学_测序技术(一)DNA测序
  15. 计算机简单易懂知识,如何选购电脑主板?小白装机简单易懂的电脑主板选购知识指南...
  16. ZT210打印标签方法及常见问题20230110
  17. 成都java软件技术培训机构
  18. NYIST汉诺塔(一)(三)问题以及汉诺塔的路径实现
  19. 机器学习——K近邻算法及乳腺癌检测分类
  20. 中国移动云能力中心校招面试总结(三面)

热门文章

  1. 我的服务器新手箱子无限,家庭影音之路 篇一:#原创新人#服务器安装Rutorrent(PT盒子)Seedbox教程...
  2. 第二章教程12:地图管理器
  3. 配置WAP网站的服务器(接自http://blog.chinaitlab.com/user1/263305/archives/2005/28039.html)
  4. 51Nod - 1534 棋子游戏(xjb博弈)
  5. 三星手机虚拟定位服务器,三星量产企业服务器用3.2TB NVMe SSD
  6. SAP 零售 FMS 物料主数据(二)归档
  7. 盛迈坤电商:自然流量怎么样打造爆款
  8. 编写软件第一个插件(Hello World)
  9. pandownload内部测试版
  10. STM32启动文件和链接脚本