MySQL 面试基础

一、如何登录my sql数据库

mysql -u username -pnode

二、如何开启/关闭mysql服务

service mysql start/stopmysql

三、查看mysql的状态

service mysql statuslinux

四、如何显示数全部数据库

show databases面试

五、如何获取表内全部字段对象的名称和类型

describe table_name;算法

六、MYSQL支持事务吗?

在缺省模式下,MYSQL是autocommit模式的,全部的数据库更新操做都会即时提交,因此在缺省状况下,mysql是不支持事务的。
可是若是你的MYSQL表类型是使用InnoDB Tables 或 BDB tables的话,你的MYSQL就可使用事务处理,使用SET AUTOCOMMIT=0就可使MYSQL容许在非autocommit模式,在非autocommit模式下,你必须使用COMMIT来提交你的更改,或者用ROLLBACK来回滚你的更改。
示例以下:
START TRANSACTION;
SELECT @A:=SUM(salary) FROM table1 WHERE type=1;
UPDATE table2 SET summmary=@A WHERE type=1;
COMMIT;sql

七、MYSQL相比于其余数据库有哪些特色?

MySQL是一个小型关系型数据库管理系统,开发者为瑞典MySQL AB公司,如今已经被Sun公司收购,支持FreeBSD、Linux、MAC、Windows等多种操做系统与其余的大型数据库例如OracleDB2、SQL Server等相比功能稍弱一些
一、能够处理拥有上千万条记录的大型数据
二、支持常见的SQL语句规范
三、可移植行高,安装简单小巧
四、良好的运行效率,有丰富信息的网络支持
五、调试、管理,优化简单(相对其余大型数据库)数据库

八、varchar和char的区别

Char是一种固定长度的类型,varchar是一种可变长度的类型安全

九、数据库事物有哪几种?

隔离性、持续性、一致性、原子性服务器

十、请简洁地描述下MySQL中InnoDB支持的四种事务隔离级别名称,以及逐级之间的区别?

SQL标准定义的四个隔离级别为:
read uncommited:读取未提交内容
read committed:读取提交内容
repeatable read:可重读
serializable:可串行化
详细解释以下:
Read Uncommitted(读取未提交内容)
在该隔离级别,全部事务均可以看到其余未提交事务的执行结果。本隔离级别不多用于实际应用,由于它的性能也不比其余级别好多少。读取未提交的数据,也被称之为脏读(Dirty Read)。
Read Committed(读取提交内容)
这是大多数数据库系统的默认隔离级别(但不是MySQL默认的)。它知足了隔离的简单定义:一个事务只能看见已经提交事务所作的改变。这种隔离级别也支持所谓的不可重复读(Nonrepeatable Read),由于同一事务的其余实例在该实例处理其间可能会有新的commit,因此同一select可能返回不一样结果。
Repeatable Read(可重读)
这是MySQL的默认事务隔离级别,它确保同一事务的多个实例在并发读取数据时,会看到一样的数据行。不过理论上,这会致使另外一个棘手的问题:幻读(Phantom Read)。简单的说,幻读指当用户读取某一范围的数据行时,另外一个事务又在该范围内插入了新行,当用户再读取该范围的数据行时,会发现有新的“幻影” 行。InnoDB和Falcon存储引擎经过多版本并发控制(MVCC,Multiversion Concurrency Control 间隙锁)机制解决了该问题。注:其实多版本只是解决不可重复读问题,而加上间隙锁(也就是它这里所谓的并发控制)才解决了幻读问题。
Serializable(可串行化)
这是最高的隔离级别,它经过强制事务排序,使之不可能相互冲突,从而解决幻读问题。简言之,它是在每一个读的数据行上加上共享锁。在这个级别,可能致使大量的超时现象和锁竞争。
对于不一样的事务,采用不一样的隔离级别分别有不一样的结果。不一样的隔离级别有不一样的现象。主要有下面3种如今:
一、脏读(dirty read):一个事务能够读取另外一个还没有提交事务的修改数据。
二、非重复读(nonrepeatable read):在同一个事务中,同一个查询在T1时间读取某一行,在T2时间从新读取这一行时候,这一行的数据已经发生修改,可能被更新了(update),也可能被删除了(delete)。
三、幻像读(phantom read):在同一事务中,同一查询屡次进行时候,因为其余插入操做(insert)的事务提交,致使每次返回不一样的结果集。
不一样的隔离级别有不一样的现象,并有不一样的锁定/并发机制,隔离级别越高,数据库的并发性就越差,4种事务隔离级别分别表现的现象以下表:
这里写图片描述网络

