吃透『MySQL』系列,手把手解析相关问题

SSM实战系列之商城系统(前端+后台)《一》项目需求分析 SSM实战系列之商城系统(前端+后台)《一》 1. 前言 这是一个电子商城整站的实战项目,包括前端的整体页面和后台管理页面。 从项目需求分析到整站开发的一整套项目开发过程记录。 也是作为本人实习阶段在做Hadoop大数据的同时,巩固一下javaweb的开发经验。 当然,如果你跟着我一起做,那么掌握了这些内容之后,相信是能比较明显地提高你的开发适应能力。 主要开发技术: Spring... 阅读详情

1、 三大范式?

第一范式:字段具有原子性,不可再分(字段单一职责)

第二范式:满足第一范式,每行应该被唯一区分,加一列存放每行的唯一标识符,称为主键(都要依赖主键)

第三范式:满足一二范式,且一个表不能包含其他表已存在的非主键信息(不间接依赖-不存在其他表的非主键信息)

「范式优点与缺点」:

「优点」:范式化,重复冗余数据少,更新快,修改少,查询时更少的distinct。

「缺点」:因为一个表不存在冗余重复数据, 「查询可能造成很多关联」 ,效率变低,可能使一些 「索引策略无效」 ,范式化将列存在不同表中,这些列若在同一个表中可以是一个索引。

2、InnoDB与MyISAM的区别?

2.1、MyISAM与InnoDB区别

  1. InnoDB聚簇索引,MyISAM非聚簇索引

  2. InnoDB数据与索引一起保存.ibd,MyISAM表结构.frm 索引.myi 数据.myd

  3. InnoDB支持事务、外键、行锁表锁,MyISAM不支持事务、外键、只支持表锁

  4. select count(*)

  5. MyISAM查询更优,InnoDB更新更优

  6. 都是B+tree索引

  7. MyISAM支持全文索引,InnoDB5.6后支持

2.2、MyISAM

  1. 不支持事务,但是每次查询都是原子的

  2. 支持表级锁,每次操作对整个表加锁

  3. 存储表的总行数

  4. 一个MyISAM表有三个文件:表结构.frm 索引.myi 数据 .myd

  5. 采用非聚集索引,索引文件的数据域存储指向数据文件的指针。辅索引与主索引基本一致,但是辅索引不用保证唯一性。

2.3、InnoDB

  1. 支持ACID事务,支持四种隔离级别

  2. 支持行级锁及外键约束,因此支持写并发

  3. 不存储总行数

  4. 主键索引采用聚集索引(索引的数据域存储数据文件本身),辅索引的数据域存储主键的值;因此从辅索引查找数据,需要先通过辅索引找到主键值,再访问辅索引;最好使用自增主键,防止插入数据时,为维持B+树结构,文件的大调整。

2.4、使用场景

大多数时候我们使用的都是 InnoDB 存储引擎,在某些读密集的情况下,使用 MyISAM 也是合适的。不过,前提是你的项目不介意

MyISAM 不支持事务、崩溃恢复等缺点(可是~我们一般都会介意啊!)。

  1. MyISAM适合读多更新少的:MyISAM索引跟数据分开放,因此有读取更快的说法。

  2. InnoDB适合插入更新频繁的:索引与数据一起放,建立索引更复杂,使用行锁,更新频繁效率更高

  3. 需要事务,高并发场景用InnoDB:InnoDB支持事务,采用行锁

  4. MyISAM查询比InnoDB快,更新InnoDB快

「场景」:MyISAM查询更优,InnoDB更新更优。

MyISAM适合读多,更新少的场景。MyISAM使用非聚簇索引,数据和索引分开存的,而InnoDB数据和索引存一起的;

数据量大时,一个内存页大小固定,读进内存的数据MyISAM就多一点(数据量小看不出差距,数据量大时差距就明显)。

因为MyISAM只把索引指针读进内存,可以存更多,查询速度也就更快,而且InnoDB还需要维护其他数据,比如其他隐藏字段 row_id tx_id等。

3、自增主键理解?

自增主键

InnoDB引擎的自增值,其实是 「保存在了内存」 里,并且到了MySQL 8.0版本后,才有了“自增值持久化”的能力,也就是才实现了“如果发生重启,表的自增值可以恢复为MySQL重启前的值”,具体情况是:(查看表结构,会看到自增主键=多少)。

  • 在MySQL 5.7及之前的版本, 「自增值保存在内存里」 ,并没有持久化。每次重启后,第一次打开表的时候,都会去找 「自增值的最大值」

    max(id),然后将max(id)+1作为这个表当前的自增值。

