近期计划写一套书目,也就是关于mysql的优化的。那么首先在博客上写写,然后整理成pdf的文档的形式,当然也期待各位的关注了。对于mysql的优化是一个比較大的话题。可优化的地方也非常多,大致想了一下,能够从这些地方下手。

首先就是硬件层次,包含选择合适的操作系统、选择合适的硬件,然后就是源码层次,只是尽管mysql是开源的,可是可以改动其源码的公司尽管不少,可是也没有那么多,可是我们可以选择更加合适的编译器又一次编译其源码,然后就是设计到表的设计。也就数据库建模。

其次能够考虑使用一些其它技术,比方读写分离和分表技术,或者使用集群技术,这要求我们从总体上去构架。对于详细的内容,我们能够採用设置索引、优化sql查询语句、定期表修复、使用存储过程等等。

这里我们先说说数据库建模这部分,这部分往往和和业务逻辑有关系,通常来说新手都喜欢死扣第三范式或者BC范式。假设更要求完美,可能会死扣第五范式,事实上高手也都是这么一步步过来的,那么我们先介绍一下什么是第三范式。

第一范式就是对属性的原子性约束。也就是说表的列具有原子性,不能再次切割。它的约束性真的非常低。仅仅要数据库是关系型数据库,就会自己主动满足第一范式了,那么哪些可能会不满足第一范式呢?假设我们存储了一个集合。存储了一个数组。那么这就不满足第一范式了,可是对于关系型数据库。不可能出现这样的情况,我们无法向里面存储一个数组。注意,这里说的是存储了一个集合。而不是集合中的元素。

第二范式就是属性全然依赖于主键,举个样例,增加我们创建一个People表。它里面能够写一个字段是身份证号。那么由于每一个人的身份证号都不是不反复的,这个人的信息也会由这个人的身份证号唯一决定,这就能够能够理解为一个主键,这里的身份证号是主键,可是姓名并非主键。由于重名的情况还是挺多的。它的目的是为了防止数据的反复,因此我们使用一个主键来唯一的标识一条记录。

须要注意的是。主键并不一定必须是一个字段,比方说有时候两个信息才干确定一条记录,比方在一个目录以下的文件名称和后缀名这两个才干确定一个唯一的文件名称,我们分开来存放信息的话,这两个字段就构成了它的主键。值得注意的是,我们通经常使用一个数字类型的自增的id来作为主键。但它不是必须的。

第三范式的要求就更加苛刻了,它要求表中不要有冗余数据,那它的规范就是说:不论什么非主键的属性都必须依赖于主键,可是不能传递依赖于主键。

举个超经典的样例,这也是我在学习第三范式的时候的样例。由于它太经典了,我可能一辈子都忘记不了。比方说我建立了一个表。它的字段信息例如以下:(学号。学生姓名,学生所在系名。学生所在系的地址),猛一看这个表也没什么问题。可是它会产生冗余信息。那就是学生所在系的地址这一个属性也是由学号唯一确定的,可是它不是直接依赖的。它是传递依赖的,它直接依赖与系名,而不是学生的学号,因此,我们会发现,对于不同的学号,会导致存储非常多一样的系名,这就是所谓的冗余信息。

那么我们怎么改动呢,答案就是分表。注意。我们还必须遵循第二范式,我们能够添加一个系的编号这么一个字段。即第一个表信息(学号,学生姓名,所在系编号)。第二个表(系编号。系名,系的地址),这么一来,我们就不会存储冗余信息了,这就是第三范式所带来的效果。

除了第三范式之外,另一个也非常重要,叫做BC范式,也就是著名的巴斯-科德范式,它的要求是什么呢?它是对主键的要求,也就是主码,它要求,主码的不论什么一个真自己都不能唯一的确定这个主码,什么意思。比方说我把学生的身份证号和学号这两个合起来 设计为主键,它并不违反第三范式,可是它违反了BC范式。原因何在呢?由于在一个学校里,不论什么两个学生的身份证号和学号都不同样,也就是说,我们使用学号作为主键或者身份证号作为主键都能够,可是使用这两个一起作为主键,不是必需。

我不知道读者是否晕了,大体思路就是这样。事实上这些范式都是人做出来的。也不难理解。我这里并没有引入太多的逻辑符合和专业术语。算是用比較寻常的语言来叙述,也是希望更好理解,假设您有什么问题,能够在以下留言给我。

