Mysql数据库技术知识整理

Mysql的知识点目录

  • 重点:架构,引擎,索引,锁机制,事务机制,日志机制,集群,调优
3、Mysql索引
  • 索引概念
    • 覆盖索引: 条件列和结果列都在索引中
    • 索引下推: 查询会先过滤条件列,然后回表查数据
    • 最左前缀匹配: 查询条件会从最左开始匹配索引列
    • 回表:经过索引查询后,不满足还需要通过ID查询所有数据
  • 索引失效原因
    • or,!=,not in,like等
  • 创建索引原则
    • 最左前缀原则
    • 读多写少创建索引,写多的不适宜
    • 避免破坏索引的查询
    • 优先在原有基础上创建索引,避免新建索引
    • 区分度低列,外键不建索引
    • 删除不再使用进货很少用的索引
4、mysql锁机制
  • 锁机制 : 乐观锁(MVCC机制),悲观锁
  • 锁粒度 : 全局锁,表锁,行锁,叶索,间隙锁
  • 兼容性:共享锁(S锁),排他锁(X锁)
  • 锁的模式:记录锁(行锁),间隙锁,意向锁(分为读,写,插入意向锁),next-key锁,自增所
  • 死锁的解决
    • 互斥条件,请求和保持条件,环路等待条件,不剥夺条件
    • 解决思路:切断环路
    • 死锁与索引密不可分,解决索引问题,需要合理优化你的索引
    • 在同一个事务中,尽可能做到一次锁定所需要的所有资源,减少死锁产生概率

Mysql的主从复制,读写分离

  • mysql主从同步延迟

    • 原因:主库在高并发写操作时,由于某些SQL执行时间较长,或者SQL锁表导致主库的SQL积压,不能马上同步到从库导致
    • 场景:高并发场景时,修改数据库字段,或者发生长事务时,会导致主从延迟
    • 解决办法:
      • 从库读操作:sync_binlog=0 , 提交SQL执行效率,或者使用更好的设备
      • 硬件上:(1)使用更好的设备做从库,(2)增加从库的机器数量,(3)把某一台从库当做备用,不处理查询操作
    • 判断主从延迟:通过show slave status,通过Seconds_Behind_Master参数判断
  • 主从复制延迟问题

  • mysql读写分离

    • 应用层控制DML语句在主库操作–同步到从库
    • 应用层控制SQL语句在从库操作
    • 应用层在操作读写事件是可以要求强制读主库,保证一致性
  • mysql主从延迟

    • 主要根据业务需求,
    • 要求强一致性:读写全部在主库
    • 弱一致性:一般读在从库,事务读写都在主库
    • 最终一致性:写在主库,从在读库

Mysql分库分表

  • 分库分表中间件方案
    • 当当-shardingjdbc,阿里-mycat,阿里-tddl,阿里-cobar,58同城-Oceanus,阿里-OneProxy,谷歌-vitess
  • 分库分表的问题
    • 事务问题
      • 方式一:使用分布式事务,简单有效,但是性能代价高
      • 方式二:将跨库分布式事务拆分成多个单库的小失误,通过程序来控制小事务,性能上优势,但是破坏了耦合性
    • 跨结点join问题
      • 方式:统一单表操作,通过程序控制
    • 跨结点count,orderby,groupby
      • 方式:和join类似,在每个节点执行然后再做合并
    • id问题
      • Redis自增ID
      • 雪花算法生成ID
      • 数据库维护一个sequence
    • 跨分片排序分页问题
      • 尽量避免出现跨库的查询分页,如果无法避免,采用内存分页方式
    • 数据迁移,容量规划,扩容问题
      • 提前规划
主从延迟问题
  • 主从同步步骤:
    • 主库发生更新,写入到bin_log
    • 从库发起连接到主库
    • 主库创建一个binlog dump thread,把binlog的内容发送到从库
    • 通过IO线程,读取binlog内容并写入到relay log
    • 从库还会创建一个SQL线程,从relay log里面读取内容并执行
  • 原因:
    • 从库的机器性能差
    • 从库访问压力大
    • 大事务的执行
    • 主库的DDL(alter、drop、create)
    • 锁冲突
    • 从库的复制能力
  • 解决办法:
    • 主服务负责更新, 安全性要高,所以设置参数,
      • 例如:sync_binlog=1
      • 例如:innodb_flush_log_at_trx_commit=1
    • 更好的设备作为从库,或者设置更多的从库
    • 某台从库不提供查询,专门提供bin_log同步到从库
    • 降低多线程大事务并发的概率,优化业务逻辑
    • 优化SQL,避免慢SQL,减少批量操作,建议写脚本以update-sleep这样的形式完成。
    • 尽量采用短的链路,也就是主库和从库服务器的距离尽量要短,提升端口带宽,减少binlog传输的网络延时。
    • 实时性要求的业务读强制走主库,从库只做灾备,备份。
关于BufferPool缓冲池
  • mysql数据存储在磁盘,会根据sql的需要通过索引等方式从磁盘中刷到缓冲池
  • mysql的sql操作会现在磁盘中操作,事务完成后通过Bin_log刷盘到磁盘。

