当前位置: 首页 > 编程日记 > 正文

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

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)

3.逻辑删除 is_deleted

数据库不做物理删除,只做逻辑删除,用is_deleted做逻辑删除,如果删除,则为1,不删除则为0.is_deleted字段可以使用tinyint型。

4.禁止使用物理外键,使用逻辑外键

由于mysql性能不如oracle,外键还是一个比较消耗性能的东西,所以我们不要使用物理外键,就是我们在建表的时候,禁止使用foreign key。

例如表b记录了表a的id,我们只需在表b中添加一列:aid就可以了,然后通过程序来控制外键关系。

5.命名规范

1.库名,表名,字段名必须都用小写字母,并用下划线_分隔,并且见名知意,使用名词。

原因如下:

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

6.使用innoDB存储引擎

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

7.关于数据类型

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存储图片、文件等

8.适当建立索引

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


参考:http://lgdvsehome.blog.51cto.com/3360656/1272044



相关文章:

【跟我一起学Unity3D】做一个2D的90坦克大战之AI系统

对于AI&#xff0c;我的初始想法非常easy&#xff0c;首先他要能动&#xff0c;而且是在地图里面动。 懂得撞墙后转弯&#xff0c;然后懂得射击&#xff0c;其它的没有了&#xff0c;基于这个想法&#xff0c;我首先创建了一个MyTank类&#xff0c;用于管理玩家的坦克的活动&am…

如何利用C#开发“扫雷”小游戏

本文详细说明了利用C#语言开发“扫雷”小游戏的开发过程。

spring ioc原理分析

spring ioc原理分析 spring ioc 的概念简单工厂方法spirng ioc实现原理 spring ioc的概念 ioc: 控制反转 将对象的创建由spring管理。比如&#xff0c;我们以前用new一个对象的方式自己创建一个对象&#xff0c;现在使用spring&#xff0c;不必自己new一个对象了&#xff0c…

PL/SQL集合类型的整理学习

http://log-cd.iteye.com/blog/521177 PL/SQL集合类型是类似于高级语言数组的一种复合数据类型&#xff0c;集合类型包括索引表&#xff08;PL/SQL表&#xff09;、嵌套表&#xff08;Nested Table&#xff09;和变长数组&#xff08;VARRAY&#xff09;三种类型。<一>、…

多条件组合查询+分页

比较麻烦&#xff0c;把他记录下来。前台UI&#xff1a;实现的类代码:程序代码/// <summary>/// 多条件组合查询/// </summary>/// <param name"suppliercode">供应商代码</param>/// <param name"materialcode">物料代码&l…

Matlab与线性代数 -- 矩阵的重组1

本图文介绍了矩阵重组的第一种情况用新的行或列取代原有矩阵的行或列。

工作中感受到的消息中间件在分布式系统中的使用场景

经历 以前在qunar实习&#xff0c;第一次接触消息中间件&#xff0c;那时候概念还不清楚&#xff0c;朦朦胧胧有个初步认识&#xff0c;现在正式工作了&#xff0c;又一次接触了消息中间件&#xff0c;初步总结几种场景。 场景 1.分布式系统中&#xff0c;不同系统之间传递消…

sql server 2005分页存储过程和sql server 2000分页存储过程(摘)

