MySQL面试

烟雨 4年前 (2021-08-02) 阅读数 377 #面试
文章标签 MySQL面试

一、MyISAM和InnoDB的区别是什么?

1、InnoDB支持事务,MyISAM不支持事务。

2、InnoDB支持外键,MyISAM不支持外键。

3、InnoDB是聚集索引,MyISAM时非聚集索引。

4、InnoDB不保存总行数,MyISAM通过一个变量保存了总行数。

5、InnoDB支持行/表锁,MyISAM只支持表锁。

二、MySQL中的varchar最多存储多少数据?

最多可定义65535个字节,但是实际存储不能放这么多。

MySQL进行了限制,除了BlOB、TEXT,其他所有的类型都不能超过65535个字节。

三、事务的基本特性?

原子性,一致性,隔离性,持久性。

四、事务的并发可能发生什么问题?

脏读:读取到另一个未提交的事务的数据。

不可重复度:一个事务读取了2次,期间另一个事务修改了数据(事务未提交),第一个事务2次读取的数据不一样。

幻读:一个事务读取期间,另一个事务进行了新增数据(未提交),第一个事务读取到另一个事务插入的数据。

幻读和不可重复度的区别在一个是修改数据,一个是新增了一条数据。

五、简单描述一下MySQL索引?

分类:主键索引,唯一索引,普通索引,前缀索引。 

索引其实就是一个B+树,MySQL通过维护和遍历这个树,从而快速找到我们想要的数据。

一三层个B+树大概能存2千万行的数据。

六、如何提高insert的性能?

1、合并多条insert为1条。

2、修改bulk_insert_buffer_size,调整批量插入的缓冲区大小。

3、设置innodb_flush_log_at_trx_commit = 0。该参数控制着二进制日志写入磁盘的过程。

0:默认值。事务提交后,将二进制日志从缓冲写入磁盘,但是不进行刷新操作(fsync()),此时只是写入了操作系统缓冲,若操作系统宕机则会丢失部分二进制日志。

1:事务提交后,将二进制文件写入磁盘并立即执行刷新操作,相当于是同步写入磁盘,不经过操作系统的缓存。

N:每写N次操作系统缓冲就执行一次刷新操作。

将这个参数设为1以上的数值会提高数据库的性能,但同时会伴随数据丢失的风险。二进制日志文件涉及到数据的恢复,以及想在主从之间获得最大的一致性,那么应该将该参数设置为1,但同时也会造成一定的性能损耗。

七、什么是全局锁,共享锁,排它锁?

全局锁:指的是对整个数据库进行加锁,加锁后只能读取,使用场景全库逻辑备份。

共享锁:又称为读锁,是读取操作创建的锁。这个锁期间,其他事务可以访问读取数据,但是不能对这条数据修改。

排它锁:又称为写锁,对某一行加锁后,只能这个加锁的事务进行读写,其他事务都不能进行操作。

八、InnoDB的表锁、行锁、间歇锁?

表锁,锁住一张表,开销小。

行锁,锁住一行,开销大。且InnoDB的行锁是加在索引上。

间歇锁,锁住的是一个主键范围。

九、MySQL中的死锁?

可以通过 show engine innodb statis查看最近的一次死锁。

对待死锁的策略

通过设置超时时间:innodblockwait_timeout。

发起死锁检测,发现死锁后,主动回滚死锁中的某个事务,让其他事务继续进行。

十、MVCC多版本并发控制机制、undo日志版本链?

一行数据被多个事务修改后,每个事务都会生成undo日志,并且用串联起来。形成一个版本链。

有一个未提交事务ID范围,min_id:最小事务id,max_id:已经创建最大事务id。

查询的事务id<min_id,说明事务已经提交,数据可见。

查询的事务id>max_id,说明事务未提交,数据不可见。

min_id<查询的事务id<max_id,说明事务也是未提交,数据不可见。

详细可参考:https://blog.zender.top/post/05_MySQL.html

十一、BufferPool缓存机制

通过mysql定义的一些缓存,直接再内存上操作,避免频繁的磁盘io操作。增强了性能。

详细可参考:https://blog.zender.top/post/05_MySQL.html


版权声明

非特殊说明,本文由Zender原创或收集发布,欢迎转载。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

作者文章
热门