分享mysql核心知识点

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)并发事务问题

66681b27a130bfae45a10a85e393c817.png

3)redo / undo log

mysql修改数据时会先把磁盘的数据页数据加载到内存中,先再内存中把页数据修改再同步到磁盘,在内存修改页数据的同时会把修改日志记录下来,这个日志就是redo日志 所以redo日志记录的是数据页的物理变化。体现持久性

undo日志记录的是sql,事务回滚时用来恢复原来的记录。提现原子性和一致性


4)MVCC

1b3167bceba8546d0ba477e53bd30ff1.png



主从同步


1)同步原理

主库写数据的同时,生成binlog日志,从库读取主库的binlog日志,并写入relay log (中继日志),从库重新执行中继日志


分库分表

dd601de911bfe9d29584340fa6907128.png
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容