数据库的类型
非关系型数据库:例如Redis,以key-value的形式存储,可以存储数据,也可以存储文件图片等;读写速录快,基于内存操作
关系型数据库:支持事务,使用表结构,可以进行复杂查询,读写速录慢存储数据不够灵活
主从复制原理
主库开启binlog日志和dump线程,授权用户账号权限;从库开启io线程和sql线程;当主库的binlog日志发生变化时,dump线程会告诉io线程,从库的io线程会去读取binlog日志,将内容记录到从库的中继日记中,然后sql线程读取中继日志,并运行,直到主从库数据一致;
MySQL数据库的4中基本语言
DDL:数据库定义语言
create:创建一个数据库或表
alter:修改表结构
drop:彻底删除表
truncate:只删除表中数据
comment:为数据库对象添加备注DML:数据库修改语言
insert:添加表数据
update:修改表数据
delete:删除表数据DCL:数据库控制语言
crant:授予用户权限
recoke:删除用户权限
commit:提交事务
rollback:回滚事务DQL:数据库查询语言
select:创建表
主从方式有几种
binlog日志方式:从节点需要手动指定binlog日志的文件名称、位置;
gtid方式:从节点不要手动指定,会自动锁定;
MySQL的数据备份有几种
逻辑备份:MySQLdump,备份sql语句,速度慢,恢复慢,需要一条一条执行sql语句;
物理备份:xtrabackup备份,备份速度慢,文件大,恢复速度快;
物理备份又分为3种:
(1)全量备份:备份当前所有数据;
(2)增量备份:备份上一次备份到当前时间点新增的数据,占用磁盘空间小,恢复过程复杂;
(3)差异备份:备份跟全量备份不一致的数据,占用磁盘空间大,恢复过程简单;
事务的特性
(1)原子性:指事务是不可拆分的最小单元;
(2)隔离性:事务的执行不受到其他并发事务的影响;
(3)一致性:事务中的sql,要么全部成功,要么全部失败;
(4)持久性:一但事务提交,对数据库的改变是永久的;
脏读、不可重复读、幻读
(1)脏读:a开启一个事务并更新了数据,但是未提交,b读取a更新的数据,但是a进行了回滚,b读到的就是脏数据;
(2)不可重复读:指在同一个事务内,多次读取同一数据时,由于其他事务的修改,导致两次读取的结果不一致;
(3)幻读:指在一个事务内进行范围查询,由于其他事务的插入或删除操作,导致前后两次查询结果不一致
数据库引擎
(1)innodb:支持事务,支持行锁定;
(2)myisan:有较高的查询速度,但是不支持事务;
(3)memory:支持锁表,不支持行锁定;(需要很快的读写速度但是对安全性要求不高的话可以使用,对表的大小有要求)
MySQL的数据类型
浮点型、整数型、字符串型、枚举型、日期时间类型、集合型
MySQL的约束添加
(1)主键:用于唯一的标识行的数据,定义主键约束后,此列的值不能重复
(2)default:默认约束,即使插入的数据没有值,也会有默认值;
(3)not null:定义后,该列的值不能为空
(4)unique:唯一约束,该类不允许重复
(5)自增键
MySQL主从不一致原因
(1)网络延迟:主从复制是基于binlog日志,通过网络来传送binlog文件;
(2)主从机器负载不一致:主库开启dump线程,从库开启io和sql线程,;当其中一台服务器负载过高时,会导致线程资源不足;
(3)max_allowed_packet设置不一致:主库的max_allowed_packet设置比从库大,一条sql语句在主库能执行完毕,但在从库无法执行,导致主从不一致;
解决方法
(1)stop slave set global sql_slave_skip_counter=1,跳过这一步错误;
(2)重新做主从:先锁表,导入数据+同步;
MySQL彻底删除一张表
delete from 表名;
drop table 表名;
truncate table 表名;
#区别
delete:只删除表中的数据;
drop:删除表数据以及表结构;
truncate:删除表数据,因为不需要一行一行去执行,所以删除速率比delete快;
MySQL读写分离的好处
主要分担了主服务器的读取压力,提高了主库的写入能力,因为读请求全部发给了从库
MySQL的优化
(1)安全方面:修改默认的端口;禁止root用户登录;对用户降权,以普通用户运行MySQL;
(2)性能方面:升级硬件,内存,磁盘,优化sql语句,设置索引;
(3)参数优化:innodb的buffer参数调大,连接数调大,优化缓存的参数
(4)架构方面:设置读写分离,一主多从,高可用
如何优化sql语句
(1)在查询时避免使用select * from 去查询;用所需要的字段来替换*;
(2)where条件后面不加not null ,避免索引失效
(3)对于所需要的列尽量去创建索引;
(4)避免频繁创建和删除临时表,减少系统资源消耗;
MySQL的同步方式有那些?
(1)异步复制:MySQL默认的复制是异步复制,主库在执行完客户端提交的事务之后会立即将结果返回给客户端,不关心从库是否已经接受并处理;一但主库宕机,此时主库上已经提交的事务可能因为网络原因没有传到从库上,如果此时执行故障转移,强行将从库提升为主库,可能导致新主库数据不完整;
(2)全同步复制:当主库执行完一个事务,并且所有从库都执行了该事务,主库才提交事务并将结果返回给客户端;这样的话全同步复制的性能会受到严重影响;
(3)半同步复制:主库只需要等待一个从库接收并写到Relay Log文件即可,不需要等待所有从库给主库返回ACK,主库受到ACK以后,才能给客户端返回“事务完成”的确认;