MySql(系统基础篇)
数据库三大范式是什么
- 第一范式:每个列不可拆分
- 第二范式:在第一范式基础上,所有非主键列完全依赖主键列,而不是主键的一部分
- 第三范式:在第二范式基础上,所有非主键列只依赖主键列,不依赖其他的非主键。
MySql自带的权限表
- user权限表:记录允许连接到服务器的用户帐号信息,里面的权限是全局级的。
- db权限表:记录各个帐号在各个数据库上的操作权限。
- table_priv权限表:记录数据表级的操作权限。
- columns_priv权限表:记录数据列级的操作权限。
- host权限表:配合db权限表对给定主机上数据库级操作权限作更细致的控制。这个权限表不受GRANT和REVOKE语句的影响。
MySql的binlog
binlog是MySql存储的二进制日志,用于记录用户操作Sql语句的信息
binlog具备三种模式
- STATMENT模式
在STATMENT模式中用户每一条
修改数据的SQL都会记录到日志当中
优点: 不需要记录每一条SQL语句和每行的数据变化,减少磁盘的读写IO,减少数据库开销。
缺点: 在某些情况下会导致master-slave中的数据不一致(如sleep()函数, last_insert_id(),以及user-defined functions(udf)等会出现问题)
- ROW模式
不记录每一条SQL的上下文的信息,只记录那一行被修改了,修改成什么样。
优点:不会出现某些特定情况下的存储过程、或function、或trigger的调用和触发 无法被正确复制的问题。
缺点:会产生大量的日志,尤其是alter table的时候会让日志暴涨。
- 混合模式
一般情况下使用STATMENT模式记录日志,在无法使用STATMENT模式时,切换为ROW模式。
MySql会根据执行的SQL来选择日志保存的方式。
binlog的设置
在MySQL配置文件my.cnf文件中的mysqld节中添加下面的配置文件:
[mysqld]
#设置日志格式
- binlog_format = mixed
- 设置日志路径,注意路经需要mysql用户有权限写 log-bin = /data/mysql/logs/mysql-bin.log
- 设置binlog清理时间 expire_logs_days = 7
- binlog每个日志文件大小 max_binlog_size = 100m
- binlog缓存大小 binlog_cache_size = 4m
- 最大binlog缓存大小 max_binlog_cache_size = 512m
重启MySQL生效,如果不方便重启服务,也可以直接修改对应的变量即可。
引擎
常用的引擎
- InnoDB
- InnoDB提供了ACID的事务支持,并且支持行级别锁,外键约束。
- MyIASM
- MyIASM不支持事务,行级别锁。但是支持表级别锁
- MEMORY
- MyIASM所有数据存储在内存中,读取速度快,但是安全性低
MyIAM索引和InnoDB索引的区别
- InnoDB索引是聚簇索引,MyISAM索引是非聚簇索引。
- InnoDB索引的叶子节点上存储着索引和行数据,所以InnoDB的主键索引数据非常高效
- MyIASM索引的叶子节点上存储着行数据距的指向地址,需要再根据地址去进行查找
- InnoDB的非主键索引的叶子节点存储着主键和其他非主键索引的列数据
InnoDB的四大特性
- 插入缓冲
-
插入缓冲在非唯一索引非聚合索引才生效,当第一次插入时,MySQL会先检查buffer中是否包含索引页,如果有直接插入,如果没有先放置到buffer中,等到一定频率再合并操作。
-
插入缓冲能讲多个操作合并成一个组,能减少IO消耗
-
操作频率 1.辅助索引页被读取到缓冲池中。正常的select先检查Insert Buffer是否有该非聚集索引页存在,若有则合并插入。
2.辅助索引页没有可用空间。空间小于1/32页的大小,则会强制合并操作。
3.Master Thread 每秒和每10秒的合并操作。
-
- 二次写
- 自适应hash索引
- 预读