- Mysql难点面试题
- 客户端发起请求到mysql服务器的整个流程
- 行级锁和表级锁
- MyISAM和InnoDB表引擎的区别
- 事务支持
- 存储结构
- 表锁差异
- 表主键
- 表的具体行数
- CURD操作
- 外键
- 查询效率
- MyISAM和InnoDB两者的应用场景
最近本人也是在准备秋招,发现好多问题都很模糊,心里也没有底,所以为了巩固知识,整理出了一些比较难的面试题。
客户端发起请求到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。



