文档章节

互联网产品mysql数据库设计总结

Ryan勇者无惧
 Ryan勇者无惧
发布于 2017/02/28 23:26
字数 1462
阅读 7
收藏 0
点赞 0
评论 0

mysql数据库性能不比oracle数据库,所以设计上,和oracle有一些不同。下面总结一些互联网产品的数据库设计。

  1. 主键 主键可以使用bigint(20) unsigned也可以使用varchar,使用bigint,可以设置为自增主键auto_increment。使用varchar,要生成主键。

  2. gmt_create、gmt_modified 在TB所有表中都添加gmt_create、gmt_modified字段,都是datetime类型。gmt_create表示记录创建时间,gmt_modified表示最近修改时间,如果记录没有修改,gmt_create和gmt_modified一致。 那么,这两个字段可以做什么用呢?这两个字段可以方便统计每天对某个表做了多少次的DML。另一种统计方式可以通过binlog。 查看昨天insert:

select * FROM  test_table  WHERE 
gmt_create < date_format(DATE(now()), '%Y-%m-%e %H-%i-%s') AND 
gmt_create >= date_format(DATE(date_add(now(), INTERVAL - 1 DAY)),'%Y-%m-%e %H-%i-%s');
查看昨天update:
select * FROM test_table WHERE gmt_create < date_format(DATE(now()), '%Y-%m-%e %H-%i-%s')
AND gmt_create >= date_format(DATE(date_add(now(), INTERVAL - 1 DAY)),'%Y-%m-%e %H-%i-%s')
AND date_add(gmt_create, INTERVAL - 1 DAY) != date_add(gmt_modified, INTERVAL - 1 DAY)
  1. 逻辑删除 is_deleted 数据库不做物理删除,只做逻辑删除,用is_deleted做逻辑删除,如果删除,则为1,不删除则为0.is_deleted字段可以使用tinyint型。

  2. 禁止使用物理外键,使用逻辑外键 由于mysql性能不如oracle,外键还是一个比较消耗性能的东西,所以我们不要使用物理外键,就是我们在建表的时候,禁止使用foreign key。 例如表b记录了表a的id,我们只需在表b中添加一列:aid就可以了,然后通过程序来控制外键关系。

  3. 命名规范 1.库名,表名,字段名必须都用小写字母,并用下划线_分隔,并且见名知意,使用名词。 原因如下: a) MySQL有配置参数lower_case_table_names,不可动态更改,linux系统默认为0,即库表名以实际情况存储,大小写敏感。如果是1,以小写存储,大小写不敏感。如果是2,以实际情况存储,但以小写比较。 b) 如果大小写混合用,可能存在abc,Abc,ABC等多个表共存,容易导致混乱。 c) 字段名显示区分大小写,但实际使用不区分,即不可以建立两个名字一样但大小写不一样的字段。 d) 为了统一规范, 库名、表名、字段名使用小写字母。

  4. 使用innoDB存储引擎 5.5以后的默认引擘,支持事务,行级锁,更好的恢复性,高并发下性能更好,对多核,大内存,ssd等硬件支持更好。

  5. 关于数据类型 a. 存储精确浮点数必须使用DECIMAL替代FLOAT和DOUBLE。 例如:对于金钱的存储,使用decimal,或者以分为单位,用bigint(20) unsigned。 b. 使用UNSIGNED存储非负数值。同样的字节数,存储的数值范围更大。如tinyint 有符号为 -128-127,无符号为0-255 c.建议使用INT UNSIGNED存储IPV4。 使用INT UNSIGNED而不是char(15)来存储ipv4地址,通过MySQL函数inet_ntoa和inet_aton来进行转化。Ipv6地址目前没有转化函数,需要使用DECIMAL或者两个bigINT来存储。例如: SELECT INET_ATON('209.207.224.40'); 3520061480 SELECT INET_NTOA(3520061480); 209.207.224.40 d.整形定义中不添加(4),比如使用INT,而不是INT(4) 注意数值类型括号后面的数字只是表示宽度而跟存储范围没有关系,比如INT(3)默认显示3位,空格补齐,超出时正常显示,python、java客户端等不具备这个功能。 e.使用短数据类型,比如取值范围为0-80时,使用TINYINT UNSIGNED。 f.不建议使用ENUM类型,使用TINYINT来代替。 ENUM,有三个问题:添加新的值要做DDL,默认值问题(将一个非法值插入ENUM(也就是说,允许的值列之外的字符串),将插入空字符串以作为特殊错误值),索引值问题(插入数字实际是插入索引对应的值) 实例: drop table if exists t; create table t(sex enum('0','1')); insert into t values(1); insert into t values('3'); select * from t; +------+ | sex | +------+ | 0 | | | +------+ 2 rows in set (0.00 sec) g.尽可能不使用TEXT、BLOB类型。 h.VARCHAR(N),N表示存的个数,比如:VARCHAR(10) 下面语句都可以成功: update test set testvarchar='一二三四五六七八九十' where id=1 update test set testvarchar='1234567890' where id=1 update test set testvarchar='abcdefghij' where id=1 i.存储年使用YEAR类型。 j.存储日期使用DATE类型。 k.存储时间(精确到秒)建议使用TIMESTAMP类型,因为TIMESTAMP使用4字节,DATETIME使用8个字节。 l.将过大字段拆分到其他表中。 m.禁止在数据库中使用VARBINARY、BLOB存储图片、文件等

  6. 适当建立索引 非唯一索引必须按照“idx_字段名称_字段名称[_字段名]”进行命名。 唯一索引必须按照“uniq_字段名称_字段名称[_字段名]”进行命名。 索引名称必须使用小写。 索引中的字段数建议不超过5个。 单张表的索引数量控制在5个以内。 不建议使用%前缀模糊查询,例如LIKE “%weibo”。 合理创建联合索引(避免冗余),(a,b,c) 相当于 (a) 、(a,b) 、(a,b,c)。 唯一键由3个以下字段组成,并且字段都是整形时,使用唯一键作为主键。 没有唯一键或者唯一键不符合5中的条件时,使用自增id作为主键。 唯一键不和主键重复。 索引字段的顺序需要考虑字段值去重之后的个数,个数多的放在前面。 ORDER BY,GROUP BY,DISTINCT的字段需要添加在索引的后面。

