A. 关于数据库的几个问题
1.C
2.A
3.A
4.错误
5.错误
6.正确
7.
外模式
-模式,模式-内模式
8.
数据结构化
,(
数据共享
性高、
冗余度
低、易扩充)
9.
关系模型
,
面向对象模型
12.数据的安全性保护,数据的完整性保护
15.
实体完整性
,
参照完整性
16.外模式,模式
B. 当数据库出现问题怎么办
数据库出现问题,首要的是尽快备份数据库,如果数据库损坏的话,找出最近日期的数据备份。
确认有数据库备份后,根据数据库错误的提示,一步一步地解决的,如果不是数据库损坏,问题解决都不是很大的,如果是数据库损坏的话,麻烦可就大了,只能考虑利用以前的数据库备份了的
C. 关于数据库的问题
下列软件不属于数据库管理系统的是(UNIX )。
UNIX
ORACLE
FOXPRO
SQL SERVER
DBS是采用了数据库技术的计算机系统。DBS是一个集合体,包含数据库、计算机硬件、软件和(数据库管理员) 。
系统分析员
程序员
数据库管理员
操作员
对某个具体的数据库应用来说,下列说法中正确的是(以上三个都不是唯一的) 。
E-R 图是唯一的
数据模型是唯一的
数据库文件是唯一的
以上三个都不是唯一的
以下不属于数据库系统组成的是(文件系统 )。
硬件系统
数据库管理系统及相关软件
数据库管理员(DBA)
文件系统
下列四项中说法不正确的是(数据库避免了一切数据的重复)。
数据库减少了数据冗余
数据库中的数据可以共享
数据库避免了一切数据的重复
数据库具有较高的数据独立性
与文件管理系统相比,(访问速度快)不是数据库系统的优点。
数据结构化 (数据结构化是数据库与文件系统的根本区别。)
访问速度快 (文件管理系统速度要比把文件内容放在数据库中快)
数据独立性
冗余度可控
下列四项中,不属于关系数据库特点的是(数据冗余小)。
数据冗余小
数据独立性高
数据共享性好
多用户访问
根据关系数据基于的数据模型-关系模型的特征判断下列正确的一项: ( 以二维表格结构来保存数据,在关系表中不允许有重复行存在) 。
只存在一对多的实体关系,以图形方式来表示
以二维表格结构来保存数据,在关系表中不允许有重复行存在
能体现一对多、多对多的关系,但不能体现一对一的关系
关系模型数据库是数据库发展的最初阶段
用树型结构表示实体间联系的模型是(层次模型)。
关系模型
网状模型
层次模型
以上三个都是
(层次模型:用树型结构表示实体间联系的数据模型)
关系数据库用(二维表)来表示实体之间的联系。
树结构
网结构
二维表
线性表
(关系模型:使用最广泛的一种数据库模型。方法:用若干个二维表来表示实体以及实体之间的联系。)
D. 数据库老师会问哪些问题
1.MySQL 主键与索引的联系与区别
主键是为了标识数据库记录唯一性,不允许记录重复,且键值不能为空,主键也是一个特殊索引。
数据表中只允许有一个主键,但是可以有多个索引。
使用主键会数据库会自动创建主索引,也可以在非主键上创建索引,方便查询效率。
索引可以提高查询速度,它就相当于字典的目录,可以通过它很快查询到想要的结果,而不需要进行全表扫描。
主键索引外索引的值可以为空。
主键也可以由多个字段组成,组成复合主键,同时主键肯定也是唯一索引。
唯一索引则表示该索引值唯一,可以由一个或几个字段组成,一个表可以有多个唯一索引。
2.数据库索引是怎么回事?用的啥数据结构 为什么B+树比B树更合适
一个索引是存储的表中一个特定列的值数据结构(最常见的是B-Tree)。索引是在表的列上创建。所以,要记住的关键点是索引包含一个表中列的值,并且这些值存储在一个数据结构中。请记住记住这一点:索引是一种数据结构 。
什么样的数据结构可以作为索引?
B-Tree 是最常用的用于索引的数据结构。因为它们是时间复杂度低, 查找、删除、插入操作都可以可以在对数时间内完成。另外一个重要原因存储在B-Tree中的数据是有序的。数据库管理系统(RDBMS)通常决定索引应该用哪些数据结构。但是,在某些情况下,你在创建索引时可以指定索引要使用的数据结构。
当我们利用索引查询的时候,不可能把整个索引全部加载到内存,只能逐一加载每个磁盘页,磁盘页对应索引树的节点。那么Mysql衡量查询效率的标准就是磁盘IO次数。如果我们利用二叉树作为索引结构,那么磁盘的IO次数和索引树的高度是相关的。
那么为了提高查询效率,就需要减少磁盘IO数。为了减少磁盘IO的次数,就需要尽量降低树的高度,需要把原来“瘦高”的树结构变的“矮胖”,树的每层的分叉越多越好,因此B树正好符合我们的要求,这也是B-树的特征之一。
B树 B树的节点为关键字和相应的数据(索引等)
B+树 B+树是B树的一个变形,非叶子节点只保存索引,不保存实际的数据,数据都保存在叶子节点中,B+树的叶子节点为链表,链表放数据,非叶子节点是索引。
对比:
B树和B+树同样适用于高度越低,查询越快。
B树查找节点,B+树只需要查询所有节点(索引),B树查询索引和数据。虽然可能第一个就找到,但在极端情况下,需要全查询索引和数据,不如B+树稳定。
B+树和B树比,B+树的硬盘空间更少,io的读写代价更低。因为B+树节点只有索引,占位更少。在查询的情况下硬盘指针移动更低
哈希表索引是怎么工作的?
哈希表是另外一种你可能看到用作索引的数据结构-这些索引通常被称为哈希索引。使用哈希索引的原因是,在寻找值时哈希表效率极高。所以,如果使用哈希索引,对于比较字符串是否相等的查询能够极快的检索出的值。例如之前我们讨论过的这个查询(SELECT * FROM Employee WHERE Employee_Name = ‘Jesus’) 就可以受益于创建在Employee_Name 列上的哈希索引。哈系索引的工作方式是将列的值作为索引的键值(key),和键值相对应实际的值(value)是指向该表中相应行的指针。因为哈希表基本上可以看作是关联数组,一个典型的数据项就像“Jesus => 0x28939″,而0x28939是对内存中表中包含Jesus这一行的引用。在哈系索引的中查询一个像“Jesus”这样的值,并得到对应行的在内存中的引用,明显要比扫描全表获得值为“Jesus”的行的方式快很多。
哈希索引的缺点
哈希表是无顺的数据结构,对于很多类型的查询语句哈希索引都无能为力。举例来说,假如你想要找出所有小于40岁的员工。你怎么使用使用哈希索引进行查询?这不可行,因为哈希表只适合查询键值对-也就是说查询相等的查询(例:like “WHERE name = ‘Jesus’)。哈希表的键值映射也暗示其键的存储是无序的。这就是为什么哈希索引通常不是数据库索引的默认数据结构-因为在作为索引的数据结构时,其不像B-Tree那么灵活
3.创建索引的注意事项
索引可以提高数据的访问速度,但同时也增加了插入、更新和删除操作的处理时间,解决此问题就是分析应用程序的业务处理、数据使用,为经常被用作查询条件、或者被要求排序的字段建立索引。索引是建立在数据库表中的某些列的上面。因此,在创建索引的时候,应该仔细考虑在哪些列上可以创建索引,在哪些列上不能创建索引。
创建规则:
表的主键、外键必须有索引;
数据量超过300的表应该有索引;
经常与其他表进行连接的表,在连接字段上应该建立索引;
经常出现在Where子句中的字段,特别是大表的字段,应该建立索引;
索引应该建在选择性高的字段上;
索引应该建在小字段上,对于大的文本字段甚至超长字段,不要建索引;
复合索引的建立需要进行仔细分析;尽量考虑用单字段索引代替
频繁进行数据操作的表,不要建立太多的索引;
删除无用的索引,避免对执行计划造成负面影响;
创建索引需要注意的地方:
限制表上的索引数目。对一个存在大量更新操作的表,所建索引的数目一般不要超过3个,最多不要超过5个。索引虽说提高了访问速度,但太多索引会影响数据的更新操作。
避免在取值朝一个方向增长的字段(例如:日期类型的字段)上,建立索引;对复合索引,避免将这种类型的字段放置在最前面
对复合索引,按照字段在查询条件中出现的频度建立索引
删除不再使用,或者很少被使用的索引。
4.MYSQL事务特性和实现原理
ACID表示原子性(atomicity)、一致性(consistency)、隔离性(isolation)和持久性(rability)。一个很好的事务处理系统,必须具备这些标准特性:
原子性(atomicity)
一个事务必须被视为一个不可分割的最小工作单元,整个事务中的所有操作要么全部提交成功,要么全部失败回滚,对于一个事务来说,不可能只执行其中的一部分操作,这就是事务的原子性
是利用Innodb的undo log。undo log名为回滚日志,是实现原子性的关键,当事务回滚时能够撤销所有已经成功执行的sql语句,他需要记录你要回滚的相应日志信息。
一致性(consistency)
数据库总是从一个一致性的状态转换到另一个一致性的状态。(在前面的例子中,一致性确保了,即使在执行第三、四条语句之间时系统崩溃,支票账户中也不会损失200美元,因为事务最终没有提交,所以事务中所做的修改也不会保存到数据库中。)
数据库通过原子性、隔离性、持久性来保证一致性
隔离性(isolation)
通常来说,一个事务所做的修改在最终提交以前,对其他事务是不可见的。(在前面的例子中,当执行完第三条语句、第四条语句还未开始时,此时有另外的一个账户汇总程序开始运行,则其看到支票帐户的余额并没有被减去200美元。)
利用的是锁和MVCC机制。MVCC,即多版本并发控制(Multi Version Concurrency Control),一个行记录数据有多个版本对快照数据,这些快照数据在undo log中。如果一个事务读取的行正在做DELELE或者UPDATE操作,读取操作不会等行上的锁释放,而是读取该行的快照版本。
持久性(rability)
一旦事务提交,则其所做的修改会永久保存到数据库。(此时即使系统崩溃,修改的数据也不会丢失。持久性是个有占模糊的概念,因为实际上持久性也分很多不同的级别。有些持久性策略能够提供非常强的安全保障,而有些则未必,而且不可能有能做到100%的持久性保证的策略。)
是利用Innodb的redo log。当做数据修改的时候,不仅在内存中操作,还会在redo log中记录这次操作。当事务提交的时候,会将redo log日志进行刷盘(redo log一部分在内存中,一部分在磁盘上)。当数据库宕机重启的时候,会将redo log中的内容恢复到数据库中,再根据undo log和binlog内容决定回滚数据还是提交数据。redo log体积小,刷盘快。redo log是一直往末尾进行追加,属于顺序IO。效率显然比随机IO来的快
5.redis的原理和优点
redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hashs(哈希类型)
这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的.
在此基础上,redis支持各种不同方式的排序.与memcached一样,为了保证效率,数据都是缓存在内存中.区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步.
Redis的优点:
性能极高 – Redis能支持超过 100K+ 每秒的读写频率。
丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
原子 – Redis的所有操作都是原子性的,同时Redis还支持对几个操作全并后的原子性执行。
丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。
6.Mysql中的锁机制
Mysql用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。这些锁统称为悲观锁
MySQL的锁机制比较简单,其最 显著的特点是不同的存储引擎支持不同的锁机制。比如,MyISAM和MEMORY存储引擎采用的是表级锁(table-level locking);BDB存储引擎采用的是页面锁(page-level locking),但也支持表级锁;InnoDB存储引擎既支持行级锁(row-level locking),也支持表级锁,但默认情况下是采用行级锁。
表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。
行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。
页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般
从上述特点可见,很难笼统地说哪种锁更好,只能就具体应用的特点来说哪种锁更合适!仅从锁的角度 来说:表级锁更适合于以查询为主,只有少量按索引条件更新数据的应用,如Web应用;而行级锁则更适合于有大量按索引条件并发更新少量不同数据,同时又有 并发查询的应用,如一些在线事务处理(OLTP)系统。
7.ABC联合索引生效问题
对于复合索引:Mysql从左到右的使用索引中的字段,一个查询可以只使用索引中的一部份,但只能是最左侧部分。例如索引是key index (a,b,c)。 可以支持a | a,b| a,b,c 3种组合进行查找,但不支持 b,c进行查找 .当最左侧字段是常量引用时,索引就十分有效。
对于复合索引:Mysql从左到右的使用索引中的字段,一个查询可以只使用索引中的一部份,但只能是最左侧部分。例如索引是key index (a,b,c)。 可以支持a | a,b| a,b,c 3种组合进行查找,但不支持 b,c进行查找 .当最左侧字段是常量引用时,索引就十分有效。
E. 数据库面试常问问题有哪些
1、什么是数据库事务
数据库事务是构成单一逻辑工作单元的操作集合。数据库事务可以包括一个或多个数据库操作,但是这些操作构成一个逻辑上的整体。
2、数据库事务的四个特性(ACID)
A:原子性,事务中的所有操作作为一个整体不可分割,要么全部操作要么全部不操作。
C:一致性,事务的执行结果必须使数据库从一个一致性状态转为另一个一致性状态。一致性状态:1.系统状态满足数据库的完整性约束,2.系统的状态反映数据库所描述的现实世界的真实状态。
I:隔离性:并发执行的事务不会相互影响,其对数据库的影响和他们串行执行时一样。
D:持久性:事务一旦提交,对数据库的影响就是持久的。任何事务或系统故障都不会导致数据丢失。
3、什么是数据库连接泄露
数据库连接泄露指的是如果在某次使用或者某段程序中没有正确地关闭Connection、Statement和ResultSet资源,那么每次执行都会留下一些没有关闭的连接,这些连接失去了引用而不能得到重新使用,因此就造成了数据库连接的泄漏。数据库连接的资源是宝贵而且是有限的,如果在某段使用频率很高的代码中出现这种泄漏,那么数据库连接资源将被耗尽,影响系统的正常运转。
4、聚集索引
数据行的物理顺序与列值的顺序相同,如果我们查询id比较靠后的数据,那么这行数据的地址在磁盘中的物理地址也会比较靠后。而且由于物理排列方式与聚集索引的顺序相同,所以也就只能建立一个聚集索引了。
5、主键与外键
关系型数据库中的一条记录中有若干个属性,若其中某一个属性组(注意是组)能唯一标识一条记录,该属性组就可以成为一个主键。
外键用于与另一张表的关联。是能确定另一张表记录的字段,用于保持数据的一致性。比如,A表中的一个字段,是B表的主键,那他就可以是A表的外键。
F. 如何处理数据库并发问题
想要知道如何处理数据并发,自然需要先了解数据并发。
什么是数据并发操作呢?
就是同一时间内,不同的线程同时对一条数据进行读写操作。
在互联网时代,一个系统常常有很多人在使用,因此就可能出现高并发的现象,也就是不同的用户同时对一条数据进行操作,如果没有有效的处理,自然就会出现数据的异常。而最常见的一种数据并发的场景就是电商中的秒杀,成千上万个用户对在极端的时间内,抢购一个商品。针对这种场景,商品的库存就是一个需要控制的数据,而多个用户对在同一时间对库存进行重写,一个不小心就可能出现超卖的情况。
针对这种情况,我们如何有效的处理数据并发呢?
第一种方案、数据库锁
从锁的基本属性来说,可以分为两种:一种是共享锁(S),一种是排它锁(X)。在MySQL的数据库中,是有四种隔离级别的,会在读写的时候,自动的使用这两种锁,防止数据出现混乱。
这四种隔离级别分别是:
读未提交(Read Uncommitted)
读提交(Read Committed)
可重复读(Repeated Read)
串行化(Serializable)
当然,不同的隔离级别,效率也是不同的,对于数据的一致性保证也就有不同的结果。而这些可能出现的又有哪些呢?
脏读(dirty read)
当事务与事务之间没有任何隔离的时候,就可能会出现脏读。例如:商家想看看所有的订单有哪些,这时,用户A提交了一个订单,但事务还没提交,商家却看到了这个订单。而这时就会出现一种问题,当商家去操作这个订单时,可能用户A的订单由于部分问题,导致数据回滚,事务没有提交,这时商家的操作就会失去目标。
不可重复读(unrepeatable read)
一个事务中,两次读操作出来的同一条数据值不同,就是不可重复读。
例如:我们有一个事务A,需要去查询一下商品库存,然后做扣减,这时,事务B操作了这个商品,扣减了一部分库存,当事务A再次去查询商品库存的时候,发现这一次的结果和上次不同了,这就是不可重复读。
幻读(phantom problem)
一个事务中,两次读操作出来的结果集不同,就是幻读。
例如:一个事务A,去查询现在已经支付的订单有哪些,得到了一个结果集。这时,事务B新提交了一个订单,当事务A再次去查询时,就会出现,两次得到的结果集不同的情况,也就是幻读了。
那针对这些结果,不同的隔离级别可以干什么呢?
“读未提(Read Uncommitted)”能预防啥?啥都预防不了。
“读提交(Read Committed)”能预防啥?使用“快照读(Snapshot Read)”方式,避免“脏读”,但是可能出现“不可重复读”和“幻读”。
“可重复读(Repeated Red)”能预防啥?使用“快照读(Snapshot Read)”方式,锁住被读取记录,避免出现“脏读”、“不可重复读”,但是可能出现“幻读”。
“串行化(Serializable)”能预防啥?有效避免“脏读”、“不可重复读”、“幻读”,不过运行效率奇差。
好了,锁说完了,但是,我们的数据库锁,并不能有效的解决并发的问题,只是尽可能保证数据的一致性,当并发量特别大时,数据库还是容易扛不住。那解决数据并发的另一个手段就是,尽可能的提高处理的速度。
因为数据的IO要提升难度比较大,那么通过其他的方式,对数据进行处理,减少数据库的IO,就是提高并发能力的有效手段了。
最有效的一种方式就是:缓存
想要减少并发出现的概率,那么读写的效率越高,读写的执行时间越短,自然数据并发的可能性就变小了,并发性能也有提高了。
还是用刚才的秒杀举例,我们为的就是保证库存的数据不出错,卖出一个商品,减一个库存,那么,我们就可以将库存放在内存中进行处理。这样,就能够保证库存有序的及时扣减,并且不出现问题。这样,我们的数据库的写操作也变少了,执行效率也就大大提高了。
当然,常用的分布式缓存方式有:Redis和Memcache,Redis可以持久化到硬盘,而Memcache不行,应该怎么选择,就看具体的使用场景了。
当然,缓存毕竟使用的范围有限,很多的数据我们还是必须持久化到硬盘中,那我们就需要提高数据库的IO能力,这样避免一个线程执行时间太长,造成线程的阻塞。
那么,读写分离就是另一种有效的方式了
当我们的写成为了瓶颈的时候,读写分离就是一种可以选择的方式了。
我们的读库就只需要执行读,写库就只需要执行写,把读的压力从主库中分离出去,让主库的资源只是用来保证写的效率,从而提高写操作的性能。
G. 一般数据库中容易存在哪些问题可以通过什么途径来解决这些问题
一般数据库中容易存在四种问题,分别是:语句错误;用户进程错误;网络故障;用户错误。
语句错误:单个数据库操作(选择、插入、更新或删除)失败。可以尝试在表中输入无效的数据,与用户合作来验证并更改数据。
用户进程错误:用户非登出的异常退出用户会话异常终止程序错误导致会话结束,对于上述错误,实例后台进程 PMON 会自动回滚未提交的事务,并释放相关锁资源。
网络故障:与数据库的连接断开。通过备份监听程序、网络连接和网络接口卡可降低出现网络故障时影响系统可用性的可能性。
用户错误:用户成功完成了操作,但是操作不正确(删除了表,或输入了错误数据)。用户可能会无意删除或修改数据。如果发生这种情况, DBA 可能需要帮助用户从错误中恢,如果用户尚未提交或退出程序,则只可以回退操作。