MySQl学习
1,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列的长度固定为创建表时声明的长度。长度可以为从0到255的任何值。当保存CHAR值时,在它们的右边填充空格以达到指定的长度。当检索到CHAR值时,尾部的空格被删除掉。在存储或检索过程中不进行大小写转换。
VARCHAR列中的值为可变长字符串。长度可以指定为0到65535之间的值。VARCHAR的最大有效长度由最大行大小和使用的字符集确定。在MySQL 4.1之前的版本,VARCHAR(50)的“50”指的是50字节(bytes)。如果存放UTF8汉字时,那么最多只能存放16个(每个汉字3字节)。从MySQL 4.1版本开始,VARCHAR(50)的“50”指的是50字符(character),无论存放的是数字、字母还是UTF8汉字(每个汉字3字节),都可以存放50个。
CHAR和VARCHAR类型声明的长度表示保存的最大字符数。例如,CHAR(30)可以占用30个字符。对于MyISAM表,推荐CHAR类型;对于InnoDB表,推荐VARCHAR类型。另外,在进行检索的时候,若列值的尾部含有空格,则CHAR列会删除其尾部的空格,而VARCHAR则会保留空格