十一、mysql数据库引擎MyISAM和InnoDB的区别

这里写图片描述

十二、mysql有关权限的表都有哪几个

MySQL服务器经过权限表来控制用户对数据库的访问,权限表存放在mysql数据库里,由mysql_install_db脚本初始化。这些权限表分别user,db,table_priv,columns_priv和host。下面分别介绍一下这些表的结构和内容:
user权限表:记录容许链接到服务器的用户账号信息,里面的权限是全局级的。
db权限表:记录各个账号在各个数据库上的操做权限。
table_priv权限表:记录数据表级的操做权限。
columns_priv权限表:记录数据列级的操做权限。
host权限表:配合db权限表对给定主机上数据库级操做权限做更细致的控制。这个权限表不受GRANT和REVOKE语句的影响。

1三、mysql存储引擎有哪些?如何修改mysql存储引擎?

MyISAM indexed sequential access method (有索引的顺序访问方法)
MyISAM 具备检查和修复表格的大多数工具。表格能够被压缩,并且支持全文收索
不是事务安全的,并且不支持外键。
MEMORY 也是之前的(HEAP) 该类型表存储在内存中,表的索引是哈希分布的。
merge 这些表为了查询目的,把myisam 表集合做为单个表,所以你能够在某些操做系统中避开最大文件大小的限制。
archive 这种类型的表只支持,insert ,select 不支持delete,update,replace ,不使用索引。
csv 这些表保存在服务器的单个文件中,它包含了用逗号间隔的数据。

innodb 这种表是事务安全的。提供了commit(提交) rollback(实务回滚)支持外键,比myisam慢。
修改mysql存储引擎alter table tablename type = innodb;

1四、MYSQL 数据表修复及数据恢复面试题

