栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Mysql难点面试题

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Mysql难点面试题

文章目录
  • Mysql难点面试题
    • 客户端发起请求到mysql服务器的整个流程
    • 行级锁和表级锁
    • MyISAM和InnoDB表引擎的区别
      • 事务支持
      • 存储结构
      • 表锁差异
      • 表主键
      • 表的具体行数
      • CURD操作
      • 外键
      • 查询效率
      • MyISAM和InnoDB两者的应用场景

Mysql难点面试题

最近本人也是在准备秋招,发现好多问题都很模糊,心里也没有底,所以为了巩固知识,整理出了一些比较难的面试题。

客户端发起请求到mysql服务器的整个流程

其实不论客户端进程和服务器进程是采用哪种方式进行通信,最后实现的效果都是:客户端进程向服务器进程发送 一段文本(MySQL语句),服务器进程处理后再向客户端进程发送一段文本(处理结果)。那服务器进程对客户端进程发送的请求做了什么处理,才能产生最后的处理结果呢?客户端可以向服务器发送增删改查各类请求,我们 这里以比较复杂的查询请求为例来画个图展示一下大致的过程:

流程解释:
1.mysql服务器在接收到客户端的连接请求时,会首先通过连接池来创建数据库连接

2.找到对应sql语句接收接口,然后把sql语句放入编译器(具体流程有:词法分析、语法分析、语义分析),分析完毕后,载入优化器,对sql语句进行尽可能的优化。

3.然后根据SQL语句的具体语义要求存储引擎也就是InnoDB(mysql默认存储引擎)进行对应的查询操作(其他操作一样)。

  • 首先应该执行的语句部分是form xx表,得到表空间文件(xx表.frm 存储的是表结构;xx表.ibd 存储的是:索引结构 (根节点)记录数据(叶节点))。
  • 然后再根据sql语句where后的查询条件,进行索引查询(B+树索引查询(且为聚簇索引:索引数据和记录数据分开放))。
  • 查询到数据后,从文件中进行io操作投影到内存中,最后进行sql语句中的限制条件操作对得到的数据进行进一步过滤,最后返回到客户端中。
行级锁和表级锁

行级锁是一种排他锁,防止其他事务修改此行;在使用以下语句时,Mysql会自动应用行级锁:
insert、select、update、delete
update语句允许用户锁定多条记录更新
使用commit和rollback语句释放锁

表级锁又分为5类:

行共享- 禁止排他锁定表

行排他-禁止使用排他锁和共享锁

共享锁- 锁定表,对记录只读不写,多个用户可以同时在同一个表上应用此锁。

共享排他锁-比共享锁更多的限制,禁止使用共享锁及更高的锁

排他 - 限制最强的表锁,仅允许其他用户查询该表的行,禁止修改和锁定表。

MyISAM和InnoDB表引擎的区别 事务支持

MylSAM不支持事务,而InnoDB支持。

存储结构

MylSAM:每个MylSAM在磁盘上存储成三个文件。

  • .frm文件存储表结构
  • .MYD文件存储数据
  • .MYI文件存储索引

InnoDB:主要分为两种文件进行存储

  • .frm存储表结构
  • .ibd存储索引数据和记录数据 (也可能是多个.ibd文件,或者是独立的表空间文件)
表锁差异

MyISAM:只支持表级锁,用户在操作myisam表时,select,update,delete,insert语句都会给表自动加锁如果加锁以后的表满足insert并发的情况下,可以在表的尾部插入新的数据。

InnoDB:支持事务和行级锁,是 innodb的最大特色。行锁大幅度提高了多用户并发操作的性能。但是InnoDB的行锁,只是在WHERe的主键是有效的,非主键的WHERe都会锁全表的。

表主键

MyISAM:允许没有任何索引和主键的表存在,索引都是保存行的地址。

InnoDB:如果没有设定主键或者非空唯 一索引,就会自动生成一个6字节的主键(用户不可见),数据是主索引的一部分,附加索引保存的是主索引的值。 InnoDB的主键范围更大,最大是MyISAM的2倍。

表的具体行数

MyISAM:保存有表的总行数,如果select count() from table;会直接取出出该值。

InnoDB:没有保存表的总行数 (只能遍历),如果使用select count() from table;就会遍历整个表,消耗相当大,但是在加了wehre条件后, myisam和innodb处理的方式都一样。

CURD操作

MyISAM:如果执行大量的SELECt,MyISAM是更好的选择。

InnoDB:如果你的数据执行大量的INSERT或 UPDATE,出于性能方面的考虑,应该使用InnoDB表。DELETE 从性能上InnoDB更优,但DELETE FROM table 时,InnoDB不会重新建立表,而是一行一行的删除,在innodb上如果要清空保存有大量数据的表,最好使用 truncate table这个命令。

外键

MyISAM:不支持

InnoDB:支持

查询效率

MyISAM相对简单,所以在效率上要优于InnoDB,小型应用可以考虑使用MyISAM。

推荐考虑使用InnoDB来替代MyISAM引擎,原因是InnoDB自身很多良好的特点,比如事务支持、存储 过程、视图、行级锁定等等,在并发很多的情况下,相信InnoDB的表现肯定要比MyISAM强很多。

MyISAM和InnoDB两者的应用场景

MyISAM管理非事务表。它提供高速存储和检索,以及全文搜索能力。如果应用中需要执行大量的SELECT查询,那么MyISAM是更好的选择。

InnoDB用于事务处理应用程序,具有众多特性,包括ACID事务支持。如果应用中需要执行大量的INSERT或UPDATE操作,则应该使用InnoDB,这样可以提高多用户并发操作的性能。现在默认使用 InnoDB。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/270027.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号