mysql数据库面试总结
2017年09月04日 00:11:40

阅读数:151

结合网上大神还有自己面试经历,收集的总结Mysql面试题,方便自己准备面试;

mysql一个永远都复习不完,尽量总结,差不多就可以去面试(个人观点)

1、数据库事务的四个特性及含义

  • 数据库事务transanction正确执行的四个基本要素。ACID,原子性(Atomicity)、一致性(Correspondence)、隔离性(Isolation)、持久性(Durability)。
  • 原子性:整个事务中的所有操作,要么全部完成,要么全部不完成,不可能停滞在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。
  • 一致性:在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏。
  • 隔离性:隔离状态执行事务,使它们好像是系统在给定时间内执行的唯一操作。如果有两个事务,运行在相同的时间内,执行 相同的功能,事务的隔离性将确保每一事务在系统中认为只有该事务在使用系统。这种属性有时称为串行化,为了防止事务操作间的混淆,必须串行化或序列化请 求,使得在同一时间仅有一个请求用于同一数据。
  • 持久性:在事务完成以后,该事务所对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。
  • 一般也会问事务的四个级别,理解事务并发问题的前提: 在多个事务同时使用相同的数据的时候,可能会出现并发问题。

2、事务的隔离级别

  • 为了平衡事务并发问题的解决与数据库的效率,设计了多种隔离级别:

    • 数据库事务的隔离级别有4个,由低到高依次为Read uncommitted(读未提交)、Read committed(读提交)、Repeatable read(重复读)、Serializable(序列化),这四个级别可以逐个解决脏读、不可重复读、幻读这几类问题。

          隔离级别            脏读   不可重复读   虚读(幻读)
      Read uncommitted √ √ √
      Read committed × √ √
      Repeatable read × × √
      Serializable × × ×
      备注: √: 可能出现 ×: 不会出现
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7

补充:故事

  1. Read uncommitted 读未提交

    • 公司发工资了,领导把5000元打到长贵的账号上,但是该事务并未提交,而长贵的正好去查看账户,发现工资已经到账,是5000元整,非常高兴。可是不幸的是,领导发现发给长贵的工资金额不对,是2000元,于是迅速回滚了事务,修改金额后,将事务提交,最后长贵实际的工资只有2000元,长贵空欢喜一场。

    • 出现上述情况,即我们所说的脏读,两个并发的事务,“事务A:领导给长贵发工资”、“事务B:长贵查询工资账户”,事务B读取了事务A尚未提交的数据。

    • 当隔离级别设置为Read uncommitted时,就可能出现脏读,如何避免脏读,请看下一个隔离级别。

      1. Read committed 读提交
    • 长贵拿着工资卡去消费,系统读取到卡里确实有2000元,而此时她的老婆谢大脚也正好在网上转账,把谢大脚把工资卡的2000元转到自己的账户,并在长贵之前提交了事务,当长贵扣款时,系统检查到长贵的工资卡已经没有钱,扣款失败,长贵十分纳闷,明明卡里有钱,为何……

    • 出现上述情况,即我们所说的不可重复读,两个并发的事务,“事务A:长贵消费”、“事务B:长贵的老婆谢大脚网上转账”,事务A事先读取了数据,事务B紧接了更新了数据,并提交了事务,而事务A再次读取该数据时,数据已经发生了改变。

    • 当隔离级别设置为Read committed时,避免了脏读,但是可能会造成不可重复读。大多数数据库的默认级别就是Read committed,比如Sql Server , Oracle。如何解决不可重复读这一问题,请看下一个隔离级别。

      1. Repeatable read 重复读
    • 当隔离级别设置为Repeatable read时,可以避免不可重复读。当长贵拿着工资卡去消费时,一旦系统开始读取工资卡信息(即事务开始),长贵的老婆就不可能对该记录进行修改,也就是长贵的老婆不能在此时转账。

    • 虽然Repeatable read避免了不可重复读,但还有可能出现幻读。

    • 谢大脚查看长贵的工资卡消费记录。有一天,她正在查询到长贵当月信的总消费金额(select sum(amount) from transaction where month = 本月)为80元,而长贵此时正好在外面胡吃海塞后在收银台买单,消费1000元,即新增了一条1000元的消费记录(insert transaction … ),并提交了事务,随后谢大脚将长贵当月消费的明细打印到A4纸上,却发现消费总额为1080元,谢大脚很诧异,以为出现了幻觉,幻读就这样产生了。

    • 简单的说,幻读指当用户读取某一范围的数据行时(不是同一行数据),另一个事务又在该范围内插入了新行,当用户再读取该范围的数据行时,会发现有新的“幻影” 行。

    • Serializable,序列化。最严格的事务隔离。要求事务序列化执行,即一个接一个执行,不能并发执行。不会有任何问题,但是效率太低,实际中,很少会设置这个级别。