MYSQL数据表在什么状况下容易损坏?
服务器忽然断电致使数据文件损坏。
强制关机,没有先关闭mysql 服务等。 数据表损坏后的主要现象是什么?
从表中选择数据之时,获得以下错误:Incorrect key file for table: ‘…’. Try to repair it
查询不能在表中找到行或返回不彻底的数据。
Error: Table ‘p’ is marked as crashed and should be repaired 。
打开表失败: Can’t open file: ‘×××.MYI’ (errno: 145) 。 数据表损坏的修复方式有哪些?
使用 myisamchk 来修复,具体步骤:
1)修复前将mysql服务中止。
2)打开命令行方式,而后进入到mysql的/bin目录。
3)执行myisamchk –recover 数据库所在路径/*.MYI
使用repair table 或者 OPTIMIZE table命令来修复,REPAIR TABLE table_name 修复表 OPTIMIZE TABLE table_name 优化表 REPAIR TABLE 用于修复被破坏的表。
OPTIMIZE TABLE 用于回收闲置的数据库空间,当表上的数据行被删除时,所占据的磁盘空间并无当即被回收,使用了OPTIMIZE TABLE命令后这些空间将被回收,而且对磁盘上的数据行进行重排(注意:是磁盘上,而非数据库)

1五、MYSQL数据库服务器性能分析的方法命令有哪些?

Show status
一些值得监控的变量值:
Bytes_received和Bytes_sent
和服务器之间来往的流量。
Com_*服务器正在执行的命令。
Created_*在查询执行期限间建立的临时表和文件。
Handler_*存储引擎操做。
Select_*不一样类型的联接执行计划。
Sort_*几种排序信息。
Show session status like ‘Select’;
Show profiles
SET profiling=1;
Show profiles\G
Show profile;

1六、 mysql里记录货币用什么字段类型好

NUMERIC和DECIMAL类型被MySQL实现为一样的类型,这在SQL92标准容许。他们被用于保存值,该值的准确精度是极其重要的值,例如与金钱有关的数据。当声明一个类是这些类型之一时,精度和规模的能被(而且一般是)指定;例如:
salary DECIMAL(9,2)
在这个例子中,9(precision)表明将被用于存储值的总的小数位数,而2(scale)表明将被用于存储小数点后的位数。所以,在这种状况下,能被存储在salary列中的值的范围是从-9999999.99到9999999.99。在ANSI/ISO SQL92中,句法DECIMAL(p)等价于DECIMAL(p,0)。一样,句法DECIMAL等价于DECIMAL(p,0),这里实现被容许决定值p。MySQL当前不支持DECIMAL/NUMERIC数据类型的这些变种形式的任一种。这通常说来不是一个严重的问题,由于这些类型的主要益处得自于明显地控制精度和规模的能力。
DECIMAL和NUMERIC值做为字符串存储,而不是做为二进制浮点数,以便保存那些值的小数精度。一个字符用于值的每一位、小数点(若是scale>0)和“-”符号(对于负值)。若是scale是0,DECIMAL和NUMERIC值不包含小数点或小数部分。
DECIMAL和NUMERIC值得最大的范围与DOUBLE同样,可是对于一个给定的DECIMAL或NUMERIC列,实际的范围可由制由给定列的precision或scale限制。当这样的列赋给了小数点后面的位超过指定scale所容许的位的值,该值根据scale四舍五入。当一个DECIMAL或NUMERIC列被赋给了其大小超过指定(或缺省的)precision和scale隐含的范围的值,MySQL存储表示那个范围的相应的端点值。

 

 

 

2.数据库事务的四个特性及含义

 

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

3.视图的做用,视图能够更改么?

视图是虚拟的表,与包含数据的表不同,视图只包含使用时动态检索数据的查询;不包含任何列或数据。使用视图能够简化复杂的sql操做,隐藏具体的细节,保护数据;视图建立后,可使用与表相同的方式利用它们。
视图不能被索引,也不能有关联的触发器或默认值,若是视图自己内有order by 则对视图再次order by将被覆盖。
建立视图:create view XXX as XXXXXXXXXXXXXX;
对于某些视图好比未使用联结子查询分组汇集函数Distinct Union等,是能够对其更新的,对视图的更新将对基表进行更新;可是视图主要用于简化检索,保护数据,并不用于更新,并且大部分视图都不能够更新。

4.drop,delete与truncate的区别

drop直接删掉表 truncate删除表中数据,再插入时自增加id又从1开始 delete删除表中数据,能够加where字句。

(1) DELETE语句执行删除的过程是每次从表中删除一行,而且同时将该行的删除操做做为事务记录在日志中保存以便进行进行回滚操做。TRUNCATE TABLE 则一次性地从表中删除全部的数据并不把单独的删除操做记录记入日志保存,删除行是不能恢复的。而且在删除的过程当中不会激活与表有关的删除触发器。执行速度快。

(2) 表和索引所占空间。当表被TRUNCATE 后,这个表和索引所占用的空间会恢复到初始大小,而DELETE操做不会减小表或索引所占用的空间。drop语句将表所占用的空间全释放掉。

(3) 通常而言,drop > truncate > delete

(4) 应用范围。TRUNCATE 只能对TABLE;DELETE能够是table和view

(5) TRUNCATE 和DELETE只删除数据,而DROP则删除整个表(结构和数据)。

(6) truncate与不带where的delete :只删除数据,而不删除表的结构(定义)drop语句将删除表的结构被依赖的约束(constrain),触发器(trigger)索引(index);依赖于该表的存储过程/函数将被保留,但其状态会变为:invalid。

(7) delete语句为DML(data maintain Language),这个操做会被放到 rollback segment中,事务提交后才生效。若是有相应的 tigger,执行的时候将被触发。

(8) truncate、drop是DLL(data define language),操做当即生效,原数据不放到 rollback segment中,不能回滚

(9) 在没有备份状况下,谨慎使用 drop 与 truncate。要删除部分数据行采用delete且注意结合where来约束影响范围。回滚段要足够大。要删除表用drop;若想保留表而将表中数据删除,若是于事务无关,用truncate便可实现。若是和事务有关,或老师想触发trigger,仍是用delete。

(10) Truncate table 表名 速度快,并且效率高,由于:
truncate table 在功能上与不带 WHERE 子句的 DELETE 语句相同:两者均删除表中的所有行。但 TRUNCATE TABLE 比 DELETE 速度快,且使用的系统和事务日志资源少。DELETE 语句每次删除一行,并在事务日志中为所删除的每行记录一项。TRUNCATE TABLE 经过释放存储表数据所用的数据页来删除数据,而且只在事务日志中记录页的释放。

(11) TRUNCATE TABLE 删除表中的全部行,但表结构及其列、约束、索引等保持不变。新行标识所用的计数值重置为该列的种子。若是想保留标识计数值,请改用 DELETE。若是要删除表定义及其数据,请使用 DROP TABLE 语句。

(12) 对于由 FOREIGN KEY 约束引用的表,不能使用 TRUNCATE TABLE,而应使用不带 WHERE 子句的 DELETE 语句。因为 TRUNCATE TABLE 不记录在日志中,因此它不能激活触发器。

5.索引的工做原理及其种类

数据库索引,是数据库管理系统中一个排序的数据结构,以协助快速查询、更新数据库表中数据。索引的实现一般使用B树及其变种B+树

在数据以外,数据库系统还维护着知足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就能够在这些数据结构上实现高级查找算法。这种数据结构,就是索引。

为表设置索引要付出代价的:一是增长了数据库的存储空间,二是在插入和修改数据时要花费较多的时间(由于索引也要随之变更)。

 

图展现了一种可能的索引方式。左边是数据表,一共有两列七条记录,最左边的是数据记录的物理地址(注意逻辑上相邻的记录在磁盘上也并非必定物理相邻的)。为了加快Col2的查找,能够维护一个右边所示的二叉查找树,每一个节点分别包含索引键值和一个指向对应数据记录物理地址的指针,这样就能够运用二叉查找在O(log2n)的复杂度内获取到相应数据。

建立索引能够大大提升系统的性能。

第一,经过建立惟一性索引,能够保证数据库表中每一行数据的惟一性。

第二,能够大大加快数据的检索速度,这也是建立索引的最主要的缘由。

第三,能够加速表和表之间的链接,特别是在实现数据的参考完整性方面特别有意义。

第四,在使用分组和排序子句进行数据检索时,一样能够显著减小查询中分组和排序的时间。

第五,经过使用索引,能够在查询的过程当中,使用优化隐藏器,提升系统的性能。

也许会有人要问:增长索引有如此多的优势,为何不对表中的每个列建立一个索引呢?由于,增长索引也有许多不利的方面。

第一,建立索引和维护索引要耗费时间,这种时间随着数据量的增长而增长。

第二,索引须要占物理空间,除了数据表占数据空间以外,每个索引还要占必定的物理空间,若是要创建聚簇索引,那么须要的空间就会更大。

第三,当对表中的数据进行增长、删除和修改的时候,索引也要动态的维护,这样就下降了数据的维护速度。

索引是创建在数据库表中的某些列的上面。在建立索引的时候,应该考虑在哪些列上能够建立索引,在哪些列上不能建立索引。通常来讲,应该在这些列上建立索引:在常常须要搜索的列上,能够加快搜索的速度;在做为主键的列上,强制该列的惟一性和组织表中数据的排列结构;在常常用在链接的列上,这些列主要是一些外键,能够加快链接的速度;在常常须要根据范围进行搜索的列上建立索引,由于索引已经排序,其指定的范围是连续的;在常常须要排序的列上建立索引,由于索引已经排序,这样查询能够利用索引的排序,加快排序查询时间;在常用在WHERE子句中的列上面建立索引,加快条件的判断速度。

一样,对于有些列不该该建立索引。通常来讲,不该该建立索引的的这些列具备下列特色:

第一,对于那些在查询中不多使用或者参考的列不该该建立索引。这是由于,既然这些列不多使用到,所以有索引或者无索引,并不能提升查询速度。相反,因为增长了索引,反而下降了系统的维护速度和增大了空间需求。

第二,对于那些只有不多数据值的列也不该该增长索引。这是由于,因为这些列的取值不多,例如人事表的性别列,在查询的结果中,结果集的数据行占了表中数据行的很大比例,即须要在表中搜索的数据行的比例很大。增长索引,并不能明显加快检索速度。

第三,对于那些定义为text, image和bit数据类型的列不该该增长索引。这是由于,这些列的数据量要么至关大,要么取值不多。

第四,当修改性能远远大于检索性能时,不该该建立索引。这是由于,修改性能和检索性能是互相矛盾的。当增长索引时,会提升检索性能,可是会下降修改性能。当减小索引时,会提升修改性能,下降检索性能。所以,当修改性能远远大于检索性能时,不该该建立索引。

根据数据库的功能,能够在数据库设计器中建立三种索引:惟一索引、主键索引和汇集索引

惟一索引

惟一索引是不容许其中任何两行具备相同索引值的索引。

当现有数据中存在重复的键值时,大多数数据库不容许将新建立的惟一索引与表一块儿保存。数据库还可能防止添加将在表中建立重复键值的新数据。例如,若是在employee表中职员的姓(lname)上建立了惟一索引,则任何两个员工都不能同姓。 主键索引 数据库表常常有一列或列组合,其值惟一标识表中的每一行。该列称为表的主键。 在数据库关系图中为表定义主键将自动建立主键索引,主键索引是惟一索引的特定类型。该索引要求主键中的每一个值都惟一。当在查询中使用主键索引时,它还容许对数据的快速访问。 汇集索引 在汇集索引中,表中行的物理顺序与键值的逻辑(索引)顺序相同。一个表只能包含一个汇集索引。

若是某索引不是汇集索引,则表中行的物理顺序与键值的逻辑顺序不匹配。与非汇集索引相比,汇集索引一般提供更快的数据访问速度。

局部性原理与磁盘预读

因为存储介质的特性,磁盘自己存取就比主存慢不少,再加上机械运动耗费,磁盘的存取速度每每是主存的几百分分之一,所以为了提升效率,要尽可能减小磁盘I/O。为了达到这个目的,磁盘每每不是严格按需读取,而是每次都会预读,即便只须要一个字节,磁盘也会从这个位置开始,顺序向后读取必定长度的数据放入内存。这样作的理论依据是计算机科学中著名的局部性原理当一个数据被用到时,其附近的数据也一般会立刻被使用。程序运行期间所须要的数据一般比较集中。

因为磁盘顺序读取的效率很高(不须要寻道时间,只需不多的旋转时间),所以对于具备局部性的程序来讲,预读能够提升I/O效率。

预读的长度通常为页(page)的整倍数。页是计算机管理存储器的逻辑块,硬件及操做系统每每将主存和磁盘存储区分割为连续的大小相等的块,每一个存储块称为一页(在许多操做系统中,页得大小一般为4k),主存和磁盘以页为单位交换数据。当程序要读取的数据不在主存中时,会触发一个缺页异常,此时系统会向磁盘发出读盘信号,磁盘会找到数据的起始位置并向后连续读取一页或几页载入内存中,而后异常返回,程序继续运行。

B-/+Tree索引的性能分析

到这里终于能够分析B-/+Tree索引的性能了。

上文说过通常使用磁盘I/O次数评价索引结构的优劣。先从B-Tree分析,根据B-Tree的定义,可知检索一次最多须要访问h个节点。数据库系统的设计者巧妙利用了磁盘预读原理,将一个节点的大小设为等于一个页,这样每一个节点只须要一次I/O就能够彻底载入。为了达到这个目的,在实际实现B-Tree还须要使用以下技巧:

每次新建节点时,直接申请一个页的空间,这样就保证一个节点物理上也存储在一个页里,加之计算机存储分配都是按页对齐的,就实现了一个node只需一次I/O。

B-Tree中一次检索最多须要h-1次I/O(根节点常驻内存),渐进复杂度为O(h)=O(logdN)。通常实际应用中,出度d是很是大的数字,一般超过100,所以h很是小(一般不超过3)。

而红黑树这种结构,h明显要深的多。因为逻辑上很近的节点(父子)物理上可能很远,没法利用局部性,因此红黑树的I/O渐进复杂度也为O(h),效率明显比B-Tree差不少。

综上所述,用B-Tree做为索引结构效率是很是高的。

6.链接的种类

查询分析器中执行:
--建表table1,table2:
create table table1(id int,name varchar(10))
create table table2(id int,score int)
insert into table1 select 1,'lee'
insert into table1 select 2,'zhang'
insert into table1 select 4,'wang'
insert into table2 select 1,90
insert into table2 select 2,100
insert into table2 select 3,70
如表
-------------------------------------------------
table1 | table2 |
-------------------------------------------------
id name |id score |
1 lee |1 90|
2 zhang| 2 100|
4 wang| 3 70|
-------------------------------------------------

如下均在查询分析器中执行
1、外链接
1.概念:包括左向外联接、右向外联接或完整外部联接

2.左链接:left join 或 left outer join
(1)左向外联接的结果集包括 LEFT OUTER 子句中指定的左表的全部行,而不只仅是联接列所匹配的行。若是左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的全部选择列表列均为空值(null)。
(2)sql 语句
select * from table1 left join table2 on table1.id=table2.id
-------------结果-------------
idnameidscore
------------------------------
1lee190
2zhang2100
4wangNULLNULL
------------------------------
注释:包含table1的全部子句,根据指定条件返回table2相应的字段,不符合的以null显示

3.右链接:right join 或 right outer join
(1)右向外联接是左向外联接的反向联接。将返回右表的全部行。若是右表的某行在左表中没有匹配行,则将为左表返回空值。
(2)sql 语句
select * from table1 right join table2 on table1.id=table2.id
-------------结果-------------
idnameidscore
------------------------------
1lee190
2zhang2100
NULLNULL370
------------------------------
注释:包含table2的全部子句,根据指定条件返回table1相应的字段,不符合的以null显示

4.完整外部联接:full join 或 full outer join
(1)完整外部联接返回左表和右表中的全部行。当某行在另外一个表中没有匹配行时,则另外一个表的选择列表列包含空值。若是表之间有匹配行,则整个结果集行包含基表的数据值。
(2)sql 语句
select * from table1 full join table2 on table1.id=table2.id
-------------结果-------------
idnameidscore
------------------------------
1lee190
2zhang2100
4wangNULLNULL
NULLNULL370
------------------------------
注释:返回左右链接的和(见上左、右链接)

2、内链接
1.概念:内联接是用比较运算符比较要联接列的值的联接

2.内链接:join 或 inner join

3.sql 语句
select * from table1 join table2 on table1.id=table2.id
-------------结果-------------
idnameidscore
------------------------------
1lee190
2zhang2100
------------------------------
注释:只返回符合条件的table1和table2的列

4.等价(与下列执行效果相同)
A:select a.*,b.* from table1 a,table2 b where a.id=b.id
B:select * from table1 cross join table2 where table1.id=table2.id (注:cross join后加条件只能用where,不能用on)

3、交叉链接(彻底)

1.概念:没有 WHERE 子句的交叉联接将产生联接所涉及的表的笛卡尔积。第一个表的行数乘以第二个表的行数等于笛卡尔积结果集的大小。(table1和table2交叉链接产生3*3=9条记录)

2.交叉链接:cross join (不带条件where...)

3.sql语句
select * from table1 cross join table2
-------------结果-------------
idnameidscore
------------------------------
1lee190
2zhang190
4wang190
1lee2100
2zhang2100
4wang2100
1lee370
2zhang370
4wang370
------------------------------
注释:返回3*3=9条记录,即笛卡尔积

4.等价(与下列执行效果相同)
A:select * from table1,table2

7.数据库范式

1 第一范式(1NF)

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

2 第二范式(2NF)

第二范式(2NF)是在第一范式(1NF)的基础上创建起来的,即知足第二范式(2NF)必须先知足第一范式(1NF)。第二范式(2NF)要求数据库表中的每一个实例或行必须能够被唯一地区分。为实现区分一般须要为表加上一个列,以存储各个实例的唯一标识。这个唯一属性列被称为主关键字或主键、主码。
第二范式(2NF)要求实体的属性彻底依赖于主关键字。所谓彻底依赖是指不能存在仅依赖主关键字一部分的属性,若是存在,那么这个属性和主关键字的这一部分应该分离出来造成一个新的实体,新实体与原实体之间是一对多的关系。为实现区分一般须要为表加上一个列,以存储各个实例的唯一标识。简而言之,第二范式就是非主属性非部分依赖于主关键字。

3 第三范式(3NF)

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

 

8.数据库优化的思路

这个我借鉴了慕课上关于数据库优化的课程。

1.SQL语句优化

1)应尽可能避免在 where 子句中使用!=或<>操做符,不然将引擎放弃使用索引而进行全表扫描。
2)应尽可能避免在 where 子句中对字段进行 null 值判断,不然将致使引擎放弃使用索引而进行全表扫描,如:
select id from t where num is null
能够在num上设置默认值0,确保表中num列没有null值,而后这样查询:
select id from t where num=0
3)不少时候用 exists 代替 in 是一个好的选择
4)用Where子句替换HAVING 子句 由于HAVING 只会在检索出全部记录以后才对结果集进行过滤

2.索引优化

看上文索引

3.数据库结构优化

1)范式优化: 好比消除冗余(节省空间。。) 2)反范式优化:好比适当加冗余等(减小join) 3)拆分表: 分区将数据在物理上分隔开,不一样分区的数据能够制定保存在处于不一样磁盘上的数据文件里。这样,当对这个表进行查询时,只须要在表分区中进行扫描,而没必要进行全表扫描,明显缩短了查询时间,另外处于不一样磁盘的分区也将对这个表的数据传输分散在不一样的磁盘I/O,一个精心设置的分区能够将数据传输对磁盘I/O竞争均匀地分散开。对数据量大的时时表可采起此方法。可按月自动建表分区。
4)拆分其实又分垂直拆分和水平拆分: 案例: 简单购物系统暂设涉及以下表: 1.产品表(数据量10w,稳定) 2.订单表(数据量200w,且有增加趋势) 3.用户表 (数据量100w,且有增加趋势) 以mysql为例讲述下水平拆分和垂直拆分,mysql能容忍的数量级在百万静态数据能够到千万 垂直拆分:解决问题:表与表之间的io竞争 不解决问题:单表中数据量增加出现的压力 方案: 把产品表和用户表放到一个server上 订单表单独放到一个server上 水平拆分: 解决问题:单表中数据量增加出现的压力 不解决问题:表与表之间的io争夺
方案: 用户表经过性别拆分为男用户表和女用户表 订单表经过已完成和完成中拆分为已完成订单和未完成订单 产品表 未完成订单放一个server上 已完成订单表盒男用户表放一个server上 女用户表放一个server上(女的爱购物 哈哈)

4.服务器硬件优化

这个么多花钱咯!

9.存储过程与触发器的区别

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

 

</div>
相关文章
相关标签/搜索