数据库范式及MYSQL优化整体思路

一、数据库范式

  为了建立冗余较小、结构合理的数据库,设计数据库时必须遵循一定的规则。在关系型数据库中这种规则就称为范式。范式是符合某一种设计要求的总结。要想设计一个结构合理的关系型数据库,必须满足一定的范式。

  1.1、第一范式(1NF:每一列不可包含多个值)

  所谓第一范式(1NF)是指数据库表的每一列都是不可分割的基本数据项,同一列中不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性。如果出现重复的属性,就可能需要定义一个新的实体,新的实体由重复的属性构成,新实体与原实体之间为一对多关系。在第一范式(1NF)中表的每一行只包含一个实例的信息。

  在任何一个关系数据库中,第一范式(1NF)是对关系模式的基本要求,不满足第一范式(1NF)的数据库就不是关系数据库。

  1.2、第二范式(2NF:非主属性部分依赖于主关键字)

  第二范式(2NF)是在第一范式(1NF)的基础上建立起来的,即满足第二范式(2NF)必须先满足第一范式(1NF)。第二范式(2NF)要求数据库表中的每个实例或行必须可以被唯一地区分。为实现区分通常需要为表加上一个列,以存储各个实例的唯一标识。

  第二范式(2NF)要求实体的属性完全依赖于主关键字。所谓完全依赖是指不能存在仅依赖主关键字一部分的属性,如果存在,那么这个属性和主关键字的这一部分应该分离出来形成一个新的实体,新实体与原实体之间是一对多的关系。为实现区分通常需要为表加上一个列,以存储各个实例的唯一标识。简而言之,第二范式就是非主属性部分依赖于主关键字。

  1.3、第三范式(3NF:属性不依赖于其它非主属性)

  满足第三范式(3NF)必须先满足第二范式(2NF)。简而言之,第三范式(3NF)要求一个数据库表中不包含已在其它表中已包含的非主关键字信息。例如,存在一个部门信息表,其中每个部门有部门编号、部门名称、部门简介等信息。那么在员工信息表中列出部门编号后就不能再将部门名称、部门简介等与部门有关的信息再加入员工信息表中。如果不存在部门信息表,则根据第三范式(3NF)也应该构建它,否则就会有大量的数据冗余。简而言之,第三范式就是属性不依赖于其它非主属性。

  1.4、反三范式(反3NF:为了性能,增加冗余)

  3NF提出目的是为了降低冗余,减少不必要的存储,这对于存储设备昂贵的过去是很有必要的,但是随着存储设备的降价以及人们对性能的不断提高,又有人提出反三范式。

  所谓反三范式就是为了性能,增加冗余。以部门信息表为例,每个部门有部门编号、部门名称、部门简介等信息,按照3NF的要求,为了避免冗余,我们在员工表中就不应该加入部门名称、部门简介等部门有关信息,带来的代价是每次都要查询两次数据库。反三范式允许我们冗余重要信息到员工表中,例如部门名称,这样我们每次取员工信息时就能直接取出部门名称,不需要查询两次数据库,提升了程序性能。

  二、MYSQL优化整体思路

  MYSQL优化首先应该定位问题,可能导致MYSQL低性能的原因有:业务逻辑过多的查询、表结构不合理、sql语句优化以及硬件优化,从优化效果来看,这四个优化点的优化效果依次降低:理清业务逻辑能够帮助我们避免不必要的查询,合理设计表结构也能帮助我们少查询数据库。对于sql语句优化,我们可以先使用慢查询日志定位慢查询,然后针对该查询进行优化,最常见且最有效的优化范式就是增加合理的索引,这个在上篇博客已经讲解,本篇博客将讲解其他一些优化手段或者注意点。

  2.1、谨慎使用TEXT/BLOB类型

  当列类型是TEXT或者BLOB时,我们应该特别注意,因为当选择的字段有 text/blob 类型的时候,无法创建内存表,只能创建硬盘临时表,而硬盘临时表的性能比内存表的性能差,所以如果非要使用TEXT/BLOB类型,应该单独建表,不要把TEXT/BLOB类型与核心属性混合在一张表中。对此,做一个实验如下:


//创建数据表

create table t1 (

num int,

intro text(1000)

);

//插入数据

insert into t1 values (3,'this is USA') , (4,'China');

//查询临时表创建情况

//注意,这里Created_tmp_disk_tables=4,Created_tmp_tables=10

mysql> show status like '%tmp%';

+-------------------------+-------+

| Variable_name           | Value |

+-------------------------+-------+

| Created_tmp_disk_tables | 4     |

| Created_tmp_files       | 9     |

| Created_tmp_tables      | 10    |

+-------------------------+-------+

//使用group by查询数据

mysql> select * from t1 group by num;

+------+-------------+

| num  | intro       |

+------+-------------+

|    3 | this is USA |

|    4 | China       |

+------+-------------+

2 rows in set (0.05 sec)

//再次查询临时表创建情况

//现在,Created_tmp_disk_tables=5,Created_tmp_tables=11

mysql> show status like '%tmp%';

+-------------------------+-------+

| Variable_name           | Value |

+-------------------------+-------+

| Created_tmp_disk_tables | 5     |

| Created_tmp_files       | 9     |

| Created_tmp_tables      | 11    |

+-------------------------+-------+

最新内容请见作者的GitHub页:http://qaseven.github.io/

时间: 2024-07-31 17:46:11

数据库范式及MYSQL优化整体思路的相关文章

MySQL数据库21条最佳性能优化经验_Mysql

