Mysql优化系列之表设计规范和优化
一、范式
如果详细的讲范式,要写大大大篇文章来讲,这里假设大家知道一些基本的范式规则,我用简洁的语句和例子说明
第一范式:列不可再分,譬如地址字段,可以再细分为省市区门牌号等等(其实还是看需求怎么整)
第二范式:满足第一范式,且除主键以外的列都依赖于主键,这个好理解,订单表中不要有商品名,因为商品名依赖的
是商品id,应该放在商品表中,否则如果商品表中商品名字变了,订单表的商品名却是老数据
第三范式:满足第二范式,且非主键的列不存在传递性依赖,比如订单表中一种常见的不好的设计:
product_name依赖于product_id,product_id依赖于order_id,那么就应该把product_name移除,这是我们常说的冗余字段
范式的优点是结构简单,更新操作快,重复数据少,表规模更小
范式最大的缺点就是通常一些并不复杂的查询都需要关联,稍微复杂的可能要关联多次
二、反范式
如上,反范式的优缺点可以说跟范式正好相反,因为冗余了列,所以更新的时候需要同步更新过去(触发器很方便实现,但是
大公司一般拒绝这样做,因为出了错根本无从排查或很难补救,甚至于存储过程基本也是拒绝使用)。有了冗余列则不需要关联,
意味着使用索引等这样快速的查询更方便
三、混用范式和反范式
实际开发基本都是这样做,是否要冗余还是不冗余,取决于业务,比如一个人的身份证不至于经常变(甚至不变),这样不怎么
变的字段完全可以冗余下来,避免连表查询。再比如count性质的字段,我们不会每次都用一个子查询去计算,而是增加这样一个字
段,每次增加记录后会更新该字段,诸如此类。
四、汇总表、计数表和缓存
一些实时查询代价很大的,我们可以使用汇总表,以前用过复杂的视图,后来发现接触的数据量还是太小,量一上来数据库就要
崩,汇总表就是可以在一个固定的时间点或固定频率做一些汇总查询,将结果保存下来的表,这样每次查询直接拿查询结果即可。这
种设计可能增加写负担,但是显著的提高读性能
五、横向和纵向切分
对于表中字段非常多的表,考虑根据字段意义类别再拆分出一个字表,对于某个字段中需要存储文件或长度很大的字段,也可以
单独拆出来,比如user表中的身份证照片,头像,写真这样的字段,可以独立出字表;
对于时间或者顺序迹象比较明显,数据量又很大的表,考虑分区处理
六、其他
1、表名,字段名使用小写英文字母加下划线命名,用单数形式,表名以t_开头,尽量不要包含数字
2、除非有具体的理由,每张表应该有create_time和update_time两个字段
3、建议每张表都有自增id作为标识列
4、字段名最好不要超过3个单词连接,除非有业内熟知的单词缩写,用完整的单词
5、所有字段名尽量用业内熟知的英文单词,比如账户account,订单order,状态status,类型type
6、设计表时注意预留一些字段,比如常见的物理删除和逻辑删除 ,那么需要预留一个状态字段,如果是激活和非激活状态,也需
要设置一个状态字段
以上是一些比较理论的东西,实际开发设计表,还是需要知其然知其所以然的,否则有可能就是迷迷糊糊的不知道问题出在哪儿
Mysql优化系列之表设计规范和优化的更多相关文章
- SSE图像算法优化系列二十二:优化龚元浩博士的曲率滤波算法,达到约1000 MPixels/Sec的单次迭代速度
2015年龚博士的曲率滤波算法刚出来的时候,在图像处理界也曾引起不小的轰动,特别是其所说的算法的简洁性,以及算法的效果.执行效率等方面较其他算法均有一定的优势,我在该算法刚出来时也曾经有关注,不过 ...
- MySQL锁系列2 表锁
http://www.cnblogs.com/xpchild/p/3789068.html 上一篇介绍了MySQL源码中保护内存结构或变量的锁,这里开始介绍下MySQL事务中的表锁. 注1: 在表 ...
- 优化系列 | DELETE子查询改写优化
0.导读 有个采用子查询的DELETE执行得非常慢,改写成SELECT后执行却很快,最后把这个子查询DELETE改写成JOIN优化过程 1.问题描述 朋友遇到一个怪事,一个用子查询的DELETE,执行 ...
- PLSQL_性能优化系列10_Oracle Array数据组优化
2014-09-25 Created By BaoXinjian
- JVM性能优化系列-(7) 深入了解性能优化
7. 深入了解性能优化 7.1 影响系统性能的方方面面 影响系统性能的因素有很多,以下列举了常见的一些系统性能优化的方向: 7.2 常用的性能评价和测试指标 响应时间 提交请求和返回该请求的响应之间使 ...
- JVM性能优化系列-(3) 虚拟机执行子系统
3. 虚拟机执行子系统 3.1 Java跨平台的基础 Java刚诞生的宣传口号:一次编写,到处运行(Write Once, Run Anywhere),其中字节码是构成平台无关的基石,也是语言无关性的 ...
- 我的MYSQL学习心得(十六) 优化
我的MYSQL学习心得(十六) 优化 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据 ...
- JVM性能优化系列-(1) Java内存区域
1. Java内存区域 1.1 运行时数据区 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域.主要包括:程序计数器.虚拟机栈.本地方法栈.Java堆.方法区(运 ...
- JVM性能优化系列-(2) 垃圾收集器与内存分配策略
2. 垃圾收集器与内存分配策略 垃圾收集(Garbage Collection, GC)是JVM实现里非常重要的一环,JVM成熟的内存动态分配与回收技术使Java(当然还有其他运行在JVM上的语言,如 ...
随机推荐
- Oracle 、MySql 数据库表被锁的原因分析
记录一次准备给客户预演示出现的问题 事故的背景: 当所以功能开发完成后,开发人员在本地进行了测视已经没问题了.就把所有开发的功能模块合并到 dev 分支,进行打包,发布到预演示的线上环境.当在给相关人 ...
- python基础第9章 魔法方法、属性和迭代器(一)
__getitem__和__setitem__: 这个方法返回与指定键想关联的值.对序列来说,键应该是0~n-1的整数,其中n为序列的长度.对映射来说,键可以是任何类型. class A : __ge ...
- bzoj1034题解
[解题思路] 广义田忌赛马的贪心模型.如果当前实力最差的马比对手实力最差的马强,则匹配:如果当前实力最强的马比对手实力最强的马强,亦匹配:若上述两点均不成立,拿己方最差的马去匹配对手最强的马.复杂度O ...
- lua执行的两种方式
一.交互模式 二.脚本式 创建一个以lua结尾的文件,例如hello.lua文件内容 println("hello world")
- NtOpenProcess被HOOK,跳回原函数地址后仍然无法看到进程
点击打开链接http://www.ghoffice.com/bbs/read-htm-tid-103923.html
- C语言进阶学习第三章
以下记录动态内存分配: 1.malloc和free malloc和free分别用于执行动态内存分配和释放.这些函数维护一个可用内存池,当一个程序需要一些内存时,调用malloc函数,malloc从内存 ...
- 去除vim ^M符号
来自: https://zhidao.baidu.com/question/267905868.html 有两种情况,会出现打开的文件都显示^M符号:1. vim被配置为fileformat=unix ...
- 绿色版mysql 免安装使用(转载)
MySQL绿色版的安装(mysql-5.6.22-win32.zip) Posted on 2015-01-31 23:21 卒子 阅读(10739) 评论(2) 编辑 收藏 由于工作需要最近要开始研 ...
- Java学习之JVM、JRE、JDK联系与区别
JVM,全称是Java Virtual Machine,翻译为Java虚拟机: JRE,全称是Java Runtime Environment,翻译为Java运行时环境: JDK,全称是Java De ...
- 《转》python 11 表达式和语句
转自 http://www.cnblogs.com/BeginMan/p/3164600.html 一.Python语句 if语句.else语句.elif语句.条件表达式.while语句.for语句. ...