史上最详细的一线大厂Mysql面试题详解

  

     
  

  

  基本原理流程,3个线程以及之间的关联;   

  

  主:binlog线程——记录下所有改变了数据库数据的语句,放进主人上的binlog中;   

  

  从:输入输出线程——在使用开始奴隶之后,负责从总体上拉取binlog内容,放进自己的中继日志中;   

  

  从:sql执行线程——执行日志中继电器的语句;   

  

     

  

     

  

  1在.InnoDB支持事物,而MyISAM不支持事物   

  

  2在.InnoDB支持行级锁,而MyISAM支持表级锁   

  

  3祝辞。InnoDB支持MVCC,而MyISAM不支持   

  

  4在.InnoDB支持外键,而MyISAM不支持   

  

  5在.InnoDB不支持全文索引,而MyISAM支持。   

  

     

  

  插入缓冲(插入缓冲),二次写(双写),自适应哈希索引(你好),预读(读之前)   

  

     

  

  myisam更快,因为myisam内部维护了一个计数器,可以直接调取。   

  

     

  

     

  

  炭是一种固定长度的类型,varchar则是一种可变长度的类型   

  

     

  

  最多存放50个字符、varchar(50)和(200)存储你好所占空间一样,但后者在排序时会消耗更多内存,因为order by坳采用fixed_length计算坳长度(内存引擎也一样)   

  

     

  

  是指显示字符的长度   

  

  但要加参数的,最大为255,比如它是记录行数的id,插入10笔资料,它就显示00000000001 ~ ~ ~ 00000000001,当字符的位数超过11日,它也只显示11位,如果你没有加那个让它未满11位就前面加0的参数,它不会在前面加0   

  

  20表示最大显示宽度为20,但仍占4字节存储,存储范围不变;   

  

     

  

  对大多数应用没有意义,只是规定一些工具用来显示字符的个数;int(1)和int(20)存储和计算均一样;   

  

     

  

     

  

  错误日志:记录出错信息,也记录一些警告信息或者正确的信息。   

  

  查询日志:记录所有对数据库请求的信息,不论这些请求是否得到了正确的执行。   

  

  慢查询日志:设置一个阈值,将运行时间超过该值的所有SQL语句都记录到慢查询的日志文件中。   

  

  二进制日志:记录对数据库执行更改的所有操作。   

  

  中继日志:   

  

  事务日志:   

  

     

  

  隔离级别   

  

  读未提交(俄文)   

  

  读已提交(RC)   

  

  可重复读(RR)   

  

  串行   

  

  (3),事务是如何通过日志来实现的,说得越深入越好。   

  

  事务日志是通过重做和innodb的存储引擎日志缓冲(innodb日志缓冲区)来实现的,当开始一个事务的时候,会记录该事务的lsn(日志序列号)号;当事务执行时,会往InnoDB存储引擎的日志的日志缓存里面插入事务日志;当事务提交时,必须将存储引擎的日志缓冲写入磁盘(通过innodb_flush_log_at_trx_commit来控制),也就是写数据前,需要先写日志。这种方式称为“预写日志方式”   

  

     

  

  声明:每一条会修改数据的sql都会记录在binlog中。   

  

     不需要记录每一行的变化,减少了binlog日志量,节约了IO,提高性能。(相比行能节约多少性能与日志量,这个取决于应用的SQL情况,正常同一条记录修改或者插入行格式所产生的日志量还小于声明产生的日志量,但是考虑到如果带条件的更新操作,以及整表删除,改变表等操作,行格式会产生大量日志,因此在考虑是否使用行格式日志时应该跟据应用的实际情况,其所产生的日志量会增加多少,以及带来的IO性能问题。)   

  

  缺点:由于记录的只是执行语句,为了这些语句能在奴隶上正确运行,因此还必须记录每条语句在执行的时候的一些相关信息,以保证所有语句能在奴隶得到和在主端执行时候相同的结果。另外mysql的复制,像一些特定函数功能,奴隶可与掌握上要保持一致会有很多相关问题(如睡眠()函数,last_insert_id(),以及用户定义函数(udf)会出现问题)。   

  

史上最详细的一线大厂Mysql面试题详解