USE[svnhost]GO/****** 对象: StoredProcedure [dbo].[up_Page2005] 脚本日期: 05/21/2008 11:27:05 ******/SETANSI_NULLS ONGOSETQUOTED_IDENTIFIER ONGOCREATEproc[dbo].[up_Page2005]TableNamevarchar(50), --表名Fieldsvarchar(5000) *, --字段名(全部字段为…

topcoder srm 691 div1 -3

1、给定一个$n$个顶点$n$个边的图&#xff0c;边是$(i,a_{i})$&#xff0c;顶点编号$[0,n-1]$。增加一个顶点$n$,现在选出一个顶点集$M$,对于任意的在$M$中 的顶点$x$&#xff0c;去掉边$(x,a_{x})$&#xff0c;增加边$(x,n)$。最后使得顶点0和1相连。有多少种$M$? 思路&#…

Matlab与线性代数 -- 矩阵的重组2

本图文详细介绍了矩阵重组的第二种情况任意两行或两列进行对换。

mac通过tree源码编译安装tree

通过tree源码编译安装 下载源码&#xff1a;curl -O ftp://mama.indstate.edu/linux/tree/tree-1.6.0.tgz 解压源码&#xff1a;tar xzvf tree-1.6.0.tgz 修改Makefile文件&#xff1a; tree默认的是linux的编译环境&#xff0c;因此移植到mac里面需要注释掉linux的编译选项&am…

java IO流文件的读写具体实例

IO流的分类&#xff1a;1、根据流的数据对象来分&#xff1a;高端流&#xff1a;所有的内存中的流都是高端流&#xff0c;比如&#xff1a;InputStreamReader 低端流&#xff1a;所有的外界设备中的流都是低端流&#xff0c;比如InputStream&#xff0c;OutputStream 如何区分…

Matlab与线性代数 -- 矩阵的重组3

本图文详细介绍了矩阵重组的第三种情况&#xff0c;从矩阵中选取子矩阵。

ASP.NET小收集:IFrame使用

使用Iframe制作一个固定框架&#xff0c;很方便与象后台网站之类的页面1<html xmlns"http://www.w3.org/1999/xhtml">2<head runat"server">3<title>后台</title>4</head>5<frameset cols"170,*"framespacing&…

linux mac中实现类似secureCRT的clone session

在你的登录账户下的.ssh文件夹新建一个文件&#xff1a;config. cd ~/.ssh vi config config的文件中&#xff0c;内容为&#xff1a; host * ControlMaster auto ControlPath ~/.ssh/master-%r%h:%p 重新打开终端&#xff0c;第一次&#xff0c;你还是需要输入密码&#xff0c…

C#动态加载DLL(转)

利用反射进行动态加载和调用.Assembly assAssembly.LoadFrom(DllPath); //利用dll的路径加载加载dll后,需要使用dll中某类.Type typeass.GetType(“TypeName”);//利用类型的命名空间和名称获得类型需要实例化类型,才可以使用,参数可以人为的指定,也可以无参数,静态实例可以省略…

mysql高可用之MMM

博主QQ&#xff1a;819594300博客地址&#xff1a;http://zpf666.blog.51cto.com/有什么疑问的朋友可以联系博主&#xff0c;博主会帮你们解答&#xff0c;谢谢支持&#xff01;一、MMM简介&#xff1a;MMM即Multi-MasterReplication Manager for MySQL:mysql多主复制管理器。M…

Matlab与线性代数 -- 矩阵的重组4

本图文详细描述了矩阵重组的第四种情况&#xff0c;将矩阵改写成行向量或者列向量。

利用spring aop统一处理异常和打日志

利用spring aop统一处理异常和打日志 spring aop的概念&#xff0c;很早就写博客介绍了&#xff0c;现在在工作中真正使用。 我们很容易写出的代码 我们很容易写出带有很多try catch 和 logger.warn(),logger.error()的代码&#xff0c;这样一个方法本来的业务逻辑只有5行&a…

Matlab与线性代数 -- 矩阵的重组5

本图文详细介绍了矩阵重组的Matlab命令reshape()。

windows XP下Python2.7包管理工具安装-setuptool,pip、distribute、nose、virtualenv

在Python开发中为了对项目进行管理和调试。必须安装一些特定的软件包。据说业内这个叫做yak shaving-做一个非常酷非常绚丽的Python项目之前&#xff0c;必须做的一些枯燥无味的准备工作。本文介绍了setuptool。pip、distribute、nose、virtualenv的安装。 1&#xff0c;pytho…

黑客必知的SQL语句 黑客知道,程序员必知

SQL语句先前写的时候&#xff0c;很容易把一些特殊的用法忘记&#xff0c;我特此整理了一下SQL语句操作。 一、基础 1、说明&#xff1a;创建数据库 Create DATABASE database-name 2、说明&#xff1a;删除数据库 drop database dbname 3、说明&#xff1a;备份sql server --…

AutowireCapableBeanFactory,实现不必配置xml文件,动态加载bean

场景 今天遇见一个问题&#xff0c;如何能做到一个类&#xff0c;没有在spring的配置文件中配置&#xff0c;但是还能通过某种方式加载进来。通过查看一些代码&#xff0c;查看stackoverflow&#xff0c;了解了一些知识。 如果一个类并没有在applicationContext中配置我们可以…

[导入]如何理解Return的返回值?

如何理解Return的返回值&#xff1f; 问题&#xff1a; 在创建和录制脚本的时候&#xff0c;发现在脚本vuser_init、Action、vuser_end三部分&#xff0c;都会有一条“return 0;”语句&#xff0c;那么我们平时在编写脚本时如何应用return语句&#xff0c;return不同的返回值又…

如何利用神经网络结合遗传算法进行非线性函数极值寻优(2)

如何利用神经网络结合遗传算法进行非线性函数极值寻优

自己亲自写的两本linux资料,免费下载,pdf文档

第一本是我写的韩顺平老师解说的linux视频的笔记&#xff0c;该视频原本有21讲&#xff0c;可是我始终没有找到当中的17、18讲。可是其它部分我感觉及记录的还是蛮认真的。该套视频解说的非常基础&#xff0c;因此我的这本笔记也非常基础。这里是免积分在csdn上的下载地址&…

深入理解Java:SimpleDateFormat安全的时间格式化

转自&#xff1a;http://www.cnblogs.com/peida/archive/2013/05/31/3070790.html 想必大家对SimpleDateFormat并不陌生。SimpleDateFormat 是 Java 中一个非常常用的类&#xff0c;该类用来对日期字符串进行解析和格式化输出&#xff0c;但如果使用不小心会导致非常微妙和难以…

如何提高增加包含大量记录的表的主键字段的效率

如何提高增加包含大量记录的表的主键字段的效率 LazyBee 1 问题的提出&#xff1a; 在给客户升级数据库系统时&#xff0c;由于报表的需要&#xff0c;系统中每一个表都需要有主键字段。系统审计表自然也有这个要求—需要增加一个identify的字段&#xff0c;但这个表中有2000多…

${pageContext.request.contextPath} JSP取得绝对路径

在使用的时候可以使用${pageContext.request.contextPath}&#xff0c;也同时可以使用<%request.getContextPath()%>达到同样的效果&#xff0c;同时&#xff0c;也可以将${pageContext.request.contextPath}&#xff0c;放入一个JSP文件中&#xff0c;将用C&#xff1a;…

Matlab与线性代数 -- 矩阵的水平连接和垂直连接

本图文详细介绍了Matlab中矩阵的水平连接和垂直连接。