❝

举例来说,如果一个表当前数据行里最大的id是10,AUTO_INCREMENT=11。这时候,我们删除id=10的行,AUTO_INCREMENT还是11。但如果马上重启实例,重启后这个表的AUTO_INCREMENT就会变成10。也就是说,MySQL重启可能会修改一个表的AUTO_INCREMENT的值。

❞

  • 在MySQL 8.0版本,将自增值的变更记录在了redo log中,重启的时候依靠redo log恢复重启之前的值。

自增值修改机制

  1. 如果插入数据时id字段指定为0、null 或未指定值,那么就把这个表当前的 AUTO_INCREMENT值填到自增字段。

  2. 如果插入数据时id字段指定了具体的值,就直接使用语句里指定的值。

自增值新增机制

  1. 如果准备插入的值>=当前自增值,新的自增值就是“准备插入的值+1”;

  2. 否则,自增值不变。

4、为什么自增主键不连续

  1. 在MySQL 5.7及之前的版本,自增值保存在内存里,并没有持久化

  2. 事务 「回滚」 (自增值不能回退,因为并发插入数据时,回退自增ID可能造成主键冲突)

  3. 唯一键冲突(由于表的自增值已变,但是主键发生冲突没插进去,下一次插入主键=现在变了的子增值+1,所以不连续)

「eg:」

假设,表t里面已经有了(1,1,1)这条记录,这时我再执行一条插入数据命令:

insert into t values(null, 1, 1); (自增id,唯一键c,普通字段d)

这个语句的执行流程就是:

  1. 执行器调用InnoDB引擎接口写入一行,传入的这一行的值是(0,1,1);

  2. InnoDB发现用户没有指定自增id的值,获取表t当前的自增值2;

  3. 将传入的行的值改成(2,1,1);

  4. 将表的自增值改成3;

  5. 继续执行插入数据操作,由于已经存在c=1的记录,所以报Duplicate key error,语句返回。

这个表的自增值改成3,是在真正执行插入数据的操作之前。这个语句真正执行的时候,因为碰到唯一键c冲突,所以id=2这一行并没有插入成功,但也没有将自增值再改回去。

所以,在这之后,再插入新的数据行时,拿到的自增id就是3。 「也就是说,出现了自增主键不连续的情况」 。

5、Innodb为什么推介用自增ID

①主键页就会近乎于顺序的记录填满,提升了页面的最大填充率,不会有页的浪费

②新插入的行一定会在原有的最大数据行下一行,mysql定位和寻址很快,不会为计算新行的位置而做出额外的消耗

③减少了页分裂和碎片的产生

「UUID」: 「大量的随机IO」 + 「页分裂导致移动大量的数据」 +数据会有碎片

「总结」:自增ID有序,会按顺序往最后插入,而UUID无序,随机生成,随机插入,会造成频繁页分裂,内存碎片化,大量随机IO

索引

6、什么是索引

  • 排好序的数据结构,可以帮助快速查找数据

  • 优缺点:索引可以提高查询速度,查询使用优化隐藏器提高性能,但是也会占据物理空间,降低增删改的速度,因为还要操作索引文件

7、索引类型(覆盖索引+回表+索引下推+联合索引)

「普通索引」:可以重复

「唯一索引」:唯一,可为空,表中只有一个主键索引,可多个唯一索引

「主键索引」

  • 唯一,不为空,叶子结点存出了行记录数据,主键索引也称聚簇索引,对应非主键索引的叶子结点存的主键的值(二级索引),用二级索引查需要回表操作(根据二级索引查到主键,再根据主键去主键索引查)

  • 一般推荐用自增主键, 「保证空间利用率,减少页分裂」

「全文索引」

「覆盖索引」:索引字段覆盖了查询语句涉及的字段,直接通过索引文件就可以返回查询所需的数据,不必通过回表操作。

「回表」:通过索引找到主键,再根据主键id去主键索引查

「索引下推」

  • 在根据索引查询过程中就根据查询条件过滤掉一些记录,减少最后的回表操作

❝

假如执行 select * from stu where name=? and age=? ,没有索引下推先再存储引擎根据name筛选数据返回给server层,然后server层再根据age过滤有索引下推直接根据name和age在存储引擎层就筛选得到结果。

❞

