MySQL支持的复制类型有哪些?
Statement:每一条会修改数据的sql都会记录在binlog中。不需要记录每一行的变化,减少了binlog日志量,节约了IO,提高性能。可能导致(主从复制)的结果不一致。Row:不记录sql语句上下文相关信息,仅保存哪条记录被修改。不会出现(主从复制)的结果不一致!所有的执行的语句当记录到日志中的时候,都将以每行记录的修改来记录,这样可能会产生大量的日志内容。Mixed:折中处理方案,实际上就是Statement与Row的结合。一般的语句修改使用statment格式保存binlog,如一些函数,statement无法完成主从复制的操作,则采用row格式保存binlog。
说一说MySQL复制的原理以及流程
在Slave服务器上执行sartslave命令开启主从复制开关,开始进行主从复制。此时,Slave服务器的IO线程会通过在master上已经授权的复制用户权限请求连接master服务器,并请求从执行binlog日志文件的指定位置(日志文件名和位置就是在配置主从复制服务时执行changemaster命令指定的)之后开始发送binlog日志内容Master服务器接收到来自Slave服务器的IO线程的请求后,二进制转储IO线程会根据Slave服务器的IO线程请求的信息分批读取指定binlog日志文件指定位置之后的binlog日志信息,然后返回给Slave端的IO线程。返回的信息中除了binlog日志内容外,还有在master服务器端记录的新的binlog文件名称,以及在新的binlog中的下一个指定更新位置。当Slave服务器的IO线程获取到Master服务器上IO线程发送的日志内容、日志文件及位置点后,会将binlog日志内容依次写到Slave端自身的RelayLog(即中继日志)文件(MySQL-relay-bin.xxx)的最末端,并将新的binlog文件名和位置记录到master-info文件中,以便下一次读取master端新binlog日志时能告诉Master服务器从新binlog日志的指定文件及位置开始读取新的binlog日志内容Slave服务器端的SQL线程会实时检测本地RelayLog中IO线程新增的日志内容,然后及时把RelayLOG文件中的内容解析成sql语句,并在自身Slave服务器上按解析SQL语句的位置顺序执行应用这样sql语句,并在relay-log.info中记录当前应用中继日志的文件名和位置。
说一说你对数据库范式的理解
核心点
灵活使用,优先范式设计,当范式设计成为系统的性能瓶颈的时候,使用反范式设计。
第一范式
定义:属于第一范式关系的所有属性都不可再分,即数据项不可分。简单理解:每个列都不可以再拆分。
第二范式
定义:要求数据库表中的每个实例或行必须可以被惟一地区分。简单理解:不要有部分依赖。该多对多就去做多对多,不要把多对多关系放在一张表
第三范式
定义:每一个非主属性既不部分依赖于也不传递依赖于业务主键,也就是在第二范式的基础上消除了非主键对主键的传递依赖。简单理解:表关联有个主键就行,不要放除关联主键之外的其他关联表数据。反范式设计
为了性能和读取效率的考虑而适当的对数据库设计范式的要求进行违反。允许存在少量的冗余,换句话来说反范式化就是使用空间来换取时间。
说一说表锁与行锁
表锁
每次操作锁住整张表。开销小(不需要定位到某个元素,只需要定位到表),加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低;一般用在整表数据迁移的场景。
表锁操作方式
手动增加表锁:locktable表名称read(write),表名称2read(write);查看表上加过的锁showopentables;删除表锁unlocktables;
行锁
每次操作锁住一行数据。开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度高。InnoDB与MYISAM的最大不同点:InnoDB支持行级锁、支持事务MyISAM在执行查询语句SELECT前,会自动给涉及的所有表加读锁,在执行update、insert、delete操作会自动给涉及的表加写锁。InnoDB在执行查询语句SELECT时(非串行隔离级别),不会加锁。但是update、insert、delete操作会加行锁。
行锁操作方式
sql后增加forupdate来实现行锁。forupdate在不走索引的时候会锁表!但是当要修改或者查询的数据不存在的时候,不会锁表,也不会锁定行!
说一说间隙锁
间隙锁,锁的就是两个值之间的空隙。间隙锁是在可重复读隔离级别下才会生效。在普通索引列上,不管是何种查询,只要加锁,都会产生间隙锁,这跟唯一索引不一样;在普通索引和唯一索引中,数据间隙的分析,数据行是优先根据普通索引排序,再根据唯一索引排序。
说一说临键锁
行锁与间隙锁的组合,它的封锁范围,既包含索引记录,又包含索引区间。。这是Innodb在可重复读提交下为了解决幻读问题时引入的锁机制。
说一说读锁与写锁
读锁会阻塞写,但是不会阻塞读。而写锁则会把读和写都阻塞。
什么是非标准字符串类型?
TINYTEXTTEXTMEDIUMTEXTLONGTEXT
说一说MySQL的时间函数
时间函数结果.png
now()(current_timestamp())函数获得的是语句开始执行时的时间,而sysdate()函数是这个函数执行时候的时间。CURRENT_DATE:年月日;其他:年月日时分秒
索引列的数量有没有限制?
有限制默认16个列!
MySQL的sql语句区分大小写么?
不区分,下面一个sql是等价的SELECTNOW();selectnow();sElEcTnOw();性能比较:关键字大写所有语句大写所有语句小写
MySQL高级开发面试题(二)
MySQL高级开发面试题(一)