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上的语言,如 ...
随机推荐
- leetcode-399-除法求值
方法一:dfs+图 class Solution: def calcEquation(self, equations: List[List[str]], values: List[float], qu ...
- 【基础】Hint控制语句执行
mysql常用的hint对于经常使用oracle的朋友可能知道,oracle的hint功能种类很多,对于优化sql语句提供了很多方法.同样,在mysql里,也有类似的hint功能.下面介绍一些常用的. ...
- mui与springMVC前后端分离
这个小dome简单来说的前后端分离,通过跨域调用接口来显示数据. 前端用到mui框架,主要来显示数据. 后端用到Java的springMVC,restful服务来做增删改查管理, 这里主要实现动态显示 ...
- BZOJ 4596: [Shoi2016]黑暗前的幻想乡(容斥+Matrix_Tree)
传送门 解题思路 看到计数想容斥--\(from\) \(shadowice1984\)大爷.首先求出原图的生成树个数比较容易,直接上矩阵树定理,但这样会多算一点东西,会把\(n-2\)个公司的多算进 ...
- 如何理解Vue的render函数
第一个参数(必须) - {String | Object | Function} <!DOCTYPE html> <html lang="en"> < ...
- 9-MySQL高级-主从同步时Slave_IO_Running:Connecting ; Slave_SQL_Running:Yes的情况故障排除
推荐!! 各种情况都考虑在内,条理清楚!! https://blog.csdn.net/mbytes/article/details/86711508
- 19-Ubuntu-文件和目录命令-删除文件和目录-rm
rm 删除文件或目录 注:使用rm命令要小心,因为文件删除后不能恢复.不会放在垃圾箱里,直接从磁盘删除. 选项 含义 -f 强制删除文件,无需提示.不能删除目录! -r 递归的删除目录下的内容,删除文 ...
- 2016CCPC杭州现场赛 B-Bomb /// tarjan缩点
题目大意: 给定n个爆破点的信息 x y r w 表示爆破点位置为 (x,y) 爆破范围是以位置为圆心 半径为r的圆 引爆这个点的代价为w 引爆某个点时 其他位置在该爆破范围内的爆破点也会被引爆 求引 ...
- 最短路(sp
#include<stdio.h> #include<iostream> #include<queue> using namespace std; #define ...
- 初探.Net Core API 网关Ocelot(一)
一.介绍 Ocelot 是基于.NetCore实现的开源的API网关,支持IdentityServer认证.Ocelot具有路由.请求聚合.服务发现.认证.鉴权.限流熔断等功能,并内置了负载均衡器与S ...