数据表设计

数据表类型
  • 第一类:流水表,日志表,
  • 第二类:状态型,记录核心数据
  • 第三类:配置表,数据量少,不需要优化

面试:谈谈Mysql调优

1、调优过程
  • 1、定位问题:
  • 2、分析问题
  • 3、解决问题
  • 4、验证结果
第一步:定位问题
  • 通过服务监控,找到服务卡顿时或服务超时的时间,分析接口
  • 通过接口定位代码,进一步定位到执行的SQL,查看执行时长,确认现场
第二步:分析问题
  • 通过数据库监控,查看发生问题时,DB集群的数据的CPU,内存,IO磁盘,网络,线程数等参数
  • 通过分析现场参数,结合SQL,判断问题所在,例如以下
    • CPU过高,检查SQL中是否有运算,是否吞吐量过高等
    • 内存过高,SQL是否有用到索引,是否频繁回表
    • IO磁盘过高,是否有大表join等问题
    • 网络延迟高,是否云服务网络问题
    • 线程问题,是否长事务导致锁问题
第三步:解决问题
  • 系统负载过高,进行DB扩容,使用分库分表,读写分离等手段,应用层增加缓存等
  • 由于SQL原因,进行SQL优化,加索引,使用覆盖索引,删除冗余索引等,一般通过explain分析
  • 优化长事务,缩短事务流程
  • 优化应用程序,例如加入分布式缓存,以及DAO缓存等
第四步:验证结果
  • 设定期望,例如减少请求响应时间,降低系统负载等
  • 先在压测环境更新,然后通过压测验证
  • 压测没有问题,再部署到生产

Mysql的调优

Mysql的底层知识点

日志种类以及作用
  • general_log 一般日志
  • error_log 错误日志
  • slow_query_log 慢查询日志
  • relay_log 中继日志–数据同步,故障恢复起作用
    • relay log日志文件具有与bin log日志文件相同的格式
    • relay log起到一个中转的作用,slave先从主库master读取二进制日志数据,写入从库本地,后续再异步由SQL线程读取解析relay log为对应的SQL命令执行relay log起到一个中转的作用,slave先从主库master读取二进制日志数据,写入从库本地,后续再异步由SQL线程读取解析relay log为对应的SQL命令执行
  • bin_log 归档日志–数据持久性中起作用
    • 记录数据库所有的DDL和DML记录,保证数据库数据完整性
  • undo_log 回滚日志–事务隔离性和原子性中起作用
    • undo log属于逻辑日志,如其名主要起到回滚的作用,它是保证事务原子性的关键。记录的是数据修改前的状态
    • 在数据修改的流程中,同时会记录一条与当前操作相反的逻辑日志到undo log中。
    • 如果事务执行时,提交rollback则会执行undo_log保证事务回滚
  • redo_log 重做日志–数据持久性中起作用
    • redo log属于MySQL存储引擎InnoDB的事务日志。
    • 作用类似于备份,当出现宕机后恢复时,会使用redo_log快速恢复数据

mysql底层知识点

MVCC原理:
  • 为了实现高并发事务场景下使用无锁化场景,解决数据幻读的问题
  • 实现原理:
    • 关键:隐藏字段,当前读,快照读,事务快照,redolog等配合完成
    • 1、隐藏字段:db_row_id行ID,db_trx_id事务ID,db_roll_ptr回滚指针
    • 2、undo_log用作操作先备份数据,如果出现异常后回滚数据
    • 3、当前读:在读锁下读取最新数据,快照读:不一定是最新数据,类似于缓存
    • 4、事务快照+readView
      • 事务快照是表共享空间的建立的事务快照,用于区分事务前后顺序
      • readView是事务快照读产生的读视图,如果读操作是在事务之前,则可见,如果在事务之后,则不可见,用于控制可见性

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/52678.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

FactoryBean和BeanFactory:Spring IOC容器的两个重要角色简介

目录 一、简介 二、BeanFactory 三、FactoryBean 四、区别 五、使用场景 总结 一、简介 在Spring框架中,IOC(Inversion of Control)容器是一个核心组件,它负责管理和配置Java对象及其依赖关系,实现了控制反转&a…

lazy初始化和懒加载(Lazy Loading)

lazy初始化 lazy初始化指的是在需要时才进行对象的初始化,而不是在声明或加载时立即初始化。这种延迟初始化的方式可以提高程序的性能和效率,特别是在对象较大或者初始化较慢的情况下。 在很多编程语言中,我们可以使用各种技术来实现lazy初…

如何理解原假设和备择假设?

原假设H0:一般是想要推翻的结论,如指标没有变化,实验组和对照组的该结果指标没有差异等。 备择假设H1:一般是想要证明的结论,如实验组的指标是显著提升的,指标提升10%等。 反证法的思想:因为假…

CDH集群离线配置python3环境,并安装pyhive、impyla、pyspark

背景: 项目需要对数仓千万级数据进行分析、算法建模。因数据安全,数据无法大批量导出,需在集群内进行分析建模,但CDH集群未安装python3 环境,需在无网情况下离线配置python3环境及一系列第三方库。 采取策略&#xf…