今天,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显.关于数据库的性能,这并不只是DBA才需要担心的事,而这更是我们程序员需要去关注的事情. 当我们去设计数据库表结构,对操作数据库时(尤其是查表时的SQL语句),我们都需要注意数据操作的性能.这里,我们不会讲过多的SQL语句的优化,而只是针对MySQL这一Web应用最多的数据库.希望下面的这些优化技巧对你有用. 1. 为查询缓存优化你的查询 大多数的MySQL服务器都开启了查询缓存.这是提高性最有效的方法之一,而且这是被M

网站优化整体的思路和流程介绍

中介交易 SEO诊断 淘宝客 云主机 技术大厅 众所周知,网站优化的过程其实就是一个权重累积的过程,作为一个优化人员笔者认为用户体验是我们进行网站优化之前必须经过的第一道关,其实说到用户体验最简单地理解为,网站的界面设计,网站文章质量,网站访问速度等等,我们不仅仅要兼顾我们网站用户的需求对于搜索引擎蜘蛛的关注也是要进行分析和研究的,好了闲话短续笔者从以下几个方面和大家详细讨论以下. 第一,网页设计师用户体验优化的第一关.我们知道网站上线之前,网站设计这个部分是网站用户体验优化最为关键的环节之一,

MySQL优化全攻略-相关数据库命令

我们讨论的是数据库性能优化的另一方面,即运用数据库服务器内建的工具辅助性能分析和优化. ▲ SHOW 执行下面这个命令可以了解服务器的运行状态:mysql >show status; 该命令将显示出一长列状态变量及其对应的值,其中包括:被中止访问的用户数量,被中止的连接数量,尝试连接的次数,并发连接数量最大值,以及其他许多有用的信息.这些信息对于确定系统问题和效率低下的原因是十分有用的. SHOW命令除了能够显示出MySQL服务器整体状态信息之外,它还能够显示出有关日志文件.指定数据库.表.索引

HTAP数据库——HybirdDB for MySQL产品和典型方案介绍

随着DT时代的到来,企业占有的数据越来越多,其规模可能达到上百TB甚至PB级,如何以合理的成本管理并维护这样一个数据库也成为各个企业IT管理中的核心问题.HybirdDB for MySQL是基于HTAP资源的数据库,同时支持OLTP,在一份数据上做事务,又支持实时分析.10月12日的云栖大会·HTAP技术专场中,阿里云产品专家陈琢分享了阿里云自研的HTAP数据库,并重点分享了相关技术及实现.如何借助HTAP技术解决业务痛点等内容. 本文分享的内容主要包括五个部分,首先是阿里云数据库产品团队的情

MySQL 第九篇:Mysql 与 ORACLE 开发差异、Mysql 优化

我把MySQL的内容整理成9篇博客,学完这9篇博客虽不能说能成为大神,但是应付一般中小企业的开发已经足够了,有疑问或建议的欢迎留言讨论. Mysql 与 ORACLE 开发差异 一. 常用的基本数据类型对比 二. 常用 SQL函数以及其它语法差异 Mysql 优化 一. 数据库设计 a) 适当的违反三大范式. b) 适当建立索引. c) 对表进行水平划分(按照一个周期对表数据进行拆分). d) 对表进行垂直划分(对字段内容较长的字段进行拆分到一个新表). e) 选择合适的字段类型.能占用字节小的

【JAVA秒会技术之玩转SQL】MySQL优化技术(一)

MySQL优化技术(一)         开发的路上,总会碰到一些老系统,越用越慢."慢"的原因也许有很多,但是,博主个人觉得,数据库的设计和sql语句写的好坏,对系统效率的影响是最直接,最显而易见的!所以,学习一下MySQL的优化,还是很有必要的.当然,博主能力有限,没那么多经验,更多的是"道听途说"和"纸上谈兵".如有不正之处,望大神开后给予指正,不胜感激! (一)MySQL优化技术概述 ①表的设计合理化(符合3NF,即符合"三范式

微博MySQL优化之路 - 肖鹏

编辑手记:MySQL作为左手欢迎的开源数据库,一直是广大数据库技术爱好者所关注的.为了给大家提供更好的学习分享平台,我们将会在后续适当分享MySQL的内容.感谢广大朋友们的支持. 肖鹏老师对于开源数据库尤其是MySQL的研究特别深入,今天我们来一起听他分享自己对MySQL数据库的优化经验! 作者简介 肖鹏 微博研发中心数据库技术负责人,主要负责微博数据库(MySQL/Reids/HBase/Memcached)相关的业务保障,性能优化,架构设计以及周边的自动化系统建设.10年互联网数据库架构和管

mysql 优化日记_Mysql

同时在线访问量继续增大 对于1G内存的服务器明显感觉到吃力严重时甚至每天都会死机 或者时不时的服务器卡一下 这个问题曾经困扰了我半个多月MySQL使用是很具伸缩性的算法,因此你通常能用很少的内存运行或给MySQL更多的被存以得到更好的性能. 安装好mysql后,配制文件应该在/usr/local/mysql/share/mysql目录中,配制文件有几个,有my-huge.cnf my-medium.cnf my-large.cnf my-small.cnf,不同的流量的网站和不同配制的服务器环境

MySQL优化配置文件my.ini(discuz论坛)_Mysql

在Apache, PHP, MySQL的体系架构中,MySQL对于性能的影响最大,也是关键的核心部分.对于Discuz!论坛程序也是如此,MySQL的设置是否合理优化,直接影响到论坛的速度和承载量!同时,MySQL也是优化难度最大的一个部分,不但需要理解一些MySQL专业知识,同时还需要长时间的观察统计并且根据经验进行判断,然后设置合理的参数. 下面我们了解一下MySQL优化的一些基础,MySQL的优化我分为两个部分,一是服务器物理硬件的优化,二是MySQL自身(my.cnf)的优化. 一.服务