MySQL数据库小知识总结

**

MySQL数据库小知识总结

**

**

1 MySQL事务的基本特性和含义

**

数据库的事务(英文名:Transanction)能够正确执行的四个基本要素。原子性(Atomicity)、一致性(Correspondence)、隔离性(Isolation)、持久性(Durability),通常简称为ACID
原子性:数据库事务的原子性是指在整个事务中的所有操作,只有两个状态,一种是全部完成,另一种是全部不完成。其是不可能停滞在中间的某一个环节。若事务在执行过程中发生错误时,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。
一致性:指的是在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏。
隔离性:指的是事务是在隔离状态执行的,使它们好像是系统在给定时间内执行的唯一操作。如果有两个事务,运行在相同的时间内,执行相同的功能,事务的隔离性将确保每一事务在系统中认为只有该事务在使用系统。这种属性有时称为串行化,为了防止事务操作间的混淆,必须串行化或序列化请求,使得在同一时间仅有一个请求用于同一数据。
持久性:是指某个事务执行完成后,该事务所对数据库所做的更改是持久的保存在数据库之中,并不会被回滚。

**

2 视图的作用,视图可以被更改吗?

**
视图是虚拟的表,它与包含数据的表是不一样的,视图是为了在使用的时候进行动态检索数据的查询;不包含任何列或数据。使用视图可以简化复杂的SQL语句的操作,隐藏具体的细节和保护数据;视图创建后,可以使用与表相同的方式利用它们。
视图是不能够被索引的,也不能有关联的触发器或默认值,如果视图本身内有order by 则对视图再次order by将被覆盖。
创建视图:create view XXX as XXXXXXX;
对于某些视图,比如未使用联结子查询,分组聚集函数Distinct Union等,是可以对其更新的,对视图的更新将对基表进行更新;但是视图主要用于简化检索,保护数据,并不用于更新,而且大部分视图都不可以更新。

**

3 drop,delete与truncate的区别

**
drop直接删掉表; truncate删除表中数据,再插入时自增长id又从1开始; delete删除表中数据,可以加where字句进行有条件的删除。
(1)delete语句执行删除的过程是每次从表中删除一行,并且同时将该行的删除操作作为事务记录在日志中保存以便进行进行回滚操作。truncate table则一次性地从表中删除所有的数据并不把单独的删除操作记录记入日志保存,删除的行是不能恢复的。并且在删除的过程中不会激活与表有关的删除触发器,执行速度快。
(2)关于表和索引所占空间。当表被truncate 后,这个表和索引所占用的空间会恢复到初始大小,而delete操作不会减少表或索引所占用的空间。drop语句将表所占用的空间全释放掉。
(3)应用范围:truncate 只能对table;delete可以是table和view。
(4)truncatedelete只删除数据,而drop则删除整个表(结构和数据)。
(5) delete语句为DML(data maintain Language),这个操作会被放到 rollback segment中,事务提交后才生效。如果有相应的 tigger,执行的时候将被触发。 truncate、drop是DLL(data define language),操作立即生效,原数据不放到 rollback segment中,不能回滚。
(6)Truncate table 表速度快,而且效率高。因为truncate table 在功能上与不带 where子句的 DELETE 语句相同:二者均删除表中的全部行。但 Truncate tabledelete 速度快,且使用的系统和事务日志资源少。delete 语句每次删除一行,并在事务日志中为所删除的每行记录一项。Truncate table 通过释放存储表数据所用的数据页来删除数据,并且只在事务日志中记录页的释放。
(7)对于由 FOREIGN KEY 约束引用的表,不能使用 Truncate table ,而应使用不带 where 子句的 delete 语句。由于 Truncate table 不记录在日志中,所以它不能激活触发器。

**

4 数据库索引

**
数据库索引是数据库管理系统中一个排序的数据结构,以协助快速查询、更新数据库表中数据。其的实现通常使用B树及其变种B+树。
在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引。
为表设置索引要付出代价的:一是增加了数据库的存储空间,二是在插入和修改数据时要花费较多的时间(因为索引也要随之变动)。
创建索引可以大大提高系统的性能。
第一,通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。
第二,可以大大加快数据的检索速度,这也是创建索引的最主要的原因。
第三,可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。
第四,在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。
第五,通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。
也许会有人要问:增加索引有如此多的优点,为什么不对表中的每一个列创建一个索引呢?因为,增加索引也有许多不利的方面。
第一,创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。
第二,索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大。
第三,当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。
**