3、drop,delete与truncate的区别

  • 这个很长,一般只要记住delete是DML语句,不会自动提交。drop/truncate都是DDL语句,执行后会自动提交。
  • TRUNCATE 和DELETE只删除数据, DROP则删除整个表(结构和数据)。
  • 速度性能而言,drop > truncate > delete
  • 具体链接:http://www.cnblogs.com/8765h/archive/2011/11/25/2374167.html

mysql引擎

  • 在MySQL数据库中存在着多种引擎(不同版本的MySQL数据库支持的引擎不同),熟悉各种引擎才能在软件开发中应用引擎,从而开发出高性能的软件
  • 链接:http://blog.csdn.net/gaohuanjie/article/details/50944782
  • 默认 InnoDB:该存储引擎为MySQL表提供了ACID事务支持、系统崩溃修复能力和多版本并发控制(即MVCC Multi-Version Concurrency Control)的行级锁;该引擎支持自增长列(auto_increment),自增长列的值不能为空,如果在使用的时候为空则自动从现有值开始增值,如果有但是比现在的还大,则直接保存这个值; 该引擎存储引擎支持外键(foreign key) ,外键所在的表称为子表而所依赖的表称为父表。该引擎在5.5后的MySQL数据库中为默认存储引擎。
  • 记住两个即可,MyISAM(搜索方面会比较好)

索引方面

  • 创建索引的好处:创建唯一性索引,可以保证数据库表中每一行数据的唯一性。加大搜索速度,查询性能提高,提高系统性能
  • 缺点:创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大。当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。
  • 索引失效的情况:
  • 1.索引不存储null值,更准确的说,单列索引不存储null值,复合索引不存储全为null的值。索引不能存储Null,所以对这列采用is null条件时,因为索引上根本没Null值,不能利用到索引,只能全表扫描。
  • 2.不适合键值较少的列(重复数据较多的列),
  • 3.前导模糊查询不能利用索引(like ‘%XX’或者like ‘%XX%’)
  • 4.索引失效的几种情况 
    • 1.如果条件中有or,即使其中有条件带索引也不会使用(这也是为什么尽量少用or的原因)要想使用or,又想让索引生效,只能将or条件中的每个列都加上索引
    • 2.对于多列索引,不是使用的第一部分,则不会使用索引
    • 3.like查询以%开头
    • 4.如果列类型是字符串,那一定要在条件中将数据使用引号引用起来,否则不使用索引
    • 5.如果mysql估计使用全表扫描要比使用索引快,则不使用索引
  • 链接:http://www.cnblogs.com/binyue/p/4058931.html

Mysql性能提升

  • sql语句效率提升:太多了,建议把索引失效的几种情况说下,
  • 链接:http://www.cnblogs.com/lykbk/p/aefweere45454545454.html
  • mysql性能提升:还是太多了,链接:http://www.jianshu.com/p/5dd73a35d70f
  • 个人总结: 
    • 1、搜索引擎的选取,MySQL默认innodb(支持事务),可以选择MYISAM(有b-tree算法查询)还有其他不同引擎
    • 2、服务器的硬件提升
    • 3、索引方面
    • 4、建表的时候尽量使用notnull
    • 5、字段尽量固定长度
    • 6、垂直分隔(将很多字段多分成几张表),水平分隔(将大数据的表分成几个小的数量级,分成几张表,还可以分开放在几个数据库中,利用集群的思想)
    • 7、优化sql语句(查询执行速度比较慢的sql语句))
    • 8、添加适当存储过程,触发器,事务等
    • 9、表的设计要符合三范式。
    • 10、读写分离(主从数据库)

数据库三范式简单理解

