MySQL表结构设计之范式化和反范式化对比

 

优点

缺点

范式

1、范式化的更新操作通常比反范式化要快,只需要修改较少数据。

2、范式化的表通常更小,可以更好地放在内存里,所以执行操作会更快。

复杂的查询语句在符合范式的schema上都可能需要至少一次关联,关联表的代价昂贵,也可能使得索引失效

反范式

1、数据都在一张表中,可以避免表关联,最差情况全表扫描。

2、可以设计有效的索引

表格内的冗余较多,删除数据时候会造成表有些有用的信息丢失;更新操作时需要考虑冗余字段的同步,涉及多表更新操作

 

 

 

 

  • 实际开发:事实上,完全的范式化和完全的反范式化schema都是实验室里才有的东西。实际场景中,最常见的反范式化数据的方法是复制或者缓存,在不同的表中存储相同的特定列。
  • 实时计算统计值是非常昂贵的操作,因为要么需要扫描表中的大部分数据,要么查询语句只能在某些特定的索引上才能有效运行,提升性能常用方法:缓存表和汇总表,但前提是允许少量的脏数据或者一定的实时性偏差。

  • 缓存表:对优化和搜索语句使用较多,在同一张表中保存衍生的冗余数据
  • 汇总表:主要用在一些累计、统计、汇总场景
  • 在使用缓存表和汇总表时,必须决定是实时维护还是定期重建。当重建汇总表的时候,需要保证数据在操作时依然可以使用,这就需要通过影子表来进行实现(重命名替换)。操作:

    drop table if exists my_summary_new, my_summary_old;

    create table my_summary_new like my_summary;

    ----- populate test_new as desired

    rename table my_summary to my_summary_old,my_summary_new to my_summary;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/419206.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

11.粘性控件

粘性控件 (对View的自定义)* 应用场景: 未读提醒的清除* 功能实现:> 1. 画静态图 OK> 2. 把静态的数值变成变量(计算得到真实的变量) OK > 3. 不断地修改变量, 重绘界面, 动起来了.> 4. 功能分析:a. 拖拽超出范围,断开, 松手, 消失b. 拖拽超…

前端学习(1704):前端系列javascript之问题解答2和总结

//闭包隐藏数据 function createCache() {const data {} //闭包中的数据 被访问 不被外界访问return {set: function(key, val) {data[key] val},get: function(key) {return data[key];}} } const c createCache(); c.set(a, 100); console.log(c.get(a)); 弹出1,2,3&…

高性能索引设计

索引的优点 减少了服务器需要扫描的数据量帮助服务器避免排序和临时表将随机I/O变成顺序I/O 索引的类型 B-Tree索引 B-TREE通常就意味着里面存储的所有值都是有序的,并且查询的时候,不用全表扫描,而是按照索引结构查找,所以会更…

posix thread线程

1. pthread线程通过调用你提供的某些函数开始。这个“线程函数”应该只有一个void*型参数,并返回系统的类型。2. 通过向pthread_create函数传递线程函数的地址和线程函数调用的参数来参加线程。3. 线程可以通过pthread_self获取自己的ID。4. 除非线程的创建者或者线…

MySQL查询语句优化

慢查询原因 1 从数据库请求不需要的数据 例如业务只需要返回指定的列,sql查询全部列,或者多表关联返回全部列。某些相同数据被重查询多次,可以结合实际业务在初次查询后进行缓存,需要时候从缓存中取出 2 扫描额外的记录行 2 解…

python之装饰器详解

这几天翻看python语法,看到装饰器这里着实卡了一阵,最初认为也就是个函数指针的用法,但仔细研究后发现,不止这么简单。 首先很多资料将装饰器定义为AOP的范畴,也就是Aspect Oriented Programming面向切面编程的概念&am…

“睡服”面试官系列第十六篇之Symbol(建议收藏学习)

目录 1. 概述 2. 作为属性名的 Symbol 3. 实例:消除魔术字符串 4. 属性名的遍历 5. Symbol.for(),Symbol.keyFor() 6. 实例:模块的 Singleton 模式 7. 内置的 Symbol 值 7.1Symbol.hasInstance 7.2Symbol.isConcatSpreadable 7.3Sy…

POST请求传入中文参数,接收端乱码

问题描述&#xff1a;通过post请求调试短信接口发送出去后&#xff0c;客户端无法收到短信&#xff0c;中文内容乱码 追踪过程&#xff1a; 接口采用post请求进行&#xff0c;无法收取短信的接口代码如下&#xff1a; public static String sendPost(String url, Map<Stri…

LeetCode - Container With Most Water

题目&#xff1a; Given n non-negative integers a1, a2, ..., an, where each represents a point at coordinate (i, ai). n vertical lines are drawn such that the two endpoints of line i is at (i, ai) and (i, 0). Find two lines, which together with x-axis forms…

TCP/IP协议模型

1. 数据链路层 作用(1) 实现网卡接口的网络驱动&#xff0c;以处理数据在以太网线等物理媒介上的传输   (2) 网络驱动程序隐藏了不同物理网络的不同电气特性&#xff0c;为上层协议提供一个统一的接口 应用ARP和RARP(Reverse Address Resolve Protocol)即逆地址解析协议&am…

【转】 Pro Android学习笔记(二九):用户界面和控制(17):include和merge

目录(?)[-] xml控件代码重用includexml控件代码重用merge横屏和竖屏landsacpe portraitxml控件代码重用&#xff1a;include 如果我们定义一个控件&#xff0c;需要在不同的layout中重复使用&#xff0c;或者在同一个layout中重复使用&#xff0c;可以采用include的方式。例如…

管理者一定会遇到的那些事

——极客时间——沈剑老师分享有感

Git使用攻略

Git使用攻略 merge&#xff0c;将develop合并到master# 切换到Master分支git checkout master# 将Develop分支合并到master git merge --no-ff develop 切换分支git checkout master 检出代码git checkout master 创建分支git branch newBranch查看本地分支git branch查看远程分…

Java停止线程的方式

1、使用中断标志位 public class StopThreadTest extends Thread {private boolean exit false;Overridepublic void run() {while (!exit) {try {System.out.println("i am running,please wait a moment");Thread.sleep(500);} catch (InterruptedException e) {…

Vim文本编辑器 指令簿(二)

常常处理文本以及常常须要写代码的人&#xff0c;都会有自己比較常常使用的编辑器&#xff0c;本人喜欢用Vim。理由就是Vim编辑器灵活&#xff0c;而且能够达到纯键盘操作&#xff0c;使用纯熟情况下&#xff0c;根本不须要鼠标操作。听起来是不是非常酷的&#xff1f;只是别高…