「联合索引」:组合索引(最左前缀原则)

8、索引底层数据结构?

B+

InnoDB与MyISAM区别 Oracle收购sun(sun之前收购了mySQL),发布的首个版本5.5,默认使用了InnoDB作为存储引擎,而之前的版本使用MyISAM作为默认。 1.MyISAM 和 InnoDB的适用场景 MyISAM适合:读多写少(1)做很多count 的计算;(2)插入不频繁,查询非常频繁;(3)没有事务。 InnoDB适合:写多读少(1)可靠性要求比较高,或者要求事务;(2)表更新和查询都... 阅读详情

相关推荐

带你吃透MySQL系列:InnoDB引擎浅析

本文详细的解读了InnoDB的内存池结构,以及诸多InnoDB的特性。非常欢迎大家阅读文章后,提出宝贵的意见,每条评论我都会看,你们的支持将是我更新的动力!

Trouvailless的博客 525

MySQL存储引擎深度解析:从InnoDB核心机制到实战选型指南

数据库存储引擎是数据管理的核心组件,它决定了数据如何被存储、索引和访问。其工作原理基于不同的数据结构和锁机制,例如InnoDB采用聚簇索引和行级锁,而MyISAM使用非聚簇索引和表级锁。理解这些机制的技术价值在于能够针对高并发、事务一致性等场景进行精准优化,从而提升系统性能和可靠性。在实际应用场景中,如电商订单系统需要事务支持和外键约束,而日志归档则可能优先考虑压缩率。本文聚焦于MySQL的存储引擎,通过对比InnoDB与MyISAM的特性,并结合行级锁、缓冲池等热词,为数据库设计与优化提供实践指导。

weixin_30423977的博客 339

java面试开放性问题,详解系列文章

阿里巴巴Java岗面试题分享 1.HashMap 的内部结构?内部原理?和 HashTable 的区别,假如发⽣了 hash 碰撞,如何设计能让遍历效率⾼? 2.讲一讲讲讲 ConcurrentHashMap吧。 3.讲一下JVM虚拟机内存结构,以及它们的作⽤。 4.讲讲JVM的类加载过程&&双亲委派模型。 5.谈谈Java的垃圾回收算法。 6.谈谈Java垃圾回收的触发条件。 7.synchronized和Lock的区别。 8.volatile的作⽤,为什么会出现变量读取不⼀致的情况,与

m0_56530263的博客 1253

【高效又实用】吃透这五个爬虫框架,轻松爬取想要的数据

Python爬虫框架一般在遇到比较大型的需求时会用到,主要是为了方便管理以及扩展。下面收集整理了5个高效的爬虫框架,各有不同,大家在使用的时候,可以根据具体场景选择合适的框架。

veratata的博客 2483

Ubuntu下MySQL错误日志访问全解析:从journalctl到文件权限

MySQL错误日志是诊断服务启动失败、连接异常和权限问题的核心依据,其本质并非固定路径文件,而是由systemd日志策略、MySQL配置参数与Linux文件权限三重机制动态决定。理解StandardError=journal与log_error的协同关系,掌握journalctl实时捕获和/var/log/mysql/error.log安全读取的差异,是解决Access denied、Can't connect to MySQL server等高频故障的基础能力。本文聚焦Ubuntu系统特性,详解journ

weixin_34198453的博客 328

MySQL Connector/J 驱动深度解析:核心配置、性能调优与生产实践

JDBC(Java Database Connectivity)是Java语言访问数据库的标准API,它定义了连接、执行SQL和处理结果集的通用接口。其核心原理在于通过驱动管理器加载特定数据库的驱动程序,将通用的JDBC调用转换为数据库专用的网络协议通信。这项技术的价值在于实现了Java应用与多种关系型数据库的解耦,是构建企业级数据访问层的基石。在实际应用中,开发者常通过配置连接池、优化SQL执行来提升性能与稳定性。本文将聚焦于MySQL官方JDBC驱动——Connector/J,深入探讨其连接生命周期管理

weixin_34220179的博客 386

mysql面试题sql语句多表联查,面试阿里巴巴

互联网大厂比较喜欢的人才特点:对技术有热情,强硬的技术基础实力;主动,善于团队协作,善于总结思考。无论是哪家公司,都很重视高并发高可用技术,重视基础,所以千万别小看任何知识。面试是一个双向选择的过程,不要抱着畏惧的心态去面试,不利于自己的发挥。同时看中的应该不止薪资,还要看你是不是真的喜欢这家公司,是不是能真的得到锻炼。其实我写了这么多,只是我自己的总结,并不一定适用于所有人,相信经过一些面试,大家都会有这些感触。下面有部分截图希望能对大家有所帮助。一些面试,大家都会有这些感触。

