数据库篇
数据库篇
数据库概念
数据库管理系统的主要功能是什么?
答:
数据库建立和维护,数据库的运行管理,数据定义、数据操纵
数据库设计的基本步骤是什么?
答:
需求分析。了解和分析用户需求;
概念结构设计。对用户需求进行抽象和归纳,形成一个独立于DBMS的概念模型(E-R图);
逻辑结构设计。将概念结构转换为数据模型,通常为关系模型;
物理结构设计。为逻辑数据模型选取一个最适合存储结构和存取方法;
数据库实施阶段。编写数据库,编写和调试应用程序;
数据库运行和维护。正式投入运行。
数据库系统的特点是什么?
答:
数据结构化;
数据共享性高、冗余度低且扩充;
数据独立性高;
数据由DBMS统一管理。
DBA的职责是什么?
答:
DBA负责全面管理和控制数据库系统的职责,具体有:
(1)决定数据库中要存放哪些信息;
(2)决定数据库的存储结构和存取策略;
(3)定义数据的安全性要求和完整性约束条件;
(4)监控数据库的使用和运行:转储数据、维护日志文件、故障恢复
(5)数据库的改进和重组重构:对运行情况进行记录、统计分析,以此来不断改进数据库设计。
三级模式结构是什么?二级映射有什么优点?
三级模式包括外模式、模式、内模式;
模式描述了数据库中全体数据的逻辑结构和特征;
外模式描述了用户可见的局部数据的逻辑结构和特征,用户模式;理解:① 一个数据库可以有多个外模式;② 外模式就是用户视图;③ 外模式是保证数据安全性的一个有力措施。对应于用户级,是某个或某几个用户所能看到的数据库的数据视图,是从模式导出的一个子集,故又称子模式。用户主要通过DML语言对外模式数据进行操作。外反应了数据库的用户观。
内模式描述了数据库的物理结构和存储方式,存储模式。理解:① 一个数据库只有一个内模式;② 一个表可能由多个文件组成,如:数据文件、索引文件。它是数据库管理系统(DBMS)对数据库中数据进行有效组织和管理的方法下一题。其目的有:② 为了减少数据冗余,实现数据共享;② 为了提高存取效率,改善性能。
外模式/模式映像的优点:当模式改变时,由DBA对外模式/模式映像做相应的改变,外模式可以保持不变。应用程序是根据外模式而编写的,因而应用程序不必修改,保证了数据与逻辑的而独立性,即数据的逻辑独立性;
内模式/模式映像的优点:当数据库的存储结构改变时,由DBA对模式/内模式映射作相应的改变,可以使模式保持不变,从而应用程序也不必改变。保证了数据与程序的物理独立性,即数据的物理独立性。
试述文件系统与数据库系统的区别和联系
文件系统与数据库系统的区别是:
文件系统面向某一应用程序,共享性差,冗余度大,数据独立性差,记录内有结构,整体无结构,由应用程序自己控制。
数据库系统面向现实世界,共享性高,冗余度小,具有较高的物理独立性和一定的逻辑独立性,整体结构化,用数据模型描述,由数据库管理系统提供数据的安全性、完整性、并发控制和恢复能力。
文件系统与数据库系统的联系是:
文件系统与数据库系统都是计算机系统中管理数据的软件。解析文件系统是操作系统的重要组成部分;
DBMS 是独立于操作系统的软件。但是 DBMS 是在操作系统的基础上实现的;数据库中数据的组织和存储是通过操作系统中的文件系统来实现的。
Mysql引擎:
什么是数据库引擎
数据库引擎:用于存储、处理、保护数据的核心服务。
当你访问数据库时,不管是手工访问,还是程序访问,都不是直接读写数据库文件,而是通过数据库引擎去访问数据库文件
数据库引擎有几种
Innodb 、 MyISAM 、MEMORY 、MERGE
MyISAM和InnoDB的区别
InnoDB支持事务,MyISAM不支持,对于InnoDB每一条SQL语言都默认封装成事务,自动提交,这样会影响速度,所以最好把多条SQL语言放在begin和commit之间,组成一个事务;
InnoDB支持外键,而MyISAM不支持。对一个包含外键的InnoDB表转为MYISAM会失败;
InnoDB不保存表的具体行数,执行select count(*) from table时需要全表扫描。而MyISAM用一个变量保存了整个表的行数,执行上述语句时只需要读出该变量即可,速度很快;
Innodb不支持全文索引,而MyISAM支持全文索引,查询效率上MyISAM要高;
锁机制不同: InnoDB 为行级锁,myisam 为表级锁。
行级锁
行级锁是 MySQL 中锁定粒度最细的一种锁,表示只针对当前操作的行进行加锁。行级锁分为共享锁和排他锁。
特点:加锁开销大,会出现死锁,锁定粒度最小,发生锁冲突的概率最低,并发度最高
页级锁
页级锁是 MySQL 中锁定粒度介于行级锁和表级锁中间的一种锁。采取了折衷的页级锁,一次锁定相邻的一组记录。BDB 支持页级锁。
特点:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般。
表级锁
表级锁是 MySQL 中锁定粒度最大的一种锁,表示对当前操作的整张表加锁,它实现简单,资源消耗较少,被大部分 MySQL 引擎支持。表级锁定分为表共享读锁(共享锁)与表独占写锁(排他锁)
事务与锁
事务的四个属性
事务(Transaction)是并发控制的基本单位。所谓的事务,它是一个操作序列,由一条或者多条sql语句组成,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位。
锁是最常用的并发控制机构,是防止其他事务访问指定资源,实现并发控制的一种手段。
ACID。即原子性(atomicity)、一致性(consistency )、隔离性(isolation)、持久性( durability)。
原子性:表示这事务要么做,要么不做。
一致性:与原子性关系紧密,事务从提交之前由一个一致性状态到另一个一致性状态
隔离性:事务之间不能互相干扰。
持久性:事务提交后对数据库中的数据影响是永远的。
在数据库中为什么要并发控制?
数据库是共享资源,通常有多个事物在同时执行,当多个事物并发的存取数据库时就会存在同时读或写统一数据的情况,如果对并发操作不加控制,就会存在数据读取或存取错误,破坏数据库的一致性。
并发一致性问题
丢失数据
丢失数据:
和
两个事务都对一个数据进行修改,
先修改,
随后修改,
的修改覆盖了
的修改。简记为
同时修改
。读脏数据
读脏数据:
对一个数据做了修改,
读取这一个数据。若
执行 ROLLBACK 操作,则
读取的结果和第一次的结果不一样。简记为
读取失败的修改
。最简单的场景是修改完成后,紧接着查询检验结果。一个事务读到另一个事务,尚未提交的修改,就是脏读。这里所谓的修改,除了Update操作,不要忘了,还包括Insert和Delete操作。
脏读的后果:如果后一个事务回滚,那么它所做的修改,统统都会被撤销。前一个事务读到的数据,就是垃圾数据。不可重复读
不可重复读:
读取一个数据,
对该数据做了修改。如果
再次读取这个数据,此时读取的结果和第一次读取的结果不同。简记为
读时修改
,重复读取的结果不一样。在同一个事务中,再次读取数据时【select操作】,所读取的数据,和第1次读取的数据,不一样了。就是不可重复读。
幻影读
幻影读:
读取某个范围的数据,
在这个范围内插入新的数据,
再次读取这个范围的数据,此时读取的结果和和第一次读取的结果不同。简记为
读时插入
,重复读取的结果不一样。例如:事务1读取指定的where子句所返回的一些行。然后,事务2插入一个新行,这个新行也满足事务1使用的查询where子句。然后事务1再次使用相同的查询读取行,但是现在它看到了事务2刚插入的行。这个行被称为幻象,因为对事务1来说,这一行的出现是不可思议的。在并发环境下,事务的隔离性很难保证,因此会出现很多并发一致性问题。产生并发不一致性问题的主要原因是破坏了事务的隔离性。解决方法是通过
并发控制
来保证隔离性。并发控制可以通过封锁
来实现,但是封锁操作需要用户自己控制,相当复杂。数据库管理系统提供了事务的隔离级别
,让用户以一种更轻松的方式处理并发一致性问题。
共享锁(Share locks简记为S锁):也称读锁,事务A对对象T加s锁,其他事务也只能对T加S,多个事务可以同时读,但不能有写操作,直到A释放S锁。
排它锁(Exclusivelocks简记为X锁):也称写锁,事务A对对象T加X锁以后,其他事务不能对T加任何锁,只有事务A可以读写对象T直到A释放X锁。
三级封锁协议
(1)一级封锁协议
事务T要修改数据A时必须加X锁,直到T结束才释放锁。
可以解决丢失修改问题,因为不能同时有两个事务对用一个数据进行修改,那么事务的修改就不会被覆盖。
(2)二级封锁协议
在一级的基础上,要求读取数据A时必须加S锁,读取完马上释放S锁。
可以解决读脏数据问题,因为如果一个事务在对数据A进行修改,根据一级封锁协议,会加X锁,那么就不能再加S锁了,其他事物无法读,也就不会读入数据。
3)三级封锁协议
在二级的基础上,要求读取数据A时必须加S锁,直到事务结束了才能释放S锁。
可以解决不可重复读的问题,因为读取A时,其它事务不能对A加X锁,从而避免了在读的期间数据发生变化。
为什么事务非正常结束时会影响数据库数据的正确性?
答:
事物具有一致性,事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。如果数据库系统运行中发生故障,有些事务尚未完成就被迫中断,这些未完成事务对数据库所做的修改有一部分已写入物理数据库,这时数据库就处于一种不正确的状态,或者说是不一致的状态。
数据库特点:
DML,DCL,DDL
DML(data manipulation language) 数据操纵语言
就是我们经常用到的SELECT、UPDATE、INSERT、DELETE。主要用来对数据库的数据进行的一些操作。
DDL(data definition language)数据定义语言
就是我们在创建表时用到的一些SQL语句。例如:CREATE、ALTER、DROP等。DDL主要是用在定义表
或者改变表的结构、数据类型、表之间的链接和约束等初始化操作上。
DCL(Data Control Language)数据控制语言
用来设置或者更改数据库用户角色权限等的语句,例如:grant、revoke语句。
关系模型中的完整性约束是哪几类?定义?
答:
实体完整性:关系模式中的主码不能为空值;
参照完整性:关系模式中的外码只能是空值或者另一关系模式的主码;
用户定义完整性:关系模式中针对某一属性的约束。
三级模式结构是什么?二级映射有什么优点?
答:
三级模式包括外模式、模式、内模式;
模式描述了数据库中全体数据的逻辑结构和特征;用户根据外模式用户数据操作语句或者程序去操作数据库中的数据,外模式的主要特点用来描述组成用户视图各个记录的组成、相互联系、数据的完整性和安全性、数据项的特征等。
外模式描述了用户可见的局部数据的逻辑结构和特征;
内模式描述了数据库的物理结构和存储方式。内模式是所有模式中的最低层的表示,不同于物理层,假设外存是一个无限性的地址空间,内模式是存储记录的类型,存储域以及表示以及存储记录的物理顺序,指示元索引,和存储路径的等数据的存储组织从而形成一个完整的系统。
外模式/模式映像的优点:当模式改变时,由DBA对外模式/模式映像做相应的改变,外模式可以保持不变。应用程序是根据外模式而编写的,因而应用程序不必修改,保证了数据与逻辑的而独立性,即数据的逻辑独立性;
内模式/模式映像的优点:当数据库的存储结构改变时,由DBA对模式/内模式映射作相应的改变,可以使模式保持不变,从而应用程序也不必改变。保证了数据与程序的物理独立性,即数据的物理独立性。
外连接,内连接:
外连接(out join)
外连接分为外左连接(left outer join)和外右连接(right outer join)
注释:left outer join 与 left join 等价, 一般写成left join
right outer join 与 right join等价,一般写成right join
左连接,取左边的表的全部,右边的表按条件,符合的显示,不符合则显示null
举例:select from A right join B on A.id=B.id
内连接(inner join)
内连接:也称为等值连接,返回两张表都满足条件的部分
注释:inner join 就等于 join
内连接和where的区别:
关键字on的执行是在join和where前面的
如果两张表的数据量都比较大的话,那样就会占用很大的内存空间这显然是不合理的。所以,我们在进行表连接查询的时候一般都会使用JOIN xxx ON xxx的语法,ON语句的执行是在JOIN语句之前的,也就是说两张表数据行之间进行匹配的时候,会先判断数据行是否符合ON语句后面的条件,再决定是否JOIN。
因此,有一个显而易见的SQL优化的方案是,当两张表的数据量比较大,又需要连接查询时,应该使用 FROM table1 JOIN table2 ON xxx的语法,避免使用 FROM table1,table2 WHERE xxx 的语法,因为后者会在内存中先生成一张数据量比较大的笛卡尔积表,增加了内存的开销。
范式是什么,内容有那些
在设计数据库时,为了使其冗余较小、结构合理,设计数据库时必须遵循一定的规则。在关系型数据库中,这种规则被称为范式。范式是符合某一设计规则的总结。
第一范式(1NF)数据库表中的所有字段值都是不可分割的原子值
不符合第一范式举例:某数据是"中国的河北",这个是可以分割的,不符合原子性
第二范式(2NF)数据库表中的每一列都与主键完全相关,而不能只与主键的部分相关,完全依赖于主码。
第三范式(3NF)数据库表中的每一列和主键直接相关,而不是间接相关。也就是属性不能传递依赖于主属性,属性不依赖于其它非主属
没有冗余的数据库设计可以做到。但是,没有冗余的数据库未必是最好的数据库,有时为了提高运行效率,就必须降低范式标准,适当保留冗余数据。具体做法是:在概念数据模型设计时遵守第三范式,降低范式标准的工作放到物理数据模型设计时考虑。降低范式就是增加字段,允许冗余性。
如果数据库日志满了会出现什么情况?
日志文件(Log File)记录所装对数据库数据的修改,主要是保户数据库以防止故障,以及复数据时使恢复用。其特点如下:
(1)每一个数据库至少包含两个日志文件组。每个日志文件组至少包含两个日志文件成员;
(2)日志文件组以循环方式进行写操作;
(3)每一个日志文件成员对应一个物理文件。
通过日志文件来记录数据库事务可以最大限度地保证数据的一致性与安全性,但一旦数据库中日志满了,就只能执行查询等读操作,不能执行更改、备份等操作。其原因是任何写操作都要记录日志,也就是说基本上处干不能使用的状态。
索引:
什么样的字段适合建索引
唯一、不为空、经常被查询的字段
索引是对数据库表中一个或多个列(例如,employee 表的姓名 (name) 列)的值进行排序的结构。
例如这样一个查询:select * from table1 where id=10000。如果没有索引,必须遍历整个表,直到ID等于10000的这一行被找到为止;有了索引之后(必须是在ID这一列上建立的索引),即可在索引中查找。由于索引是经过某种算法优化过的,因而查找次数要少的多。可见,索引是用来定位的。
索引和键有什么区别?
索引是存储在数据库中的一个物理结构,是实际存在的,相当于一本书的目录;
键是一个逻辑概念,不是数据库中的物理部分。键分为主键和外键,主键相当于一本书中每个页的页码。
数据库中常用的索引有哪些?
答:
B+树索引:B+树是对B树优化处理了的多路搜索树,与B树的区别在于,B树的每个结点都可以存储数据,而B+树只有叶子结点可以存储数据,且每个叶子结点都用链表链接。数据库索引采用B+树而不是B树的主要原因:B+树只要遍历叶子节点就可以实现整棵树的遍历,而且在数据库中基于范围的查询是非常频繁的,而B树只能中序遍历所有节点,效率太低。
在数据库的查询中一般都是批量查询数据,采用B+树一次查询多条时,确定首尾位置,便可以方便的确定多条数据位置,提高查询效率。
B+ Tree 的有序性,因此可用于 部分查找
、范围查找
、排序
和 分组
。
Hash索引:通过一定的算法计算出哈希值,然后映射出对应的数据存储位置。检索速度快,但是哈希值可能存在碰撞。
Hash 索引能以 O(1) 时间进行查找,但是失去了有序性。因此无法用于排序与分组,无法用于部分查找和范围查找,只支持精确查找
索引的作用?和它的优点缺点是什么?
当表的数据量比较大时,查询操作比较耗时,建立索引可以加快查询速度。
优点:加速查询速度;缺点:索引需要占一定的存储空间,且基本表更新时需要维护索引表。
为什么? 通常,通过索引查询数据比全表扫描要快.但是我们也必须注意到它的代价. 索引需要空间来存储,也需要定期维护, 每当有记录在表中增减或索引列被修改时,索引本身也会被修改.这意味着每条记录的INSERT,DELETE,UPDATE将为此多付出4,5 次的磁盘I/O.因为索引需要额外的存储空间和处理,那些不必要的索引反而会使查询反应时间变慢.使用索引查询不一定能提高查询性能。
索引的设计原则
从索引的优、缺点考虑索引的设计原则。
- 忌过度索引:索引需要额外的磁盘空间,而且会降低写操作的性能。
- 在修改表内容时,索引会进行更新甚至重构,索引列越多花销时间越长。为此优化检索性能,只保持需要的索引即可。
- 经常用在
排列
、分组
和范围搜索
的列适合创建索引,因为索引是有序的。 - 经常出现在
WHERE
子句的列,或是JOIN
连接子句中指定的列适合创建索引。
其他
视图是什么?有何作用?
答:
视图是从一个或几个基本表中导出的表,是一个虚表。数据库中只存放视图的定义,而不存放视图对应的数据。基本表中的数据发生变化时,从视图中查询出来的数据也就随之发生变化。
作用:
能够简化用户的操作;
使用户能以多种角度看待同一数据;
在一定程度上提供了数据的逻辑独立性;
能够对秘密数据提供安全保护,因为视图是虚拟的,物理上是不存在的,用户对视图不可以随意的更改和删除,这样可以在一定程度上保证了安全。
利用可以更清晰的表达查询。
如下两种场景一般会使用到视图:
(1)不希望访问者获取整个表的信息,只暴露部分字段给访问者,所以就建一个虚表,就是视图。
(2)查询的数据来源于不同的表,而查询者希望以统一的方式查询,这样也可以建立一个视图,把多个表查询结果联合起来,查询者只需要直接从视图中获取数据,不必考虑数据来源于不同表所带来的差异。
冷备份和热备份的区别
相当于冷备份是在系统已经关闭的情况之下对数据的存储,把数据放在了另一个位置之上,;
而热备份是在系统还在运行的情况之下进行的操作,一边运行一边备份,消耗空间较多。
什么是触发器 trigger
触发器是一个特殊的存储过程,存储过程是我们调用的时候发生,而触发器是在某个事件触发的时候,自动执行。根据SQL语句的不同,触发器可分为两类:DML(insert,update,delete)触发器和DLL(create,alter,drop)触发器。
比如当对一个表进行操作( insert,delete, update)时就会激活它执行。触发器经常用于加强数据的完整性约束和业务规则等。
触发器的主要作用表现在以下几个方面:
(1)增加安全性。
(2)利用触发器记录所进行的修改以及相关信息,跟踪用户对数据库的操作,实现审计。
(3)维护那些通过创建表时的声明约束不可能实现的复杂的完整性约束以及对数据库中特定事件进行监控与响应。
(4)实现复杂的非标准的数据库相关完整性规则、同步实时地复制表中的数据。
(5)触发器是自动的,它们在对表的数据做了任何修改之后就会被激活。例如,可以自动计算数据值,如果数据的值达到了一定的要求,则进行特定的处理。以某企业财务管理为例,如果企业的资金链出现短缺,并且达到某种程度时,则发送警告信息。
什么是存储过程?用什么来调用?
存储过程是一个预编译的SQL语句, 简单的说存储过程是为了完成某个数据库中的特定功能而编写的语句集,该语句集包括SQL语句(对数据的增删改查)、条件语句和循环语句等。
优点: 1)存储过程是预编译过的,执行效率高。 2)存储过程的代码直接存放于数据库中,通过存储过程名直接调用,减少网络通讯。 3)安全性高,执行存储过程需要有一定权限的用户。 4)存储过程可以重复使用,可减少数据库开发人员的工作量。 缺点:移植性差
优点是允许模块化的设计,就是说只需创建一次,以后在该程序中就可以调用多次。如果某次操作需要执行多次SQL,使用存储过程比单纯SQL语句执行要快。可以用一个命令对象来调用存储过程(CALL)。
如何优化数据库,如何提高数据库的性能?
1)给数据库做索引,合理的索引能立即显著地提高数据库整个系统的性能。
2)在适当的情况下,尽可能的用存储过程而不是SQL查询。因为前者已经过了预编译,运行速度更快。
3)优化查询语句,通过高性能的查询语句提高数据库的性能。
简述查询优化策略
如果一个表达式中多次出现某个子表达式,应该将该子表达式预先计算出结果保存起来,以免重复计算
选择运算尽可能先做
尽量避免使用select *
避免在索引列上使用计算。WHERE子句中,如果索引列是函数的一部分。优化器将不使用索引而使用全表扫描。
避免在索引列上使用IS NULL和IS NOT NULL