神刀安全网

数据库问题总结

(一)什么是存储过程?有哪些优缺点?

存储过程是一些预编译的SQL语句,简单来讲就是为以后使用而保存的一条或多条sql语句的集合.(模块化编程)

  • 存储过程是一个预编译的代码块,简化复杂的操作.
  • 不用反复在建立一系列的处理步骤,出错率降低.
  • 可以一定程度上确保数据安全
  • 提高性能

(简单,安全,高效) 缺点:编写过程复杂

如果你对存储过程不熟悉,建议阅读:存储过程详解-博客园

(二)索引是什么?有什么作用以及优缺点?

索引是对数据库表中一或多个列的值进行排序的结构,是帮助MySQL高效获取数据的数据结构

你也可以这样理解:索引就是加快查找表中数据的方法。数据库的索引类似于书籍的索引。在书籍中,索引允许用户不必翻阅完整个书就能迅速地找到所需要的信息。在数据库中,索引也允许数据库程序迅速地找到表中的数据,而不必扫描整个数据库。

_MySQL数据库几个基本的索引类型:普通索引、唯一索引、主键索引、全文索引 _

缺点:对于update/insert/delete的每次执行,字段的索引都必须重新计算更新。

阅读:索引详解

(三)什么是事务?

事务是并发控制的基本单位,它是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位。

  • Atomic(原子性):事务中包含的操作被看做一个逻辑单元,这个逻辑单元中的操作要么全部成功,要么全部失败。

  • Consistency(一致性):事务结束后系统状态一致.

  • Isolation(隔离性):并发执行的事务彼此之间不能通信,事务之间的操作是独立的.

  • Durability(持久性):事务完成后的改动都会被持久化.固定化.即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。

建议阅读:数据库事务 – Mr. David 专栏

数据库隔离级别

(四)数据库的乐观锁和悲观锁是什么?

数据库管理系统(DBMS)中的并发控制的任务是确保在多个事务同时存取数据库中同一数据时不破坏事务的隔离性和统一性以及数据库的统一性。

乐观锁,悲观锁是并发控制主要采用的技术手段。为了确保多个事务同时操作同一数据的隔离性和统一性.

  • 悲观锁:假定会发生并发冲突,屏蔽一切可能违反数据完整性的操作
  • 乐观锁:假设不会发生并发冲突,只在提交操作时检查是否违反数据完整性。

建议阅读:(十五)锁放在一起讲

(五) 使用索引查询一定能提高查询的性能吗?为什么

通常,通过索引查询数据比全表扫描要快.但是我们也必须注意到它的代价.

索引需要空间来存储,也需要定期维护, 每当有记录在表中增减或索引列被修改时,索引本身也会被修改.这意味着每条记录的INSERT,DELETE,UPDATE将为此多付出4,5 次的磁盘I/O.因为索引需要额外的存储空间和处理,那些不必要的索引反而会使查询反应时间变慢.使用索引查询不一定能提高查询性能,索引范围查询适用于两种情况:

  1. 基于一个范围的检索,一般查询返回结果集小于表中记录数的30%
  2. 基于非唯一性索引的检索

(六)简单说一说drop、delete与truncate的区别

delete和truncate只删除表的数据不删除表的结构
速度,一般来说:drop> truncate >delete

delete语句是dml,这个操作会放到rollback segement中,事务提交之后才生效;
如果有相应的trigger,执行的时候将被触发.truncate,drop是ddl, 操作立即生效,原数据不放到rollback segment中,不能回滚. 操作不触发trigger.

(七)drop、delete与truncate分别在什么场景之下使用?

  • 不再需要一张表的时候,用drop(同时删除表的结构)
  • 想删除部分数据行时候,用delete,并且带上where子句(删除部分数据)
  • 保留表而删除所有数据的时候用truncate(删除全部数据)

(八) 超键、候选键、主键、外键分别是什么?

  • 超键:在关系中能唯一标识元组的属性集称为关系模式的超键。一个属性可以为作为一个超键,多个属性组合在一起也可以作为一个超键。超键包含候选键和主键。

  • 候选键:是最小超键,即没有冗余元素的超键。

  • 主键:数据库表中对储存数据对象予以唯一和完整标识的数据列或属性的组合。一个数据列只能有一个主键,且主键的取值不能缺失,即不能为空值(Null)。

  • 外键:在一个表中存在的另一个表的主键称此表的外键。

(九)什么是视图?以及视图的使用场景有哪些?

视图是一种虚拟的表,具有和物理表相同的功能。可以对视图进行增,改,查,操作,试图通常是有一个表或者多个表的行或列的子集。对视图的修改不影响基本表。它使得我们获取数据更容易,相比多表查询。

–只暴露部分字段给访问者,所以就建一个虚表,就是视图。

查询的数据来源于不同的表,而查询者希望以统一的方式查询,这样也可以建立一个视图,把多个表查询结果联合起来,查询者只需要直接从视图中获取数据,不必考虑数据来源于不同表所带来的差异