m0_54816834的博客 843

SpringBoot+Vue+MySQL个人博客系统源码解析与部署实践

前后端分离架构是现代Web开发的主流形态,SpringBoot作为后端快速构建框架,配合Vue3前端框架和MySQL关系型数据库,能覆盖从接口设计、数据持久化到页面交互的完整链路。个人博客系统是典型的入门级全栈项目,麻雀虽小却涉及JWT登录鉴权、MyBatis-Plus持久层操作、富文本内容过滤、Nginx反向代理部署等关键工程实践。本文基于一套可直接运行的博客源码,拆解其前台展示与后台管理的功能边界、数据表设计、前后端联调流程,并给出本地复现步骤与常见坑点。无论是正在做技术选型,还是想通过前后端分离项目巩

weixin_28700593的博客 207

MySQL主从复制原理、配置与生产环境运维全解析

数据库高可用与负载均衡是构建稳定在线业务的核心需求。其基础原理常通过数据复制技术实现,即主节点将数据变更异步同步到从节点,从而实现读写分离与数据冗余。这项技术的核心价值在于提升系统读并发能力、提供实时数据备份,并为故障切换等高可用方案奠定基础。在MySQL数据库中,这具体体现为主从复制机制,它依赖于二进制日志和中继日志进行数据流转。在生产环境中,配置只是起点,深入理解其异步复制流程、复制格式选择以及主从延迟等关键问题,并掌握状态监控、数据一致性校验等运维技能,才是保障数据库集群稳定运行的关键。本文聚焦MyS

weixin_34234721的博客 361

2024年【华为OD机试】真题A卷-查找单入口空闲区域(JAVA)(1),java吊打面试官系列

什么是ActiveMQ?ActiveMQ服务器宕机怎么办?丢消息怎么办?持久化消息非常慢怎么办?消息的不均匀消费怎么办?死信队列怎么办?ActiveMQ中的消息重发时间间隔和重发次数吗?

2401_84103844的博客 667

MySQL日期字符串转换全攻略:STR_TO_DATE函数深度解析

在数据库开发与数据清洗场景中,日期字符串格式五花八门,从“2024/03/15”到“20240315”再到“15-03-2024”,直接比较或统计往往得出错误结果。日期转换是SQL数据处理的基础能力,核心在于理解MySQL的日期时间函数族及其格式串编码规则。STR_TO_DATE作为字符串转日期的关键函数,能按指定格式将非标准文本解析为日期时间类型,配合CAST、DATE_FORMAT、DATE_ADD等函数可覆盖绝大多数业务需求。从非法日期过滤、报表动态分组到年龄计算与时区处理,掌握这些函数能显著提升数据

cqwmy840702的博客 211

MySQL数据分析零基础入门:从环境搭建到实战查询全解析

数据库技术是信息系统的核心,它通过结构化的方式存储和管理数据,为上层应用提供可靠的数据支撑。其基本原理基于关系模型,通过SQL(结构化查询语言)实现对数据的定义、操作和查询。掌握数据库技术对于数据分析、后端开发和数据运营等领域具有重要价值,是实现数据驱动决策的基础。在众多应用场景中,MySQL作为一款开源关系型数据库,因其易用性、稳定性和强大的社区支持,成为数据分析入门和中小型项目开发的首选。本教程聚焦于MySQL数据分析,针对零基础学习者,系统讲解从环境搭建、SQL语法到实战分析的全过程,旨在帮助初学者快

weixin_33744854的博客 446

2021年五面蚂蚁,从基础到源码统统帮你搞定,实战解析

开头 关于程序员,除了做项目、看视频来提高自身的技术之外,还有一种提升自己的专业技能就是:多!看!书!MySQL俨然已经成为了IT技术人员必须掌握的核心技能之一! 《MySQL从入门到精通》 本书详细介绍了如何安装、管理、备份、维护和优化一个 MySQL 系统。对于每一件服务器操作都提出了多种的解决方案。对于每一种的方法,虽然不一定都是非常实用的方法,读者能通过这些方法,熟悉 MySQL 的特点和强大的功能。 第一章简单介绍了 MySQL 的历史、特点,同时对 SQL 的语法进行了简单的介绍。如果读者对第一

