MySQL⾯试总结java边界布局
1、MySQL的索引有了解吗?(重点掌握)
索引的核⼼思想是分治,是对数据库数据排序分页后,存储每页第⼀个数据部分字段信息⼀种结构,利⽤索引可以快速的访问到页⾯,然后根据页⽬录到数据。InnoDB索引的存储数据结构是B+树来实现的。
(1)“为什么底层数据结构使⽤B+树,⽽不是B树?”
B+树是B树的变种,B+树的⾮叶⼦节点只⽤来保存索引,不存储数据,所有的数据都保存在叶⼦节点;⽽B树的⾮叶⼦节点也会保存数据。这样就使得B+树的查询效率更加稳定,均为从根节点到叶⼦节点的路径。
B+树的内部结点并没有指向关键字具体信息的指针,因此其内部结点相对B 树更⼩,同样空间可以读⼊更多的节点,所以B+树的磁盘读写代价更低。
(2)聚簇索引和⾮聚簇索引有了解吗?
聚簇索引也称为主键索引,表中⾏的物理顺序与键值的逻辑(索引)顺序相同。⼀个表只能包含⼀个聚
集索引。因为索引(⽬录)只能按照⼀种⽅法进⾏排序。但是如果没有主键,采⽤唯⼀索引,没有唯⼀会使⽤row_id
⾮聚簇索引(普通索引)的叶⼦节点内容是主键的值。在 InnoDB ⾥,⾮主键索引也被称为⼆级索引(secondary index)。
(3) 回表
普通索引查询⽅式,则需要先搜索普通索引树,得到其对应的主键值,再到主键索引树搜索⼀次。这个过程称为回表。
(4) 覆盖索引
只需要在⼀棵索引树上就能获取SQL所需的所有列数据,⽆需回表,速度更快。
(5) 索引的最左前缀原则
在联合索引的情况下,不需要索引的全部定义,只要满⾜最左前缀,就可以利⽤索引来加快查询速度。这个最左前缀可以是联合索引的最左N 个字段,也可以是字符串索引的最左 M 个字符。最左前缀原则的利⽤也可以显著提⾼查询效率,是常见的MySQL性能优化⼿段。
(6) 索引下推
在MySQL5.6之前,只能从根据最左前缀查询到ID开始⼀个个回表。到主键索引上出数据⾏,再对⽐字段值。MySQL5.6引⼊的索引下推优化,(联合索引前提)可以在索引遍历过程中,对索引中包含的其余字段先做判断,直接过滤掉不满⾜条件的记录,减少回表次数,提升查询效率。
(7)“哪些列上适合创建索引?创建索引有哪些开销?”
经常需要作为条件查询的列上适合创建索引,并且该列上也必须有⼀定的区分度。创建索引需要维护,在插⼊数据的时候会重新维护各个索引树(数据页的分裂与合并),对性能造成影响。
八零电子书打不开了
2、MySQL常见的存储引擎有哪些(重点掌握)?
答:MySQL中最常见的存储引擎有InnoDB和MyISAM,它们的主要区别如下:
MyISAM不⽀持事务;InnoDB是事务类型的存储引擎。
MyISAM只⽀持表级锁;InnoDB⽀持⾏级锁和表级锁,默认为⾏级锁。
MyISAM引擎不⽀持外键;InnoDB⽀持外键。
对于count(*)查询来说MyISAM更有优势,因为其保存了⾏数。
InnoDB是为处理巨⼤数据量时的最⼤性能设计的存储引擎。
MyISAM⽀持全⽂索引(FULLTEXT);InnoDB不⽀持,5.6之后⽀持。
mysql面试题目及答案应⽤场景:
MyISAM适合:(1)做很多count 的计算;(2)插⼊不频繁,查询⾮常频繁;(3)没有事务。
InnoDB适合:(1)可靠性要求⽐较⾼,或者要求事务;(2)表更新和查询都相当的频繁,并且⾏锁定的机会⽐较⼤的情况。
总结:
最主要的区别就是MyISAM表不⽀持事务、不⽀持⾏级锁、不⽀持外键。 InnoDB表⽀持事务、⽀持⾏级锁、⽀持外键。
解析:
对MySQL的存储引擎的考察也是⼀个⼏乎必考的知识点,为了让⼤家对存储引擎有⼀个更好的了解,
我们先来看下MySQL的基本逻辑架构图,从整体上了解下MySQL包括哪些逻辑架构。
由MySQL的逻辑架构图我们可以看出,逻辑架构包括Server层和存储引擎层。其中Server层包括连接器,分析器,优化器以及执⾏器;存储引擎层包括多种⽀持的存储引擎。各个逻辑部件的作⽤如下:
连接器:验证客户端权限,建⽴和断开MySQL连接
分析器:进⾏SQL语句的语法分析
优化器:选择索引,⽣成具体的SQL语句执⾏计划
执⾏器:操作存储引擎,执⾏SQL,返回执⾏结果
存储引擎层:各个不同的存储引擎都提供了⼀些读写接⼝来操作数据库
除了InnoDB以及MyISAM存储引擎外,常见的考察存储引擎还有Memory,使⽤Memory作为存储引擎的表也可以叫做内存表,将数据存储在了内存中,所以适合做临时表来使⽤,在索引结构上⽀持B+树索引和Hash索引。
3、MySQL中where、group by、having关键字?
答:这三个MySQL关键字作⽤可以总结如下:
where⼦句⽤来筛选from⼦句中指定的操作所产⽣的的⾏
group by ⼦句⽤来分组where⼦句的输出
having⼦句⽤来从分组的结果中筛选⾏
having和where的区别:
语法类似,where搜索条件在进⾏分组操作之前应⽤;having搜索条件在进⾏分组操作之后应⽤
having可以包含聚合函数sum、avg、max等
having⼦句限制的是组,⽽不是⾏
当同时含有where⼦句、group by ⼦句 、having⼦句及聚集函数时,执⾏顺序如下:spring下载是不是要注册账号
执⾏where⼦句查符合条件的数据
使⽤group by ⼦句对数据进⾏分组
对group by ⼦句形成的组运⾏聚集函数计算每⼀组的值
最后⽤having ⼦句去掉不符合条件的组
4、MySQL的⽇志模块binlog和redo log有了解吗?
答:在MySQL的使⽤中,更新操作也是很频繁的,如果每⼀次更新操作都根据条件到对应的记录,然后将记录更新,再写回磁盘,那么IO成本以及查记录的成本都很⾼。所以,出现了⽇志模块,即我们的update更新操作是先写⽇志,在合适的时间才会去写磁盘,⽇志更新完毕就将执⾏结果返回给了客户端。
MySQL中的⽇志模块主要有redo log(重做⽇志)和binlog(归档⽇志)。
redo log:
redo log是InnoDB引擎特有的⽇志模块,redo log是物理⽇志,记录了某个数据页上做了哪些修改。InnoDB的redo log是固定⼤⼩的,⽐如可以配置为⼀组4个⽂件,每个⽂件的⼤⼩是1GB,那么redo log总共就可以记录 4GB的操作。从头开始写,写到末尾就⼜回到开头循环写。
InnoDB的redo log保证了数据库发⽣异常重启之后,之前提交的记录不会丢失,这个能⼒称为crash-safe。
binlog:
binlog是Server层⾃带的⽇志模块,binlog是逻辑⽇志,记录本次修改的原始逻辑,说⽩了就是SQL语句。binlog是追加写的形式,可以写多个⽂件,不会覆盖之前的⽇志。通过mysqlbinlog可以解析查看binlog⽇志。binlog⽇志⽂件的格式:statement,row,mixed。
statement格式的binlog记录的是完整的SQL语句,优点是⽇志⽂件⼩,性能较好,缺点也很明显,那就是准确性差,遇到SQL语句中有now()等函数会导致不准确
row格式的binlog中记录的是数据⾏的实际数据的变更,优点就是数据记录准确,缺点就是⽇志⽂件较⼤。
mixed格式的binlog是前⾯两者的混合模式
业界⽬前推荐使⽤的是 row 模式,因为很多情况下对准确性的要求是排在第⼀位的。
解析:
MySQL的⽇志模块属于有点深度的知识点,在校招⾯试中考察不深,我们仅仅对这部分知识有个初步的认识和了解,就⾜以在⾯试中留下好印象并且获得加分。
在更新数据库的时候,通过redo log和binlog的两阶段提交,可以确保数据库异常崩溃之后数据的正确恢复。
完整的java代码
在对数据库误操作之后,可以通过备份库+binlog可以将数据库状态恢复到“任意“时刻。
(1)为什么MySQL会突然变慢⼀下?
当内存数据页和磁盘数据页内容不⼀致的时候,这个内存页就是“脏页”。内存数据写⼊到磁盘后,内存和磁盘上的数据页的内容就⼀致了,这个时候的内存页就是”⼲净页“。
前⾯我们介绍了更新数据库的时候是先写⽇志,当合适的机会(空闲)出现的时候才会更新磁盘。但是当redo log 写满了,要 flush 脏页,也就是把内存⾥的数据写⼊磁盘,会导致MySQL执⾏速度突然变慢⼀瞬间。
5、MySQL事务有哪些特性?(重点掌握)
答:事务是单个逻辑⼯作单元执⾏的⼀系列操作,是⼀个不可分割的⼯作单位。满⾜如下的四⼤特性:
原⼦性(Atomicity):事务作为⼀个整体被执⾏ ,要么全部执⾏,要么全部不执⾏;
⼀致性(Consistency):保证数据库状态从⼀个⼀致状态转变为另⼀个⼀致状态;
隔离性(Isolation):多个事务并发执⾏时,⼀个事务的执⾏不应影响其他事务的执⾏;
持久性(Durability):⼀个事务⼀旦提交,对数据库的修改应该永久保存
解析:
MySQL事务⼜是⼀个⼏乎必考的MySQL知识点,可以拓展的知识点较多,我们⼀起来接着看如下的考察点。
(1)“如果不做控制,多个事务并发操作数据库会产⽣哪些问题吗?“
丢失更新:
两个不同事务同时获得相同数据,然后在各⾃事务中同时修改了该数据,那么先提交的事务更新会被后提交事务的更新给覆盖掉,这种情况先提交的事务所做的更新就被覆盖,导致数据更新丢失。
脏读:
不可重复读:⼀个事务在⾃⼰没有更新数据库数据的情况,同⼀个查询操作执⾏两次或多次得到的结果数值不同,因为别的事务更新了该数据,并且提交了事务。
幻读:事务A读的时候读出了N条记录,事务B在事务A执⾏的过程中增加 了1条,事务A再读的时候就变成了N+1条,这种情况就叫做幻读。innodb使⽤临界锁解决幻读
注意:幻读是指⼀种结构上的改变,⽐如说条数发⽣了改变;不可重复读是指读出的数值发⽣了改变。
(2)“MySQL数据库事务的隔离级别有哪些?“
为了避免数据库事务操作中的问题,MySQL定义了4个事务隔离级别,不同的隔离级别对事务的处理不同。
读未提交(Read Uncommitted):存在脏读、不可重复读、幻读问题
读已提交(Read Committed):存在不可重复读、幻读的问题,不存在脏读
可重复读(Repeatable Read):存在幻读,不存在脏读、不可重复读问题。innodb,不存在幻读。
序列化(Serializable):提供严格的事务隔离。它要求事务序列化执⾏,事务只能⼀个接着⼀个地执⾏,但不能并发执⾏。
事务的隔离级别越⾼,对数据的完整性和⼀致性保证越佳,但是对并发操作的影响也越⼤。MySQL事务默认隔离级别是可重复读。
6、MySQL中的锁机制?(重点掌握)
(1)MySQL中的死锁
MySQL中的死锁主要是多个事务使⽤⾏级锁对某⾏数据加锁造成的,上⼀⼩节说了MyISAM不⽀持⾏级锁,所以MySQL中的死锁主要是在说InnoDB存储引擎的死锁。
那么MySQL的死锁该如何解决呢?
我们可以在业务上和数据库设置上来解决MySQL死锁。分别介绍如下:
建站模板更改
业务逻辑上的死锁解决⽅案:
指定锁的获取顺序
⼤事务拆分成各个⼩事务
在同⼀个事务中,⼀次锁定尽量多的资源,减少死锁概率
给表建⽴合适的索引以及降低事务的隔离级别等
数据库的设置来解决死锁:
通过参数 innodb_lock_wait_timeout 根据实际业务场景来设置超时时间,InnoDB引擎默认值是50s。
发起死锁检测,发现死锁后,主动回滚死锁链条中的某⼀个事务,让其他事务得以继续执行。将参数 innodb_deadlock_detect 设置为 on,表⽰开启这个逻辑(默认是开启状态)。
(2)“⾏级锁什么时候会锁住整个表?“
InnoDB⾏级锁是通过锁索引记录实现的,如果更新的列没建索引是会锁住整个表的。
悲观锁与乐观锁:
从程序员的⾓度看,数据库中的锁⼜可以分为悲观锁和乐观锁。
悲观锁:利⽤数据库的锁机制实现,在整个数据处理过程中都加⼊了锁,以保持排他性。
乐观锁:乐观锁可以利⽤CAS实现,在操作数据的时候进⾏⼀个⽐较,按照当前事务中的数据和数据库表中的该数据是否⼀致来决定是否要执⾏本次操作。
(3)“乐观锁的ABA问题有了解吗?如何解决?“
ABA问题是指在当前事务读取该⾏数据时是A,经过别的事务修改成B,但是在当前事务要更新数据的时候,该⾏数据⼜被别的事务修改为A,事实上数据⾏是发⽣过改变的,存在并发问题。
ABA问题可以通过基于数据版本(Version)记录机制来解决。也就是为数据增加⼀个版本标识。读取出数据时,将此版本号⼀同读出,之后更新时,对此版本号加⼀。根据当前事务的数据版本号和数据库中数据的版本号对⽐来决定是否更新数据。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。