一、索引
1、索引下推
联合索引,老版本是根据第一个索引查询结果集后进行过滤
新版本是通过所有的索引查询结果集进行查询
2、
嵌套循环连接 对于关联字段加了索引的表,使用索引,性能比较好
基于块的嵌套循环连接 对于关联字段没有添加索引的表,会把小表放入内存,一一与大表进行比对,增加性能。
3、mysql一页默认是16k
4、单路排序 一次性拿出所有的字段进行排序
双路排序 拿出id和排序字段进行排序,排序完成后进行回表查询
默认1024个字节,根据这个配置是执行单路还是双路
5、分页查询优化,先查询某页数据的id,再用id进行关联查询,减少查询时候的字段,增加性能
6、尽量使用 count(*),count(列名)和count(常量)不会统计null行
二、事务
隔离级别
1-READ-UNCOMMITTED(读未提交)脏读(事务A读取到了事务B已经修改但尚未提交的数据)
2-READ-COMMITTED(读已提交)不可重复读(事务A内部的相同查询语句在不同时刻读出的结果不一致)
3-REPEATABLE-READ (可重复读)幻读(事务A读取到了事务B提交的新增数据)
4-SERIALIZABLE (可串行化)解决上面所有问题
MVCC实现可见性
三、Innodb存储引擎
1、查询原始数据到缓存
2、写入undo日志(主要用于回滚数据)
3、更新数据到缓存
4、写入redo日志缓存
5、顺序写入redo日志(物理修改,具体在磁盘的位置)
6、写入binlog日志(逻辑修改,记录具体sql)
7、提交commit标记,提交事务
8、数据写入磁盘
WAL机制(Write-Ahead-Logging)
redolog的参数
innodb_flush_log_at_trx_commit:这个参数控制redolog的写入策略,它有三种可能取值:
设置为0:表示每次事务提交时都只是把redolog留在redologbuffer中,数据库宕机可能会丢失数据。
设置为1(默认值):表示每次事务提交时都将redolog直接持久化到磁盘,数据最安全,不会因为数据库宕机丢失数据,但是效率稍微差一点,线上系统推荐这个设置。
设置为2:表示每次事务提交时都只是把redolog写到操作系统的缓存pagecache里,这种情况如果数据库宕机是不会丢失数据的,但是操作系统如果宕机了,pagecache里的数据还没来得及写入磁盘文件的话就会丢失数据。
四、Mysql8.0新特性
1、新增降序索引
2、group by 不再隐式排序
3、增加隐藏索引
4、新增函数索引
5、innodb存储引擎select for update跳过锁等待
6、新增innodb_dedicated_server自适应参数
7、死锁检查控制
8、undo文件不再使用系统表空间
9、 binlog日志过期时间精确到秒
10、窗口函数(Window Functions):也称分析函数
12、默认字符集由latin1变为utf8mb4
13、MyISAM系统表全部换成InnoDB表
14、元数据存储变动
15、自增变量持久化
16、DDL原子化
17、参数修改持久化
五、Mysql8.0主从复制
复制方式 :
1、从binlog复制
2、增加从全局事务id进行复制
数据同步方式:
1、异步复制,直接写入binlog完事,从节点会有线程来拉取主节点的binlog
2、半同步复制,写入从节点的中继日志,只要有一个从节点响应就行