面试题: mysql数据库 已看1 索引和事务 没用的更多相关文章

  1. 面试题: mysql 数据库已看 sql安全性 索引 引擎 sql优化

    总结的一些MySQL数据库面试题 2016年06月16日 11:41:18 阅读数:4950 一.sql语句应该考虑哪些安全性? (1)防止sql注入,对特殊字符进行转义,过滤或者使用预编译的sql语 ...

  2. 面试题: mysql数据库 已看1 简单的sql练习

    数据库总结--MySQL常见面试题 2015年03月24日 17:56:06 阅读数:7787 1.根据部门号从高到低,工资从低到高列出员工的信息 select * from employee ord ...

  3. MySQL 数据库性能优化之索引优化

    接着上一篇 MySQL 数据库性能优化之表结构,这是 MySQL数据库性能优化专题 系列的第三篇文章:MySQL 数据库性能优化之索引优化 大家都知道索引对于数据访问的性能有非常关键的作用,都知道索引 ...

  4. Mysql数据库的数据类型、索引、锁、事务和视图

    Mysql数据库的数据类型.索引.锁.事务和视图 数据的类型 1)数据类型: 数据长什么样? 数据需要多少空间来存放? 系统内置数据类型和用户定义数据类型 2)MySql 支持多种列类型: 数值类型 ...

  5. 重新学习MySQL数据库9:Innodb中的事务隔离级别和锁的关系

    重新学习MySQL数据库9:Innodb中的事务隔离级别和锁的关系 Innodb中的事务隔离级别和锁的关系 前言: 我们都知道事务的几种性质,数据库为了维护这些性质,尤其是一致性和隔离性,一般使用加锁 ...

  6. 面试题: 数据库 oracle数据库 已看1 意义不大 有用

    Oracle数据库面试题总结 2017年04月27日 22:41:44 阅读数:9271 1.SQL语句分类 DQL(数据查询语言)select DML(数据操作语言)insert.delete.up ...

  7. 面试题: 数据库 已看1 group by 和order by的练习 sql语句练习简单 有用

    1.Sql 约束 http://www.cnblogs.com/henw/archive/2012/08/15/2639510.html 2.修改列类型 MySQL:ALTER TABLE table ...

  8. mysql数据库补充知识7 索引原理与慢查询优化

    一 介绍 为何要有索引? 一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,在生产环境中,我们遇到最多的,也是最容易出问题的,还是一些复杂的查询操作,因此对查询语句 ...

  9. MySQL数据库(一)索引

    索引的作用是操作数据库时避免全表扫描. 索引的机制 B Tree与B+Tree索引 B(blance) 树可以看作是对2-3查找树的一种扩展,即他允许每个节点有M-1个子节点. 根节点至少有两个子节点 ...

随机推荐

  1. windows 10 python 2.7和python3.6共存解决方法和pip安装

    一.首先去python官网将两个版本下载并安装: 然后进入windows的环境变量,检查下面4个变量: 1.C:\Python272.C:\Python27\Scripts3.D:\software\ ...

  2. MySQL 优化1

    系统在应用时间很长的情况下会慢慢变得很慢,无论是人还是机器为了更好的工作和学习都需要适当学习.数据库也是一样的用久了, 自然就会产生空间碎片,需要我们都i数据库中的数据块进行维护和整理.下面以实例来说 ...

  3. python 基础 4.5 用函数实现九九乘法表

    #/usr/bin/python #coding=utf-8 #@Time   :2017/11/3 10:44 #@Auther :liuzhenchuan #@File   :用函数实现九九乘法口 ...

  4. testng testcase失败重试

    简单介绍 需求场景:测试移动端应用,常会因为点击失效.网络延迟大等原因导致测试脚本失败.这时,需要自动重新运行失败的脚本,直到脚本成功通过或者到达限定重试次数. 解决方案:实现testng的IRetr ...

  5. Database: coursera assignment 1

    q.1: Find the titles of all movies directed by Steven Spielberg. select title from moviewhere direct ...

  6. 51Nod 1627 瞬间移动 —— 组合数学

    题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1627 1627 瞬间移动  基准时间限制:1 秒 空间限制:1 ...

  7. 算法(Algorithms)第4版 练习 1.3.20

    方法实现: //1.3.20 /** * delete the kth element in a linked list, if it exists. * * @param k the kth ele ...

  8. Android USB 开发详解

    Android USB 开发详解 先附上 Android USB 官方文档 Android通过两种模式支持各种 USB 外设和 Android USB 附件(实现Android附件协议的硬件):USB ...

  9. RQNOJ 57 找啊找啊找GF:01背包

    题目链接:https://www.rqnoj.cn/problem/57 题意: sqybi在七夕这天太无聊了,所以他想去给自己找GF. 总共有n个MM. 搞定第i个MM要花费rmb[i]块大洋.rp ...

  10. 分享知识-快乐自己:SpringMVC 结合使用拦截器(判断是否用户是否已登陆)

    基础拦截器操作: 拦截器是一种AOP操作实现,那么在AOP之中用户一定不需要去关注拦截器的存在,用户只需要按照自己已经习惯的处理方式进行代码的编写即可. 首先我们先创建一个自定义的拦截器: packa ...