mysql
1.sql优化
explain 关键字
explain 关键字.png
执行计划关键字 | |
---|---|
possible_keys | 可能用到的索引 |
key | 实际用到的索引 |
key_len | 索引占用的大小 |
extra | 额外优化建议 |
-- user where ; user index | 使用了索引,需要的数据都能在表中找到,不需要回表 |
-- user index condition | 使用了索引但需要回表查询 |
type | sql连接类型 性能好到差依次null,system,const,eq_ref,range,index,all |
可以采用MySQL自带的分析工具EXPLAIN
通过key和key len检查是否命中了索引(索引本身存在是否有失效的情况)
通过type字段查看sql是否有进一步的优化空间,是否存在全索引扫描或全盘扫描
通过extra建议判断,是否出现了回表的情况,如果出现了,可以尝试添加索引或修改返回字段来修复
2.索引
1)什么是索引?
索引(index)是帮助MySQL高效获取数据的数据结构(有序)
提高数据检索的效率,降低数据库的O成本(不需要全表扫描)
通过索引列对数据进行排序,降低数据排序的成本,降低了CPU的消耗
2)索引结构
MySQL的InnoDB引擎采用的B+树的数据结构来存储索引
阶数更多,路径更短
磁盘读写代价B+树更低,非叶子节点只存储指针,叶子阶段存储数据
B+树便于扫库和区间查询,叶子节点是一个双向链表
3)聚集索引、非聚集索引(二级索引)、回表查询
聚集索引:数据与索引放在一起,叶子节点包含整行数据,有且只有一个,一般为主键
非聚集索引:数据与索引分开存储,叶子节点只保存对应的主键,可用有多个
回表查询:使用非主键索引查询,再使用聚集索引查询全部数据,这个过程就是回表查询
4)覆盖索引、超大分页
知道什么叫覆盖索引嘛?
覆盖索引是指查询使用了索引,返回的列,必须在索引中全部能够找到
使用d查询,直接走聚集索引查询,一次索引扫描,直接返回数据,性能高。
如果返回的列中没有创建索引,有可能会触发回表查询,尽量避免使用select*
MYSQL超大分页怎么处理?
问题:在数据量比较大时,iit分页查询,需要对数据进行排序,效率低
解决方案:覆盖索引+子查询
5)索引创建规则
使用频繁,数据量大,尽量使用联合索引、并非越多越好
事务
1)特性
ACID
原子性 不可分割
一致性 同时成功同时失败
隔离性 不受其他事务干扰
持久化 落盘
2)并发事务问题
3)redo / undo log
mysql修改数据时会先把磁盘的数据页数据加载到内存中,先再内存中把页数据修改再同步到磁盘,在内存修改页数据的同时会把修改日志记录下来,这个日志就是redo日志 所以redo日志记录的是数据页的物理变化。体现持久性
undo日志记录的是sql,事务回滚时用来恢复原来的记录。提现原子性和一致性
4)MVCC
主从同步
1)同步原理
主库写数据的同时,生成binlog日志,从库读取主库的binlog日志,并写入relay log (中继日志),从库重新执行中继日志