面试题: mysql数据库 已看1 索引和事务 没用
mysql数据库面试总结
结合网上大神还有自己面试经历,收集的总结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
补充:故事
Read uncommitted 读未提交
公司发工资了,领导把5000元打到长贵的账号上,但是该事务并未提交,而长贵的正好去查看账户,发现工资已经到账,是5000元整,非常高兴。可是不幸的是,领导发现发给长贵的工资金额不对,是2000元,于是迅速回滚了事务,修改金额后,将事务提交,最后长贵实际的工资只有2000元,长贵空欢喜一场。
出现上述情况,即我们所说的脏读,两个并发的事务,“事务A:领导给长贵发工资”、“事务B:长贵查询工资账户”,事务B读取了事务A尚未提交的数据。
当隔离级别设置为Read uncommitted时,就可能出现脏读,如何避免脏读,请看下一个隔离级别。
- Read committed 读提交
长贵拿着工资卡去消费,系统读取到卡里确实有2000元,而此时她的老婆谢大脚也正好在网上转账,把谢大脚把工资卡的2000元转到自己的账户,并在长贵之前提交了事务,当长贵扣款时,系统检查到长贵的工资卡已经没有钱,扣款失败,长贵十分纳闷,明明卡里有钱,为何……
出现上述情况,即我们所说的不可重复读,两个并发的事务,“事务A:长贵消费”、“事务B:长贵的老婆谢大脚网上转账”,事务A事先读取了数据,事务B紧接了更新了数据,并提交了事务,而事务A再次读取该数据时,数据已经发生了改变。
当隔离级别设置为Read committed时,避免了脏读,但是可能会造成不可重复读。大多数数据库的默认级别就是Read committed,比如Sql Server , Oracle。如何解决不可重复读这一问题,请看下一个隔离级别。
- 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 索引和事务 没用相关推荐
- 面试题: mysql 数据库已看 sql安全性 索引 引擎 sql优化
总结的一些MySQL数据库面试题 2016年06月16日 11:41:18 阅读数:4950 一.sql语句应该考虑哪些安全性? (1)防止sql注入,对特殊字符进行转义,过滤或者使用预编译的sql语 ...
- 面试题: mysql数据库 已看1 简单的sql练习
数据库总结--MySQL常见面试题 2015年03月24日 17:56:06 阅读数:7787 1.根据部门号从高到低,工资从低到高列出员工的信息 select * from employee ord ...
- mysql数据库简单查询试题_面试题: mysql数据库 已看1 简单的sql练习
1.根据部门号从高到低,工资从低到高列出员工的信息 select * from employee order by dept_id desc,salary 2.union和union all的区别 用 ...
- MySQL数据库的数据类型和索引
数据库的数据库索引对程序员来说是透明的,意味着数据库建立索引之前和之后,你的SQL语句都可以正常运行,索引的运用只是数据库引擎工作时候的优化手段.但是,这不是意味着数据库索引仅仅是数据库设计和运维者的 ...
- 数据库-面试题-MySQL数据库的优化方法
数据库-面试题-MySQL数据库的优化方法 2017年08月22日 17:56:57 小笛子的专栏 阅读数 13236 1.选取最适用的字段属性 MySQL可以很好的支持大数据量的存取,但是一般说来, ...
- 面试题——Mysql数据库管理系统篇
文章目录 1. 唯一索引比普通索引快吗, 为什么? 2. MySQL由哪些部分组成, 分别用来做什么? 3. Mysql查询缓存有什么弊端, 应该什么情况下使用, 8.0版本对查询缓存有什么变更? 4 ...
- php面试mysql数据库题_PHP面试题 - MySQL数据库
1. 写出下面2个PHP操作Mysql函数的作用和区别(新浪网技术部) mysql_num_rows() mysql_affected_rows() 这两个函数都作用于mysql_query($que ...
- mysql数据库存储引擎和索引的描述_Mysql InnoDB引擎的索引与存储结构详解
前言 在Oracle 和SQL Server等数据库中只有一种存储引擎,所有数据存储管理机制都是一样的. 而MySql数据库提供了多种存储引擎.用户可以根据不同的需求为数据表选择不同的存储引擎,用户也 ...
- mysql 设置 0、1 用什么数据类型_什么是MySQL数据库?看这一篇干货文章就够了!...
前言 为啥学习MySQL呢?因为MySQL是最流行的关系型数据库管理系统之一,在web应用方面,MySQL是最好的软件.MySQL所使用的sql语言是用于访问数据库的最常用标准化语言. 这篇文章,我会 ...
最新文章
- PIE SDK打开静止卫星数据
- LeetCode: 344. Reverse String
- Oracle WebLogic 最新补丁的绕过漏洞分析 cve-2020-2883
- 设计模式C++实现(9)——享元模式
- 【NLP】word2vec中的数学模型
- 5009. tinyfsm有限状态机
- mysql publishedtime_MySQL数据库中的Date,DateTime,TimeStamp和Time类型
- 能自动更新的万能周报模板,有手就会用!
- idea注册账号_【Meta分析】Meta分析该不该注册?如何注册?什么时候注册?
- NAND Flash底层原理,SLC MLC TLC比较
- python环境调用OpenModelica模型并进行仿真计算
- Chrome网页观看百度云视频加速
- OpenLayers使用高德导航接口实现动画animate
- 解决 Macbook 连接蓝牙鼠标卡顿、飘的现象
- 以太坊区块同步成功标志
- 数据管理体系之数据质量
- 一个很好用的maven settings.xml 配置文件镜像
- 《深入浅出Spring》@PropertySource、@Value注解及动态刷新实现
- XmlReader简介
- 【Qt】QMainWindow应用程序窗口类简单介绍