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、读写分离(主从数据库)

数据库三范式简单理解

  • 链接: http://blog.csdn.net/z1002137615/article/details/50836263

转载于:https://www.cnblogs.com/shan1393/p/9117686.html

面试题: 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数据库 已看1 简单的sql练习

    1.根据部门号从高到低,工资从低到高列出员工的信息 select * from employee order by dept_id desc,salary 2.union和union all的区别 用 ...

  4. MySQL数据库的数据类型和索引

    数据库的数据库索引对程序员来说是透明的,意味着数据库建立索引之前和之后,你的SQL语句都可以正常运行,索引的运用只是数据库引擎工作时候的优化手段.但是,这不是意味着数据库索引仅仅是数据库设计和运维者的 ...

  5. 数据库-面试题-MySQL数据库的优化方法

    数据库-面试题-MySQL数据库的优化方法 2017年08月22日 17:56:57 小笛子的专栏 阅读数 13236 1.选取最适用的字段属性 MySQL可以很好的支持大数据量的存取,但是一般说来, ...

  6. 面试题——Mysql数据库管理系统篇

    文章目录 1. 唯一索引比普通索引快吗, 为什么? 2. MySQL由哪些部分组成, 分别用来做什么? 3. Mysql查询缓存有什么弊端, 应该什么情况下使用, 8.0版本对查询缓存有什么变更? 4 ...

  7. php面试mysql数据库题_PHP面试题 - MySQL数据库

    1. 写出下面2个PHP操作Mysql函数的作用和区别(新浪网技术部) mysql_num_rows() mysql_affected_rows() 这两个函数都作用于mysql_query($que ...

  8. mysql数据库存储引擎和索引的描述_Mysql InnoDB引擎的索引与存储结构详解

    前言 在Oracle 和SQL Server等数据库中只有一种存储引擎,所有数据存储管理机制都是一样的. 而MySql数据库提供了多种存储引擎.用户可以根据不同的需求为数据表选择不同的存储引擎,用户也 ...

  9. mysql 设置 0、1 用什么数据类型_什么是MySQL数据库?看这一篇干货文章就够了!...

    前言 为啥学习MySQL呢?因为MySQL是最流行的关系型数据库管理系统之一,在web应用方面,MySQL是最好的软件.MySQL所使用的sql语言是用于访问数据库的最常用标准化语言. 这篇文章,我会 ...

最新文章

  1. PIE SDK打开静止卫星数据
  2. LeetCode: 344. Reverse String
  3. Oracle WebLogic 最新补丁的绕过漏洞分析 cve-2020-2883
  4. 设计模式C++实现(9)——享元模式
  5. 【NLP】word2vec中的数学模型
  6. 5009. tinyfsm有限状态机
  7. mysql publishedtime_MySQL数据库中的Date,DateTime,TimeStamp和Time类型
  8. 能自动更新的万能周报模板,有手就会用!
  9. idea注册账号_【Meta分析】Meta分析该不该注册?如何注册?什么时候注册?
  10. NAND Flash底层原理,SLC MLC TLC比较
  11. python环境调用OpenModelica模型并进行仿真计算
  12. Chrome网页观看百度云视频加速
  13. OpenLayers使用高德导航接口实现动画animate
  14. 解决 Macbook 连接蓝牙鼠标卡顿、飘的现象
  15. 以太坊区块同步成功标志
  16. 数据管理体系之数据质量
  17. 一个很好用的maven settings.xml 配置文件镜像
  18. 《深入浅出Spring》@PropertySource、@Value注解及动态刷新实现
  19. XmlReader简介
  20. 【Qt】QMainWindow应用程序窗口类简单介绍

热门文章

  1. 压力管道级别如何划分
  2. Python算法系列—深度优先遍历算法【二叉树】
  3. Object常用的方法总结
  4. python json转dict
  5. 计算机网络:数据链路层——以太网协议
  6. 【机器学习】机器学习之线性判别分析(LDA)
  7. 【测绘程序设计】——大地主题解算
  8. Echarts模拟迁徙之飞机变小车
  9. Node.js发送HTTP请求
  10. 基于GN算法(Girvan-Newman)实现社交网络中社区划分