m0_56004877的博客 1180

MySQL 开发总踩坑?吃透这 3 大核心技术(附源码解析)

本文通过深入分析workflow项目的MySQL相关源码,从字节序处理、流式传输和协议解析三个维度,全面展现了高性能网络编程的核心技术。性能与可维护性的平衡跨平台兼容性的考量模块化架构的重要性。这些宝贵的经验和技术,不仅在MySQL网络编程中有重要价值,在其他网络协议的实现中同样具有指导意义。希望读者能够通过本案例的学习,在实际项目中应用这些技术,构建更加高效、稳定的网络应用系统。/*** @brief MySQL协议核心技术学习案例* @author 基于workflow项目源码分析实现。

weixin_45715405的博客 273

ESP8266+ITR8307实战:如何用反射式光电管实现5cm远距离检测(附避坑指南)

本文详细介绍了如何利用ESP8266的ADC功能与ITR8307反射式光电管,通过调制解调、硬件电路优化及软件同步采样策略,实现5cm稳定远距离检测。文章提供了完整的硬件设计、代码实现与调优避坑指南,有效解决了环境光干扰与信号衰减难题,适用于智能车、自动化等需要可靠非接触检测的项目。

rgv234567的博客 264

ABP多租户实现

abp会调用ITenantStore.Find(Guid)方法去查tenant是否存在。要骗过abp就得自己实现ITenantStore并替换原来的实现。abp会自动解jwt里的tenant id,并且尝试验证它。这时候我们之前实现的ITenantStore就可以骗过abp。你要不想骗它也成,反正这个类是可以依赖注入的,你爱咋验证就咋验证。不用open id dict,只用jwt,让abp轻起来。在原来生成jwt的地方加入tenantId。module上也要加DependsOn。

m0_46704355的博客 473

LLM - windows下的Dify离线部署:从镜像打包到无网环境部署(亲测,包含插件部署)

LLM - windows下的Dify离线部署:从镜像打包到无网环境部署(亲测,包含插件部署)

ocean00008899的博客 1290

采样率转化代码C++(有理倍数,升采样、降采样均可)

【代码】采样率转化(有理倍数,升采样、降采样均可)

goudahai的专栏 547

FOC 电流采样方案对比(单电阻/双电阻/三电阻)

电流采样的作用 在FOC算法中,电流采样在反馈环节是相当重要的一部分,通常交流三相同步电机在进行坐标变换的时候,需要实时测量相电流,最终通过SVPWM实现电机转子磁场和定子磁场的同步转动,那么这里有三种方案,单电阻采样,双电阻采样,三电阻采样。本文参考ST的单电阻和三电阻采样以及TI的双电阻采样,结合实际中可能需要注意的地方进行总结分析。 单电阻采样 双电阻采样 三电阻采样 ...

一名热爱技术的工程师的博客。分享技术干货,记录美好生活。永远相信美好的事情即将发生。 4万+

5、流体-结构相互作用耦合技术详解

本文详细解析了流体-结构相互作用(FSI)的两种核心耦合技术:松散耦合和紧密耦合。通过原理阐述、优缺点分析及实际应用案例,对比了两种方法的适用场景与性能差异,并进一步探讨了高级耦合技术的发展趋势和工程实践方向,为相关领域的研究人员和工程师提供了全面的技术参考。

fanta的博客 205

人工智能智能体研究综述:从理论架构到前沿应用

AI Agent,即人工智能智能体,是指能够在特定环境中自主感知、推理、决策并执行行动以实现特定目标的智能系统[1]。自主性反应性主动性(Pro-activeness)和社会性fill:#333;important;important;fill:none;color:#333;color:#333;important;fill:none;fill:#333;height:1em;AI Agent核心特征自主性 Autonomy反应性 Reactivity主动性 Pro-activeness。

nmdbbzcl的博客 904

LLM Wiki 的完整输入体系:LLM Wiki极简实战

LLM Wiki 的输入分为**四大类**,覆盖从"原始知识注入"到"系统行为控制"的全流程,所有输入都遵循"**原始资料不可变,规则可迭代,人类反馈闭环**"的核心原则。

ZhangJiqun&191cm&85kg 327

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

上一篇: 【JAVA】值传递与引用传递
下一篇: Java核心技术面试题(附答案),纯手码,看完是否思路清晰了?
JavaMonsterr
博客等级 码龄4年 211粉丝 481原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值