© 著作权归作者所有

共有 人打赏支持
Ryan勇者无惧
粉丝 0
博文 32
码字总数 13006
作品 0
汉沽
程序员
阿里,百度,腾讯等一线互联网公司中,Java开发的招聘标准

金三银四的跳槽热潮即将过去,在这两个月的跳槽的旺季中,作为互联网行业的三大巨头,百度、阿里巴巴、腾讯对于互联网人才有很大的吸引力,他们的员工也是众多互联网同行觊觎的资深工程师、管...

javaxuexi123 ⋅ 04/20 ⋅ 0

阿里巴巴集团去IOE运动的思考与总结

本文出处:http://www.mysqlops.com/2012/05/07/alibaba-ioe.html 【导读】 预计2012年5月7日,阿里巴巴集团将正式公布技术团队合并的事情,涉及的部门:阿里巴巴运维团队、阿里巴巴DBA团 队...

红薯 ⋅ 2012/05/07 ⋅ 76

考验你眼光的时候来了!!

是时候考虑一下我们的关系了! 2014-07-05 荔枝FM 谢谢你一直在我身边,默默的给我关注和支持,我想,是时候考虑一下我们的关系了。 荔枝君需要志同道合、一起玩耍、共赴前程的好兄弟!你是了...

迷糊 ⋅ 2014/07/05 ⋅ 1

急招腾讯高级开发工程师的职位

急招高级后台开发工程师:薪资在10-40之间。 联系方式: Tina Sun Beijing Langtian Century Consulting Co.,Ltd. Mobile: 15311121530/18210009342 Tel: 010-56291979-8530, 57245399 Fax: ......

小小兔 ⋅ 2012/05/16 ⋅ 2

Java领域从传统行业向互联网转型你必须知道的那些事儿

我为什么要写这篇文章 武林中,"天下武功出少林"指各门各派的武功都与少林武学有一定的渊源,技术也是相同的道理,对于Java领域的应用而言,传统行业与互联网行业的技术都来自J2SE和J2EE的生...

李艳鹏 ⋅ 2017/06/24 ⋅ 0

普通程序员该如何进阶为全栈工程师?

