MySQl学习



1,MYSQL复制原理及其流程

MySQl学习

1,在slave服务器上开启start slave开关,开始主从复制;

2,此时,slave服务器上的I/O线程会通过在master上已经授权的复制用户权限请求连接master服务器,并请求从执行binlog执行文件的指定位置之后开始发送binlog日志内容(日志文件名和位置就是在配置主从复制服务时执行change master命令指定的);

3,master服务器接收到来自slave服务器的IO线程的请求后,二进制转储IO线程会根据slave服务器的IO线程请求的信息分批读取指定binlog日志文件指定位置之后的binlog信息,返回给slave的IO线程,返回的信息除了binlog日志内容外,还有在master服务器端记录的新的binlog文件名称,以及在新的binlog文件中下一个指定更新位置.

4,当slave服务器的IO线程获取到Master服务器上IO线程发送的日志内容,日志文件及位置点后,会将binlog日志内容依次写入slave端自身的relay log(中继日志)文件中的最末端(Mysql-relay-bin.xxx)的最末端,并将新的binlog文件名和位置记录到master-info文件中,以便下次读取master端新binlog日志时能告诉master服务器从新binlog日志指定文件及位置开始读取新的binlog日志内容.

5,slave服务器的sql线程会实时检测本地relay log中IO线程新增的日志内容,然后及时把relaylog中的内容解析为sql语句,并在自身slave服务器上按解析sql语句的位置顺序执行应用这样的sql语句,并在relay-log.info中记录当前应用中继日志的文件名和位置点.

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

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

2. 从:io线程——在使用start slave 之后,负责从master上拉取 binlog 内容,放进 自己的relay log中;

3. 从:sql执行线程——执行relay log中的语句;

2、MySQL中myisam与innodb的区别,至少5点

(1)、问5点不同;

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

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

3>.InnoDB支持MVCC, 而MyISAM不支持

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

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


(2)、innodb引擎的4大特性

插入缓冲(insert buffer),二次写(double write),自适应哈希索引(ahi),预读(read ahead)

(3)、2者selectcount(*)哪个更快,为什么

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

3,char和varchar的区别?

CHAR是一种固定长度的类型,VARCHAR则是一种可变长度的类型。

CHAR列的长度固定为创建表时声明的长度。长度可以为从0255的任何值。当保存CHAR值时,在它们的右边填充空格以达到指定的长度。当检索到CHAR值时,尾部的空格被删除掉。在存储或检索过程中不进行大小写转换。

VARCHAR列中的值为可变长字符串。长度可以指定为065535之间的值。VARCHAR的最大有效长度由最大行大小和使用的字符集确定。在MySQL 4.1之前的版本,VARCHAR(50)的“50”指的是50字节(bytes如果存放UTF8汉字时,那么最多只能存放16个(每个汉字3字节)。从MySQL 4.1版本开始,VARCHAR(50)的“50”指的是50字符(character),无论存放的是数字、字母还是UTF8汉字(每个汉字3字节),都可以存放50个。

CHARVARCHAR类型声明的长度表示保存的最大字符数。例如,CHAR(30)可以占用30个字符。对于MyISAM表,推荐CHAR类型;对于InnoDB表,推荐VARCHAR类型。另外,在进行检索的时候,若列值的尾部含有空格,则CHAR列会删除其尾部的空格,而VARCHAR则会保留空格