Mysql优化
表象:页面加载慢,接口反应时间长
如何定位慢查询?
1.开源工具:Arthas
运维工具:Skywalking
2.Mysql自带慢日志,需要设置


SQL执行慢分析
加EXPLIAIN(explian)或者DESC(desc)


一般来说type字段是index或者all就需要优化了

索引
索引是帮助Mysql高效获取数据的数据结构
索引底层数据结构(B+树)
红黑树时间复杂度O(log n)—— 平衡数据分布极端的情况
B树

B+树(非叶子结点只存储指针)—— 叶子结点直接采用双向链表


聚簇索引和二级索引(非聚簇)
聚簇索引,一般来说是ID主键索引,叶子存整行数据
二级索引,其他属性的,叶子节点存主键
通过二级索引找聚簇索引,查信息,即为回表查询

覆盖索引
回表查询性能不高

超大分页优化(使用覆盖索引+子查询)
原因:
需要limit排序效率低



索引创建原则


索引失效


谈谈SQL优化经验
五大类

- 表的设计

- SQL语句

ps:where少用表达式避免索引失效的情况
- 主从复制、读写分离
搭建主库和从库,避免写影响读


事务

事务的特性
一组操作的集合,不可分割,同时成功或者失败
ACID
- 原子性
- 一致性
- 隔离性
- 永久性


并发事务问题


脏读:事务还没提交数据,被另一个事务读取了
不可重复读:两次查询读到的数据不一样(因为事务并发问题导致两次查询之间另外一事务更改了数据)
幻读:第一次查询没读到数据,想插入,但是中间另一事务插入了,导致无法插入
解决方案——> 事务隔离

事务隔离级别越高,数据越安全,但是性能越低
默认Repeated read

undo log 和 redo log
redo保证持久性
undo 保证原子性,一致性

MVCC(多版本并发控制)
太难了,下次再看
主从同步


主库写二进制日志binlog文件,从库读,写入中继日志relay log,然后再执行
分库分表

水平分库(按路由结点将一个库分成多个)——优先使用,解决海量数据问题

水平分表(一个表分到多个表)

垂直分库(根据业务把不同的表拆分到不同的库)

垂直分表(将不同字段放到不同的表)