文章开头:本文是红旗飘飘老师发表在产品壹佰的文章(http://www.chanpin100.com/article/105841 )转载文章仅供大家习,不作任何商业用途。 全栈工程师决不是一夜练成的,你需要打好技术基础...

萌丸 ⋅ 2017/11/30 ⋅ 1

我心中的MySQL DBA

原文网址链接:http://wangwei007.blog.51cto.com/68019/1718311 MySQL是一个跨平台的开源关系型数据库管理系统,目前MySQL被广泛地应用在Internet上的中小型网站中。由于其体积小、速度快、...

数通畅联 ⋅ 2015/12/07 ⋅ 0

2013年5月18日华东数据库技术大会演讲嘉宾和演讲主题等信息

【导读】 自2009年于上海举办技术类会议以来,一直坚持公益性且技术干货为主的特点,在2009年致2011年底之间的三年期间一直是IT168坚持真诚 奉献,后因公司被收购等因素不得不放弃华东地区的...

金官丁 ⋅ 2013/03/27 ⋅ 8

我心中的MySQL DBA

MySQL是一个跨平台的开源关系型数据库管理系统,目前MySQL被广泛地应用在Internet上的中小型网站中。由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,许多中小型网站为了降低...

lover007 ⋅ 2015/11/30 ⋅ 0

支撑起整个互联网时代的 7 款开源软件

开源软件现在成为整个互联网时代的支撑技术,你可能已经无法离开由开源软件构建起来的网络世界了。下面我们就来看看一些最重要的开源技术。 为互联网而生的操作系统linux Linux是一款免费的操...

oschina ⋅ 2015/02/07 ⋅ 67

没有更多内容

加载失败,请刷新页面

加载更多

下一页

UI ,前端框架选型

Flat-UI

miaojiangmin ⋅ 7分钟前 ⋅ 0

Istio Service Mesh 教程

Istio Service Mesh 教程 作者 宋净超 | 5400字 | 阅读大约需要11分钟 | 归档于istio | 发表于 2018-05-22 标签 #Istio #教程,来自 https://servicemesher.github.io/blog/istio-service-m...

openthings ⋅ 12分钟前 ⋅ 0

scala swing

scala swing组件的库 https://github.com/scala/scala-swing scala swing的API文档 https://www.scala-lang.org/api/2.9.1/scala/swing/package.html...

whoisliang ⋅ 16分钟前 ⋅ 0

CentOS安装配置Nginx

安装依赖 yum install gcc yum install pcre-devel yum install zlib zlib-devel yum install openssl openssl-devel //一键安装上面四个依赖 yum -y install gcc zlib zlib-devel pcre-deve......

临江仙卜算子 ⋅ 23分钟前 ⋅ 0

开源 java CMS - FreeCMS2.8 依申请公开

项目地址:http://www.freeteam.cn/ 依申请公开 1. 转交申请公开 用户可以把申请公开转交给其他人办理,系统会记录此申请公开的转交记录。 注意:同时只能转交一个申请公开。 选择需要转交的...

freeteam ⋅ 27分钟前 ⋅ 0

以太坊 web3.py 签名转账

以太坊 web3.py 签名转账 本文节选自电子书《Netkiller Blockchain 手札》 Netkiller Blockchain 手札 Mr. Neo Chan, 陈景峯(BG7NYT) 中国广东省深圳市龙华新区民治街道溪山美地 518131 +86...

netkiller- ⋅ 32分钟前 ⋅ 0

年薪40W的程序员必会的技术有哪些?

很多人在问我,程序员如何拿高薪,如何做到年薪40W+,其实总结出来还是一句话,你的技术决定你的能力已经薪资。 那么什么样的技术人才才能拿到一份Java行业里面的高薪呢? 下面是我的一个总结...

码代码的小司机 ⋅ 33分钟前 ⋅ 0

jesque-spring使用及源码分析

1.使用 jesque结合spring使用,步骤如下: 1.1 在项目中添加maven依赖 <dependency> <groupId>net.lariverosc</groupId> <artifactId>jesque-spring</artifactId> <version>1.0.0</ve......

Funcy1122 ⋅ 34分钟前 ⋅ 0

OSChina 周二乱弹 —— 加班的代码不要枉费了我的童子功

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @小小编辑:推荐歌曲《29》- 未完成乐队 《29》- 未完成乐队 手机党少年们想听歌,请使劲儿戳(这里) @FalconChen :#看球提醒# 02:00 巴西v...

小小编辑 ⋅ 今天 ⋅ 16

Docker Swarm的前世今生

概述 在我的《Docker Swarm集群初探》一文中,我们实际体验了Docker Swarm容器集群技术的魅力,与《Kubernetes实践录》一文中提到的Kubernetes集群技术相比,Docker Swarm没有Kubernetes显得...

CodeSheep ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部