(十)说一说三个范式。

  • 第一范式(1NF):数据库表中的字段都是单一属性的,不可再分。(字段原子性)

  • 第二范式(2NF):数据库表中不存在非关键字段对任一候选关键字段的部分函数依赖,(非主属性完全依赖主属性)

  • 第三范式(3NF):在第二范式的基础上,数据表中如果不存在非关键字段对任一候选关键字段的传递函数依赖则符合第三范式。所谓传递函数依赖,指的是如果存在”A → B → C”的决定关系,则C传递函数依赖于A。因此,满足第三范式的数据库表应该不存在如下依赖关系: 关键字段 → 非关键字段x → 非关键字段y(其他属性之间不纯在传递依赖)

(十一)事务并发访问时,可能会出现的问题

  • 脏读:一个事务读取到了另外一个事务没有提交的数据
  • 不可重复读:在同一事务中,两次读取同一数据,得到内容不同
  • 幻读:同一事务中,用同样的操作读取两次,得到的记录数不相同

(十二)事务的隔离级别

  • 未提交读: 事务中的修改,即使没有提交,对其它事务也是可见的
  • 提交读:一个事务只能读取已经提交的事务所做的修改。换句话说,一个事务所做 的修改在提交之前对其它事务是不可见的。
  • 可重复读:保证在同一个事务中多次读取同样数据的结果是一样的。
  • 可串行化:强制事务串行执行。

隔离级别高的数据库的可靠性高,但并发量低,而隔离级别低的数据库可靠性低,但并发量高,系统开销小

隔离级别 脏读 不可重复读 幻读
未提交读 YES YES YES
提交读 NO YES YES
可重复读 NO NO YES
可串行化 NO NO NO

(十三)Mysql的复制

** (1).master将数据改变记录到二进制日志(binary log)中,也即是配置文件log-bin指定的文件(这些记录叫做二进制日志事件,binary log events)
(2).slave将master的binary log events拷贝到它的中继日志(relay log)
(3).slave重做中继日志中的事件,将改变反映它自己的数据(数据重演)

附简要原理图:

数据库问题总结

image.png

ref:
mysql 5.6.14主从复制(也称mysql AB复制)环境配置
http://www.it165.net/database/html/201311/4851.html
MySQL主从复制原理、主从复制(异步)、半同步复制、基于SSL复制
http://www.it165.net/database/html/201406/6835.html

(十四)数据库的分类

关系型:
mysql
oracle
PostgreSQL

NoSQL(泛指非关系型)
Mongodb数据属于文档型非关系数据库;
Redis属于KV键值数据库
Hbase属于列数据库

(十五) 数据库中的锁

1. 按级别:排他锁(X)和共享锁(S)

  • 一个事务对对象加了排他锁,就可以对他进行读写和更新,其他事务不可以对其加锁.
  • 一个事务对对象加了共享锁,可以进行读取操作,不能进行更新操作,加锁期间其他事务只能加共享锁.

2.按粒度: 行级锁,表级锁,页级锁

  • 行级锁:粒度最小,发生冲突概率低,并发性最好.开销大,加锁慢,会出现死锁.(对指定行加锁)
  • 表级锁:粒度最大,冲突概率高,并发性不好,开销小,加锁快,不会发生死锁(直接锁整个表,不可写)
  • 页级锁:粒度介于行,表之间,并发性一般,加锁速度和开销也介于行,表锁之间.会出现死锁.(一次锁定相邻的一组记录)

3. 按使用方式:乐观锁,悲观锁(并发控制的技术手段)

  • 悲观锁:假定会发生并发冲突,屏蔽一切可能违反数据完整性的操作。
    [从数据库开始更改时就锁住数据库,知道更改完成才释放][for update]

  • 乐观锁:假设不会发生并发冲突,只在提交操作时检查是否违反数据完整性。乐观锁不能解决脏读的问题。
    [实现:.数据版本记录机制,(每一行数据多一个字段version,每次跟新多要跟新对应的版本号+1)]

[工作原理:读出数据时,连同读出version,跟新时+1,提交时版本号必须大于数据库当前版本号,否则不能更新]

使用场景:并发量并不大,可以用悲观锁,并发量大,使用乐观锁.

(十六).Mysql存储引擎的锁机制

  • MyISAM和MEMORY采用表级锁
  • InnoDB支持行级锁和表级锁,默认为行级锁 (用到索引才会执行行级锁)

(十七).避免死锁

1、如果不同程序会并发存取多个表,尽量约定以相同的顺序访问表,可以大大降低死锁机会。
2、在同一个事务中,尽可能做到一次锁定所需要的所有资源,减少死锁产生概率;
3、对于非常容易产生死锁的业务部分,可以尝试使用升级锁定颗粒度,通过表级锁定来减少死锁产生的概率;

(十八).事务和存储过程的区别

1.事务存储在项目里,存储过程是保存在数据库里的
2.存储过程的逻辑是纯SQL写的,事务中的编程语言(java,c++等)

(十九)MYSIME和InnoDB区别

1.mysime支持全文搜索,速度快
2.InnoDB支持事务
3.InnoDB支持外键
4.mysime使用的索引是非聚簇索引,InnoDB是聚簇索引
5.mysime支持表级锁,InnoDB支持表级,行级锁.

(二十)对于大量访问量的数据库,怎么优化

LINK TO MY BLOG

(二十一)一张表,id自增,inset7条数据后,删了567三条,在insert一条后,这个id是8还是5

MyISAM是8
InnoDB是5

转载本站任何文章请注明:转载至神刀安全网,谢谢神刀安全网 » 数据库问题总结

分享到:更多 ()