程序员我爱编程

数据库问题总结

2018-05-27  本文已影响94人  Hwyoung

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

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

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

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

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

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

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

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

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

阅读:索引详解

(三)什么是事务?

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

建议阅读:数据库事务 - 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分别在什么场景之下使用?

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

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

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

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

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

(十)说一说三个范式。

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

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

(十二)事务的隔离级别

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

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

隔离级别 脏读 不可重复读 幻读
未提交读 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. 按使用方式:乐观锁,悲观锁(并发控制的技术手段)

[工作原理:读出数据时,连同读出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

上一篇 下一篇

猜你喜欢

热点阅读