5 数据库范式

**
1 第一范式(1NF)
在任何一个关系数据库中,第一范式(1NF)是对关系模式的基本要求,不满足第一范式(1NF)的数据库就不是关系数据库。
所谓第一范式(1NF)是指数据库表的每一列都是不可分割的基本数据项,同一列中不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性。如果出现重复的属性,就可能需要定义一个新的实体,新的实体由重复的属性构成,新实体与原实体之间为一对多关系。在第一范式(1NF)中表的每一行只包含一个实例的信息。简而言之,第一范式就是无重复的列。
2 第二范式(2NF)
第二范式(2NF)是在第一范式(1NF)的基础上建立起来的,即满足第二范式(2NF)必须先满足第一范式(1NF)。第二范式(2NF)要求数据库表中的每个实例或行必须可以被惟一地区分。为实现区分通常需要为表加上一个列,以存储各个实例的惟一标识。这个惟一属性列被称为主关键字或主键、主码。
第二范式(2NF)要求实体的属性完全依赖于主关键字。所谓完全依赖是指不能存在仅依赖主关键字一部分的属性,如果存在,那么这个属性和主关键字的这一部分应该分离出来形成一个新的实体,新实体与原实体之间是一对多的关系。为实现区分通常需要为表加上一个列,以存储各个实例的惟一标识。简而言之,第二范式就是非主属性非部分依赖于主关键字。
3 第三范式(3NF)
满足第三范式(3NF)必须先满足第二范式(2NF)。简而言之,第三范式(3NF)要求一个数据库表中不包含已在其它表中已包含的非主关键字信息。例如,存在一个部门信息表,其中每个部门有部门编号(dept_id)、部门名称、部门简介等信息。那么在员工信息表中列出部门编号后就不能再将部门名称、部门简介等与部门有关的信息再加入员工信息表中。如果不存在部门信息表,则根据第三范式(3NF)也应该构建它,否则就会有大量的数据冗余。简而言之,第三范式就是属性不依赖于其它非主属性。
**

6数据库优化的思路

**
1.SQL语句优化:(1)应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。(2)应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描。(3)很多时候用 exists 代替 in 是一个好的选择。(4)用Where子句替换HAVING 子句 因为HAVING 只会在检索出所有记录之后才对结果集进行过滤。
2.对索引进行优化:(1)通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。(2)通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。
3.数据库结构优化:(1)范式优化: 比如消除冗余(节省空间)。(2)反范式优化:比如适当加冗余等(减少join)。(3)拆分表: 分区将数据在物理上分隔开,不同分区的数据可以制定保存在处于不同磁盘上的数据文件里。这样,当对这个表进行查询时,只需要在表分区中进行扫描,而不必进行全表扫描,明显缩短了查询时间,另外处于不同磁盘的分区也将对这个表的数据传输分散在不同的磁盘I/O,一个精心设置的分区可以将数据传输对磁盘I/O竞争均匀地分散开。对数据量大的时时表可采取此方法。可按月自动建表分区。
4 服务器硬件优化成本大!!!
**

7 存储过程与触发器的区别

**
触发器存储过程非常相似,触发器也是SQL语句集,两者唯一的区别是触发器不能用EXECUTE语句调用,而是在用户执行Transact-SQL语句时自动触发(激活)执行。触发器是在一个修改了指定表中的数据时执行的存储过程。
通常通过创建触发器来强制实现不同表中的逻辑相关数据的引用完整性和一致性。由于用户不能绕过触发器,所以可以用它来强制实施复杂的业务规则,以确保数据的完整性。
触发器不同于存储过程,触发器主要是通过事件执行触发而被执行的,而存储过程可以通过存储过程名称名字而直接调用。当对某一表进行诸如UPDATE、INSERT、DELETE这些操作时,SQLSERVER就会自动执行触发器所定义的SQL语句,从而确保对数据的处理必须符合这些SQL语句所定义的规则。

你可能感兴趣的:(MYSQL学习,MYSQL学习总结)