1. mysql有关权限的表都有哪几个

7个 分别是user,db,host,table_priv,colums_priv, procs_priv,proxies_priv

user:记录允许连接到服务器的用户帐号信息,里面的权限是全局级的

db:记录各个帐号在各个数据库上的操作权限。

host:配合db权限表对给定主机上数据库级操作权限作更细致的控制。这个权限表不受GRANT和REVOKE语句的影响

tables_priv:表级别权限

colums_priv:列级别权限

procs_priv:存储过程和存储函数相关的权限

proxies_priv:代理用户权限

2.MySQL的binlog有有几种录入格式?分别有什么区别?

有三种格式,statement,row和mixed。

statement模式下,每一条会修改数据的sql都会记录在binlog中。不需要记录每一行的变化,减少了binlog日志量,节约了IO,提高性能。由于sql的执行是有上下文的,因此在保存的时候需要保存相关的信息,同时还有一些使用了函数之类的语句无法被记录复制。

row级别下,不记录sql语句上下文相关信息,仅保存哪条记录被修改。记录单元为每一行的改动,基本是可以全部记下来但是由于很多操作,会导致大量行的改动(比如alter table),因此这种模式的文件保存的信息太多,日志量太大。

mixed,一种折中的方案,普通操作使用statement记录,当无法使用statement的时候使用row。

3.MySQL存储引擎MyISAM与InnoDB区别

(1) InnoDB 支持事务,MyISAM 不支持事务。这是 MySQL 将默认存储引擎从 MyISAM 变成 InnoDB 的重要原因之一;

(2)InnoDB 支持外键,而 MyISAM 不支持。对一个包含外键的 InnoDB 表转为 MYISAM 会失败;

(3)InnoDB 支持主键聚集索引+非聚集索引,MyISAM 只支持非聚集索引。聚簇索引的文件存放在主键索引的叶子节点上,如果表没有定义主键,InnoDB会选择一个唯一的非空索引替代,如果也没有这样的索引,InnoDB会隐式定义一个主键来作为表的聚簇索引。通过主键索引效率很高。但是非聚集索引需要两次查询,先查询到主键,然后再通过主键查询到数据。而 MyISAM 是非聚集索引,数据文件是分离的,索引保存的是数据文件在产品的指针。

(4)InnoDB 不保存表的具体行数,执行 select count(*) from table 时需要全表扫描。而MyISAM 用一个变量保存了整个表的行数,执行上述语句时只需要读出该变量即可,速度很快;

(5) InnoDB 最小的锁粒度是行锁,MyISAM 最小的锁粒度是表锁。一个更新语句会锁住整张表,导致其他查询和更新都会被阻塞,因此并发访问受限。这也是 MySQL 将默认存储引擎从 MyISAM 变成 InnoDB 的重要原因之一;

4.InnoDB引擎的4大特性

插入缓存   

在insert数据时,如果该数据的非聚集索引页存在于缓冲池中,那么就直接插入到索引页中,如果不存在,则插入到insert buffer中,然后按照一定的频率进行合并操作,写入磁盘,这样做的目的就是为了能合并操作,减少磁盘的写入次数,注意只是非聚集索引是需要这样的,聚集索引(id)一般都是自增的,写入的位置都是顺序的,所以效率很高,不需要这个,但是非聚集索引就等于是随机写,效率较低。delete 和 update也有自己的buffer,跟insert buffer一样的

两次写    

innodb页的大小是16k,相对来说还是比较大的,所以当将脏页写会到磁盘中时,可以发送断电宕机等问题,导致写入了一半,这个时候就没法恢复了,所以使用了两次写这样的机制

自适应hash  

当某个非聚集索引被等值查询的次数很多时,就会为这个非聚集索引再构造一个hash索引,hash索引对呀等值查询是很快的,这个hash索引会放在缓存中

提前读

innodb中将64个页划分为一个extent,当一个extent中的页,被顺序读超过了多少个,比如50个,这个值是可以通过nnodb_read_ahead_threshold设置的,那么就会认为顺序读到下一个extent的可能性很大,会提前将下一个extent中的所有页都加载到buffer pool中,这叫线性预读,如果某一个extent中,有多个页被读到,就会认为读到这个extent中其他页的可能性也很大,就会把该extent中的其他页也都提前读到buffer pool中

5.存储引擎选择

选择MyISAM的场景 : 如果只是读查询,数据读取速度比Innodb快,不需要高并发和事务的时候,也不在意数据丢失

选择Innodb的场景:需要支持事务和高并发,读写频繁的时候建议Innodb,另外如果数据崩溃,不接受丢数据也选择Innodb