辛星让mysql跑的更快第一节之优化的方向和数据库建模的更多相关文章

  1. 让MySQL数据库跑的更快的7个优化建议!

    随着容量和负载的增加,MySQL 的性能会日趋缓慢.这里有七点建议能够保证 MySQL 的平稳运行. 性能是我们衡量应用的一种方式,而应用性能的一项指标就是用户体验,也就是平时我们常说的:“用户需要等 ...

  2. 让DB2跑得更快——DB2内部解析与性能优化

    让DB2跑得更快——DB2内部解析与性能优化 (DB2数据库领域的精彩强音,DB2技巧精髓的热心分享,资深数据库专家牛新庄.干毅民.成孜论.唐志刚联袂推荐!)  洪烨著 2013年10月出版 定价:7 ...

  3. UOJ 【UR #5】怎样跑得更快

    [UOJ#62]怎样跑得更快 题面 这个题让人有高斯消元的冲动,但肯定是不行的. 这个题算是莫比乌斯反演的一个非常巧妙的应用(不看题解不会做). 套路1: 因为\(b(i)\)能表达成一系列\(x(i ...

  4. 【UOJ#62】【UR #5】怎样跑得更快(莫比乌斯反演)

    [UOJ#62][UR #5]怎样跑得更快(莫比乌斯反演) 题面 UOJ 题解 众所周知,\(lcm(i,j)=\frac{ij}{gcd(i,j)}\),于是原式就变成了: \[\sum_{j=1} ...

  5. 「UR#5」怎样跑得更快

    「UR#5」怎样跑得更快 膜这个您就会了 下面是复读机mangoyang 我们要求 \[ \sum_{j=1}^n \gcd(i,j)^{c-d} j^d x_j=\frac{b_i}{i^d} \] ...

  6. 面试官:如何写出让 CPU 跑得更快的代码?

    前言 代码都是由 CPU 跑起来的,我们代码写的好与坏就决定了 CPU 的执行效率,特别是在编写计算密集型的程序,更要注重 CPU 的执行效率,否则将会大大影响系统性能. CPU 内部嵌入了 CPU ...

  7. 辛星解读mysql的用户管理

    可能做开发的多半不太关注这方面,可是要说到做运维.那就不能不关注了.由于我们都知道,root的权限太大了.不是随便能用的.我们平时最好用一些比較低的权限的用户.这样会让我们的安全性大大提高,也能防止我 ...

  8. [翻译] 5点建议,让iOS程序跑得更快

      [文章原地址]http://mobile.tutsplus.com/tutorials/iphone/ios-quick-tip-5-tips-to-increase-app-performanc ...

  9. 让你的 Node.js 应用跑得更快的 10 个技巧(转)

    Node.js 受益于它的事件驱动和异步的特征,已经很快了.但是,在现代网络中只是快是不行的.如果你打算用 Node.js 开发你的下一个Web 应用的话,那么你就应该无所不用其极,让你的应用更快,异 ...

随机推荐

  1. Python __call__内置函数的作用和用法

    开学了进入了实验室,需要协助大师兄做事,主要是OpenStack中的代码解析,但是涉及很多python高级用法,一时间有点麻烦,在做项目的同时慢慢更新博客.这次先写一下__call__的用法,因为经常 ...

  2. java中集合里的泛型

    import java.util.ArrayList;/* * 泛型 : java jdk1.5新特性. * 泛型的好处 : * 1.将运行时的错诶提前到编译时. * 2.避免无谓的强制类型转换. * ...

  3. RobotFramework操作浏览器滚动条

    RobotFramework操作浏览器滚动条 (2016-12-21 11:52:43) 转载▼ 标签: selenium it 分类: 自动化测试 其实只要是用多了selenium+webdrive ...

  4. [COGS2479 && COGS2639]高维偏序(CDQ分治,bitset)

    COGS2479:四维偏序. CDQ套CDQ CDQ:对a分治,对b排序,再对a打标记,然后执行CDQ2 CDQ2:对b分治,对c归并排序,对d树状数组. #include<cstdio> ...

  5. 【找规律】URAL - 2065 - Different Sums

    就让0出现得尽可能多嘛……大概感受一下就是这样…… 0 0 ... 0 0 0 0 4 -4 3 -3 2 -2 1 -1 #include<cstdio> using namespace ...

  6. 1.3(Mybatis学习笔记)动态SQL

    一.<if> 使用<if>可以根据具体情况来拼接SQL语句,使其更加灵活更加适应我们的需求. <if>的标签体中是需要拼接的语句,满足条件才会将其进行拼接. < ...

  7. TZOJ 数据结构实验:单链表元素插入

    描述 实现函数CreateHeader用于创建空链表,实现Insert函数并调用它完成带头节点链表的创建. 部分代码已经给出,请补充完整,提交时请勿包含已经给出的代码. void PrintLinkL ...

  8. 利用Java位运算符,完成Unsigned转换(无符号)

    方案二:利用Java位运算符,完成Unsigned转换. 正常情况下,Java提供的数据类型是有符号signed类型的,可以通过位运算的方式得到它们相对应的无符号值,参见几个方法中的代码: publi ...

  9. 【mybatis】mybatis 查询mysql 长编码的查询使用 正向查询和反向查询,避免数据库关系 递归查询的 解决方案

    长编码存储规则为: 父级长编码+":"+自己的uid 例如最顶级GoodsType-->uid = 123  --->longCode= 123: 子级GoodsTyp ...

  10. 怎样在 Mac 上打开 ~_Library 文件夹

    怎样在 Mac 上打开 ~_Library 文件夹 听语音 浏览:17674 | 更新:2015-05-20 10:51 | 标签:文件夹 Mac 上的~/Library 文件夹是默认为隐藏的.因为苹 ...