MySQL面试题

文章的目的主要是针对面试官的提问,做出尽可能精简而全面的回答。若读者对某块的知识不能太理解,还请参阅其他大佬比较详细的博客或者专业书籍,谢谢大家。


一.MySQL的存储引擎

1.InnoDB:

        a.支持事务,支持事务的四种隔离级别;是一种具有提交、回滚和崩溃恢复能力的事务安全存储引擎。

        b.支持行锁和外键约束。

        c.一个Innodb表存储在一个文件内(共享表空间,表大小不受操作系统的限制),也可能为多个(设置为独立表空间,表大小受操作系统限制,大小为2G),受操作系统文件大小的限制。

        d.主键索引采用聚集索引(索引的数据域存储数据文件本身),辅索引的数据域存储主键的值;因此从辅索引查找数据,需要先通过辅索引找到主键值,再访问主键索引;最好使用自增主键,防止插入数据时,为维持B+树结构,文件的大调整。

        e.不存储总行数;也就是说,执行select count(*) from table时,InnoDB要扫描一遍整个表来计算有多少行。注意的是,当count(*)语句包含 where条件时,两种表的操作是一样的。

        f.对于AUTO_INCREMENT类型的字段,InnoDB中必须包含只有该字段的索引。

2.MyISAM:

        a.不支持事务,但是整个操作是原子性的。

        b.不支持外键,支持表锁,每次锁住的是整张表。(MyISAM的表锁有读锁和写锁(两个锁都是表级别):表共享读锁和表独占写锁。在对MyISAM表进行读操作时,不会阻塞其他用户对同一张表的读请求,但是会阻塞其他用户对表的写请求;对其进行写操作时会阻塞对同一表读操作和写操作MyISAM存储引擎的读锁和写锁是互斥的,读写操作是串行的。那么,一个进程请求某个MyISAM表的读锁,同时另一个进程也请求同一表的写锁,MySQL如何处理呢?答案是写进程先获得锁。不仅如此,即使读请求先到锁等待队列,写请求后到,写锁也会插到读锁请求之前!这是因为MySQL认为写请求一般比读请求要重要。这也正是MyISAM表不太适合于有大量更新操作和查询操作应用的原因,因为,大量的更新操作会造成查询操作很难获得读锁,从而可能永远阻塞。这种情况有时可能会变得非常糟糕!)

        c.一个MyISAM表有三个文件:索引文件,表结构文件,数据文件。

        d.采用非聚集索引,索引文件的数据域存储指向数据文件的指针。辅索引与主索引基本一致,但是辅索引不用保证唯一性。

        e.存储表的总行数,执行select count(*) from table时只要简单的读出保存好的行数即可。

        f.对于AUTO_INCREMENT类型的字段,在MyISAM表中,可以和其他字段一起建立联合索引。

3.Memory:

        每个基于MEMORY存储引擎的表实际对应一个磁盘文件。该文件的文件名与表名相同,类型为frm类型。该文件中只存储表的结构。而其数据文件,都是存储在内存中,这样有利于数据的快速处理,提高整个表的效率。MEMORY默认使用哈希索引(唯一支持哈希索引的存储引擎)。速度比使用B型树索引快。当然如果你想用B型树索引,可以在创建索引时指定。

4.Archive:


MySQL中的锁

表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。

行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。

页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般。

二、事务的ACID

        1.原子性(atomicity):一个事务必须视为一个不可分割的最小工作单元,整个事务中所有的操作要么全部提交成功,要么全部失败回滚,对一个事务来说,不可能只执行其中的一部分操作,这就是事务的原子性。

        2.一致性(consistency):事务前后数据的完整性保持一致。

        3.隔离性(isolation):一个事务所做的修改在最终提交以前,对其他事务通常是不可见的。

        4.持久性(durability):一旦事务提交,则其所做的修改就会永久保存到数据库中。此时即使系统崩溃,修改的数据也不会丢失。

三、事务的隔离级别

        1.READ UNCOMMITTED (未提交读):一个事务可以读取另一个未提交事务的数据,这也称为脏读

        2.READ COMMITTED (提交读):一个事务要等另一个事务提交后才能读取数据。但会出现一个事务范围内两个相同的查询却返回了不同的数据,称为不可重复读。

        3.REPEATABLE READ (可重复读):在开始读取数据(事务开启)的时候,不允许修改操作。可重复读可以解决不可重复读问题。不可重复读对应的是修改即update操作,但是可能有幻读问题,因为幻读问题对应的是插入insert操作,而不是update操作。

        幻读:当某个事务在读取某个范围内记录时,另外一个事务又在该范围内插入了新的记录,当之前的事务再次读取该范围记录时,会出现换行。

        4.SERIALIZABLE (可串行化):最高的隔离级别,该级别下事务串行化顺序执行,可以避免脏读、不可重复读和幻读。但是效率低下,比较耗数据库的性能,会在读取的每一个行都加锁,所以会导致大量的超时和锁争用的问题。

四、多版本并发控制(MVCC)解决幻读问题


持续更新!!!!!觉得如果有帮助到你,麻烦评论喜欢加关注哟。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容