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原创或收集发布,欢迎转载。
ZENDER
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。