Mysql优化系列之数据类型优化
本篇是优化系列的第一篇:数据类型
为了不产生赘述,尽量用简洁的语言来描述。
在选择数据类型之前,首先要知道几个原则:
- 更小的通常更好
尽量使用可以正确存储数据的最小数据类型。更小的数据类型意味着更快,占用更少的磁盘,内存以及缓存,以及处理时间
- 简单就好
这是出于操作数据类型的效率和代价考虑。整型比字符型操作代价更低,因为字符集和校对规则是字符处理比整型更复杂
两个例子:使用Mysql内建的datatime而不是字符串存储时间,使用整型而不是IP字符串存IP地址
- 尽量避免NULL
这是个很烦人的值,做开发的都不喜欢,建字段时请尽量指定是否非空,NULL使得索引,统计,比较都变得更复杂,相信
大家都曾查过count(*)和count(column_name)的区别,后者会过滤掉column_name值为NULL的记录,至于索引失效的问题后面
单独讲索引的时候会讲,这里只提:如果这计划在列上建索引,那么这一列最好不要允许为NULL
以上三点是比较简单的几个原则
下面是我开发中总结的一些干货。不定期补充
一、整数类型
(1)UNSIGNED属性表示不允许负值,可以使得正数的上限提高一倍,比如tinyint+unsigned可以使原本的-128~127的范
围变为0~255
(2)通常我们用tinyint存状态值(这个值范围足够了)而不要用int,如果是Boolean类型,那么tinyint(1)当值为1和0时,查
询结果自动转为true和false,条件参数相应的也可以直接传入true和false即可
(3)INT(11)不会限制值的范围,只是规定了一些客户端工具用来显示的字符的个数,所以对于存储和计算来说INT(11)和
INT(1)相同
(4)IP地址实际上是32位无符号整数,用INT存储,Mysql提供转换函数为INET_ATON()和INET_NTOA()
二、小数(实数)
通常存金额用decimal(11,2),这表示整数部分和小数部分分别为9位和2位注意!,当然可以根据具体的金额大小选择长度
注意这时候对应的java中用BigDecimal类来处理运算时要仔细,因为加减法和比较跟平常不一样
三、字符串类型
VARCHAR是可变长字符串,比定长字符串(CHAR)更节省空间,仅使用必要的空间
另外VARCHAR需要额外字节记录字符串长度(不同情况需要字节数不同)
CHAR类型是定长字符串,开发中基本很少用(一些公司甚至基本上不考虑这种类型了)
注意:字符串长度定义不是字节数,是字符数
四、日期和时间类型
(1)datetime使用8字节存储空间,保存从1001年到9999年的秒数。与时区无关,默认情况下,Mysql以一种可排序的
格式显示它的值,例如:"2018-10-14 22:30:08"
(2)timestamp只使用4字节存储,保存1970年1月1日午夜以来的秒数,依赖于系统时区,和UNIX时间戳相同,转换
函数分别为FROM_UNIXTIME()和UNIX_TIMESTAMP(),可以设置根据当前时间戳更新,比如我们熟悉的update_time字段
五、标识列
用于唯一标识某条记录的列,或作为另一张表的关联字段的列。其中关联字段的字段类型和属性应该统一,其中整数类
型是最优先的选择,几乎每张表我们都可以设置一个自增的整数列。另外不要用随机的字符串作为标识列的值,MD5(),
UUID()产生的字符串都属于此类,如果存储UUID值,应移除"-"符号。更好的一种做法:用UNHEX()函数转换UUID值为16字
节的数字,检索时再通过HEX()来格式化为十六进制格式
以上是数据类型的一些心得总结,下一篇总结下表设计的一些规范和优化
Mysql优化系列之数据类型优化的更多相关文章
- [MySQL性能优化系列]LIMIT语句优化
1. 背景 假设有如下SQL语句: SELECT * FROM table1 LIMIT offset, rows 这是一条典型的LIMIT语句,常见的使用场景是,某些查询返回的内容特别多,而客户端处 ...
- MySQL之Schema与数据类型优化
选择优化的数据类型 MySQL支持的数据类型非常多,选择正确的数据类型对于获得高性能至关重要.不管存储哪种类型的数据,下面几个简单的原则都有助于做出更好的选择: 更小的通常更好一般情况下,应该尽量使用 ...
- 深入学习MySQL 03 Schema与数据类型优化
Schema是什么鬼 schema就是数据库对象的集合,这个集合包含了各种对象如:表.视图.存储过程.索引等.为了区分不同的集合,就需要给不同的集合起不同的名字,默认情况下一个用户对应一个集合,用户的 ...
- 高性能mysql之schema与数据类型优化
1.数据类型 http://www.cnblogs.com/YDDMAX/p/4937770.html
- 数据库优化系列——SQL性能优化十条建议
1.查询的模糊匹配 尽量避免在一个复杂查询里面使用 LIKE '%parm1%'—— 红色标识位置的百分号会导致相关列的索引无法使用,最好不要用. 解决办法: 其实只需要对该脚本略做改进,查询速度便 ...
- PLSQL_性能优化系列04_Oracle Optimizer优化器
2014-09-25 Created By BaoXinjian
- Android优化系列之ListView优化老生常谈
本文内容:adapter,listview的优化,RecycleBi,google大会推荐优化, 实现ListView的过程,Adapter起到了至关重要的作用,不仅仅因为getview()方法.那么 ...
- Android性能优化系列之电量优化
电量消耗的计算与统计是一件麻烦而且矛盾的事情,记录电量消耗本身也是一个费电量的事情,随着Android开的性能要求越来越高,电量的优化,也显得格外重要,一个耗电的应用,用户肯定会毫不犹豫的进行卸载,所 ...
- ElasticSearch优化系列七:优化建议
尽量运行在Sun/Oracle JDK1.7以上环境中,低版本的jdk容易出现莫名的bug,ES性能体现在在分布式计算中,一个节点是不足以测试出其性能,一个生产系统至少在三个节点以上. ES集群节点规 ...
随机推荐
- JAVA javac
{ 用法: javac <options> <source files>其中, 可能的选项包括: -g 生成所有调试信息 - ...
- Ruby 数据类型
Ruby 数据类型 本章节我们将为大家介绍 Ruby 的基本数据类型. Ruby支持的数据类型包括基本的Number.String.Ranges.Symbols,以及true.false和nil这几个 ...
- NOIp2018集训test-9-7(pm) (联考一day1)
又被辉神吊打了.今天不仅被辉神李巨吊打,还给基本上给全班垫底了. 看到T3就知道是十进制快速幂,全机房考试的当时应该就我会,结果我tm没找到递推. Orz lyc BM直接水过,Orz wys六个fo ...
- Go将统治下一个10年?Go语言发展现状分析
“本文是国内Go语言大中华区首席布道师——许式伟,在QCon2015上海站上的分享.他预测Go语言10年内一定会超过C和java,并且统治这一个10年. Go语言语法及标准库变化 Go从1.0版本到现 ...
- 拾遗:Git 基础
http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/ 一.参数配置 $ git con ...
- ElasticSearch 索引查询使用指南
1.检测集群是否健康,我们通常用下面的命令.确保9200端口号可用: http://localhost:9200/_cat/health?v 或者 http://localhost:9200/_clu ...
- [eJOI2018]元素周期表
题目 \((r_1,c_1),(r_2,c_1),(r_1,c_2)\)三个格子存在就说明\((r_2,c_2)\)存在,如果我们将\(r_1,c_2,c_1,r_2\)都看成一些点的话,那么这个关系 ...
- HDU 5726 线段树+dp
题意:给出一个序列,后q次询问,求给定区间gcd及整个序列有多少个序列的gcd和这个值相同 首先线段树维护区间gcd建树,之后预处理出每个gcd有多少个子序列,这时需要dp, dp[i][tmp]表示 ...
- Python_pymysql
pymysql安装:pip3 install pymysql 第一个实例:连接数据库进行用户验证 条件:数据库中已存在一个用户表,包含用户名.密码 import pymysql user = in ...
- Java动态代理与CGLib
Java帝国之动态代理 CGLib:从兄弟到父子-动态代理在民间是怎么玩的? 以上两篇文章引用自微信公众号: 码农翻身 Java动态代理 深度详解 以上文章引用博客园:陈树义