剑指offer------mysql常见面试题

事务的四大特性:

原子性:不可分割的操作单元,事务中所有的操作,要么全部成功,要买撤回到执行事务之前的状态

一致性:如果执行事务之前数据库是一致的,那么执行事务之后数据库也是一致的

隔离性:事务操作之间彼此独立和不透明互不影响,事务独立运行,通常使用锁来实现,一个事务处理后的结果,影响了其他事务,那么其他事务会撤回

持久性:事务一旦提交,其结果就是永久的。

事务隔离级别:

未提交读(read uncommmitted)未提交,允许脏读,其他事务只要是修改了数据,即使未提交,本事务也能看到修改后的数据值。

提交读(read commmitted):只能读取到已经提交的数据

可重复读(repeated read)数据,在这个事务中看到的数据值始终不受其他事务影响。

串行读,每次读都需要获得表级共享锁,读写互相都会阻塞

mysql数据库默认使用可重复读

 

索引相关:

数据库索引,是数据库管理系统中一个排序的数据结构,以协助快速查询、更新数据库表中的结构

mysql四大索引:

index:普通索引,数据可以重复,没有任何限制

unique:唯一索引,要求索引列的值必须唯一,但允许有空值,如果是组合索引,那么列值的组合必须唯一

primary key :主键索引,是一种特殊的唯一索引,一个表只能有一个主键,不允许有空值,一般是在创建表的同时创建主键索引

组合索引:在多个字段上创建索引,只有在查询条件中使用了创建索引时的第一个字段,索引才会被引用。

sql语句分类:

DDL:数据定义语言(create drop)

DML:数据操作语句(insert update delete)

DQL:数据查询语句(select )

DCL:数据控制语句,进行授权和权限回收(grant revoke)

TPL:数据事务语句(commit collback savapoint)

 

数据库的三大范式:

第一范式:1NF是对属性的原子性约束,要求字段具有原子性,不可再分解性

第二范式:2NF是在第一范式的前提下,非主键字段不能出现部分依赖主键,解决:消除复合主键就可以避免出现部分以来,可增加单列关键字

第三范式:3NF是在满足第二范式的前提下,非主键字段不能出现传递依赖,比如某个字段a依赖于主键,而一些字段依赖字段a,这就是传递依赖,解决:将一个实体信息放在一个表内实现

 

 脏读、幻读、不可重复读:

脏读:是指将事务T1将某一值修改,然后事务T2读取该值,之后T1因为某种原因撤销对该值的修改,这就导致了T2所读取到数据是无效的

不可重复读:是指数据库访问时,一个事务范围内的两次相同查询却返回了不同的数据。在一个事务内多次都同一数据,在这个事务还没有结束是,另一个事务也访问到了该同一数据,那么在第一个事务中的两次数据之间,由于第二个事务的修改,导致了第一个事务两次读取到的数据可能是不一样的,因此称为不可重复读。

幻读:是指当事务不是独立指向时发生的一种现象,比如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中全部的数据行。同时,第二个事务也修改了这个表中的数据,这种修改是向表中插入一行新数据,那么就会发生,操作第一个属事务的用户发现表中还有没有修改的数据行,就好像发生了幻觉一样

不可重复读&幻读的区别:

如果使用锁机制来实现这两种隔离级别,在可重复读中,该sql第一次读取到数据后,就将这些数据加锁,其他事务无法修改这些数据,就可以实现可重复读了。但这种方法无法所著insert的数据,所以当事务A先前读取了数据,或者修改了全部数据,那么事务B还是可以insert数据提交,这时事务A就会莫名其妙多了一条之前没有国平的数据,这就是幻读,不能通过行锁俩避免。需要串行隔离级别,读用读锁,写用写锁,读锁和写锁互斥,

delete、drop、truncate区别:

 

  • 删除数据的速度,drop> truncate > delete
  • delete属于DML语言,需要事务管理,commit之后才能生效。drop和truncate属于DDL语言,操作立刻生效,不可回滚。
  • 使用场合:
    • 当你不再需要该表时, 用 drop;
    • 当你仍要保留该表,但要删除所有记录时, 用 truncate;
    • 当你要删除部分记录时(always with a where clause), 用 delete.

 

 

Mysql中的所类型:

MyISAM支持表锁,InnoDB支持表锁和行锁,默认行锁

表级锁:开销小,加锁快,不会出现死锁。锁定力度大,发生锁冲突的概率最高,并发量最低

行级锁:开销大,加锁慢,会出现死锁。锁力度小,发生所冲突的概率小,并发度最高

存储过程: 

sql执行时候需要先编译,然后执行

存储过程是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数来调用执行它

一个存储过程是一个可编程的函数,它在数据库中创建并保存,它可以由SQL语句和一些特殊的控制结构组成,当希望在不同的应用程序或者平台上执行相同的函数,或者封装特定功能时,据库中的存储过程可以看做是对编程中面向对象方法的模拟。它允许控制数据的访问方式。

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值