【UniApp开发小程序】私聊功能uniapp界面实现 (买家、卖家 沟通商品信息)【后端基于若依管理系统开发】

文章目录 效果显示WebSocket连接使用全局变量WebSocket连接细节 最近和自己聊天的用户信息界面效果界面代码最近的聊天内容太长日期时间显示未读消息数量显示 私聊界面界面展示代码实现英文长串不换行问题聊天区域自动滑动到底部键盘呼出,聊天区域收缩,聊…

报错:1 字节的 UTF-8 序列的字节 1 无效。

这里我的问题出现在BookMapper.xml中 java.lang.IllegalStateException: Failed to load ApplicationContextat org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:125)at org.spring…

Hbase--技术文档--单机docker基础安装(非高可用)

环境准备-docker 配置Linux服务器华为云耀云服务器之docker安装,以及环境变量安装 java (虚拟机一样适用)_docker配置java环境变量_一单成的博客-CSDN博客 说明: 本文章安装方式为学习使用的单体hbase项目。主要是学习&#xff…

Unity之用Transform 数组加多个空物体-->简单地控制物体按照指定路线自动行驶

文章目录 **原理解释**:**带注释的代码**:实际运用 当你需要实现物体按照指定路线行驶时,你可以通过以下步骤来实现: 原理解释: 路径点:你需要定义一系列路径点,这些点将构成物体行驶的路线。每…

双指针算法总结

双指针算法大致有以下几个类型 对撞指针:一般用来处理两数和问题快慢指针: 一般在链表中用的比较多,如求链表中间结点,链表是否有环等,当然一些非链表题也会用到相关的思想区间划分: 将数组分成两个不同性质…

next.js报错点

next.js报错点 1.类型“{ children: ReactNode; }”与类型“IntrinsicAttributes”不具有相同的属性。2. 不能将类型“void[]”分配给类型“ReactNode”?3.useRouter only works in Client Components. Add the "use client" directive at the top of the…

【LeetCode 】数组简介

集合列表和数组 本文中介绍的概念为适用于所有编程语言的抽象理论,具体实现会由编程语言的不同而稍有差别。 具体介绍数组之前,我们先来了解一下集合、列表和数组的概念之间的差别。 集合 集合一般被定义为:由一个或多个确定的元素所构成的…

AE各个版本号对应

用于版本转换 2007年7月 After Effects CS3(After Effects 8.0) 2008年9月 After Effects CS4(After Effects 9.0) 2011年4月 After Effects CS5(After Effects 10.0) 2012年4月 After Effects CS6&…

TypeScript封装Axios

TypeScript封装Axios Axios的基本使用 因axios基础使用十分简单,可参考axios官方文档,这里不在介绍他基本用法,主要讲解拦截器。 拦截器主要分为两种,请求拦截器和响应拦截器。 请求拦截器:请求发送之前进行拦截&…

详解单体架构和微服务(概念,优缺点和区别)

单体架构和微服务 单体架构和微服务架构区别?为什么要用微服务架构? 单体架构的整个系统是一个War包,即war包走天下。微服务架构的项目是很多个war包(一个子系统一个)。 单体架构的优点: 架构简单开发测试部署简单…

Python读取Excel:实现数据高效处理的利器

目录 一、Python读取Excel的常用库二、Python读取Excel的步骤三、具体案例和使用场景四、Python读取Excel的优势与其他编程语言比较 摘要 本文将介绍Python读取Excel的方法,并通过具体案例和使用场景展示如何实现数据高效处理。我们将介绍常用的Python库&#xff0c…

[docker][WARNING]: Empty continuation line found in:

报警内容: 下面展示一些 内联代码片。 //执行 sudo docker build ubuntu:v1.00 . [WARNING]: Empty continuation line found in:出现上述错误原因为18行多了一个 " \" 符号,去除即可

macOS nginx部署前端项目

1、安装nginx; brew install nginx2、配置nginx,主要配置代码,服务器代理 1、配置文件地址 根目录是 macOS 文件系统的最顶层目录。您可以在 Finder 中使用快捷键 Shift Command G,然后输入 /usr,即可直接打开 /u…

c++ qt--QString,弹出框(第二部分)

c qt–QString&#xff0c;弹出框&#xff08;第二部分&#xff09; 一.QString 1.所用头文件 #include<QString>2.功能 1.初始化 可以用字符&#xff0c;常量字符串、字符指针、字符数组等类型给QString进行初始化 QString str2"4567";//进行初始化2.拼…

卷积神经网络实现天气图像分类 - P3

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f366; 参考文章&#xff1a;Pytorch实战 | 第P3周&#xff1a;彩色图片识别&#xff1a;天气识别&#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制&#x1f680; 文章来源&#xff…

【LeetCode75】第三十五题 统计二叉树中好节点的数目

目录 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 代码&#xff1a; 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 给我们一棵二叉树&#xff0c;让我们统计这棵二叉树中好节点的数目。 那么什么是好节点&#xff0c;题目中给出定义&#xff0c;从根节点…