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上的语言,如 ...
随机推荐
- JAVA去除抖音视频的水印源码!!!
@PostMapping("geturl") public DataResponse decodeDouiyin(@RequestBody DouyinRequest req ) ...
- QueryList 内容过滤
<?php require 'vendor/autoload.php'; use QL\QueryList; $html =<<<STR <div id="de ...
- [学习笔记] $Maximum$ $Minimum$ $identity$
\(Maximum\) \(Minimum\) \(identity\)学习笔记 比较好玩的一个科技.具体来说就是\(max(a,b)=a+b-min(a,b)\),这个式子是比较显然的,但是这个可以 ...
- NX二次开发-UFUN点收集器UF_UI_select_point_collection
#include <uf.h> #include <uf_ui.h> UF_initialize(); //点收集器 char sMessage[] = "点收集器& ...
- NX二次开发-算法篇-冒泡排序(例子:遍历所有点并排序)
NX9+VS2012 #include <uf.h> #include <uf_ui.h> #include <uf_curve.h> #include <u ...
- [Android开发常见问题-4] RunTime.exec()如何以root权限执行多条指令?
转:http://blog.csdn.net/alexander_xfl/article/details/9150971 RunTime.exec()这个接口可以说是给我们开发者提供了一个很好的直观操 ...
- 10.RabbitMQ Fanout类型交换机
Fanout类型交换机忽略Routing Key,它将消息传递到所有与它绑定的队列上. Producer.java package com.test.fanout; import co ...
- 剑指offer——02二维数组中的查找
题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数 ...
- Redis事务,持久化,哨兵机制
1 Redis事务 基本事务指令 Redis提供了一定的事务支持,可以保证一组操作原子执行不被打断,但是如果执行中出现错误,事务不能回滚,Redis未提供回滚支持. multi 开启事务 exec 执 ...
- IK分词器 原理分析 源码解析
IK分词器在是一款 基于词典和规则 的中文分词器.本文讲解的IK分词器是独立于elasticsearch.Lucene.solr,可以直接用在java代码中的部分.关于如何开发es分词插件,后续会有文 ...