MySQL 核心知识整理【一】

article/2025/6/25 6:09:17

图片来自网络

一、MySQL存储引擎对比:InnoDB vs MyISAM

在使用MySQL时,选择合适的存储引擎对性能影响很大。最常见的两个引擎是 InnoDB 和 MyISAM,它们各自的设计目标不同,适用场景也不一样。

事务与数据安全性方面,InnoDB 支持事务处理,支持 COMMITROLLBACK,适合电商、金融等要求数据一致性的场景。而 MyISAM 不支持事务,一旦写入错误无法回滚,更适合读多写少的业务。

外键约束方面,InnoDB 支持外键,可以定义表之间的约束,保证数据的完整性。MyISAM 不支持外键,所有的约束需要在应用层控制。

锁机制方面,InnoDB 支持行级锁和表锁,行锁可以大幅提高并发性能。MyISAM 只支持表锁,多个操作不能并发修改,容易造成阻塞。

全文索引方面,MyISAM 支持全文索引,适合文档类或搜索类应用。而 InnoDB 直到 MySQL 5.6 之后才开始支持全文索引。

适用建议:InnoDB 更适合高并发、大数据量、需要事务保障的场景,比如订单系统、交易系统。MyISAM 更适合读多写少、不涉及事务的查询系统,比如日志分析或CMS后台。

选择时需根据业务特性决定,不能单凭“速度快”或“支持事务”去判断哪个更好。



二、如何防止 SQL 注入

SQL 注入是应用程序中非常常见且危险的安全漏洞之一,攻击者可以通过构造恶意 SQL 语句,获取、篡改甚至删除数据库中的数据。避免这类问题的关键在于:不要直接拼接 SQL 语句,而是使用参数化方式传递变量

以 Java 为例,使用 PreparedStatement 可以自动对输入进行转义,防止用户注入非法语句。正确的写法是:

String sql = "SELECT * FROM users WHERE username = ? AND password = ?";
PreparedStatement stmt = conn.prepareStatement(sql);
stmt.setString(1, username);
stmt.setString(2, password);
ResultSet rs = stmt.executeQuery();

而不是:

String sql = "SELECT * FROM users WHERE username = '" + username + "' AND password = '" + password + "'";

后者非常危险,一旦输入类似 admin' OR '1'='1,整个逻辑就会被绕过。

在使用 MyBatis 等框架时,正确方式是使用 #{} 进行参数绑定,如:

<select id="getUser" resultType="User">SELECT * FROM users WHERE username = #{username}
</select>

不要使用 ${},因为它会将参数直接拼接进 SQL。

核心原则是:变量永远不要直接写进 SQL 字符串里。无论使用什么语言或框架,都应该寻找它们所提供的“安全插值”机制。这不仅能提升代码可读性,也能极大增强应用的安全性。



三、怎样实现幂等

幂等,是指一个操作无论执行多少次,结果都保持一致,不会产生副作用。在后端开发中非常常见,尤其是涉及支付、下单、接口请求等场景。如果没有幂等保护,重复提交可能导致数据重复写入、订单重复创建等严重问题。

常见的幂等实现方式有以下三种:

1. 唯一索引(主键约束)

通过数据库的主键或唯一索引约束,来保证数据只写入一次。比如订单号、请求流水号等字段设置为唯一,一旦第二次写入相同数据,数据库会直接抛出异常。适用于插入类操作。

CREATE UNIQUE INDEX idx_order_sn ON orders(order_sn);

只要每次提交的订单号唯一,系统就能准确拒绝重复订单。

2. 乐观锁(版本号)

在更新数据时引入 version 字段,每次更新时要求版本号匹配,如果版本不一致则拒绝操作。这种方式适合控制并发更新,确保每次修改都基于上一次的结果。

UPDATE product SET stock = stock - 1, version = version + 1 WHERE id = 1 AND version = 2;

3. Token机制 + Redis

客户端发起操作前,先从服务端获取一个唯一 token,执行操作时必须携带该 token,并通过 Redis 设置 token 的一次性消费规则。一旦被使用,就立即从 Redis 中删除,后续请求再带同样的 token 就会被拦截。

这种方式适合防止重复点击、重复提交等场景,特别是在高并发请求中非常有效。



四、一条 SQL 语句的执行流程

MySQL 执行一条 SQL 查询语句,背后其实是一个完整的流程,涉及多个组件协同工作。主要可以分为两层:Server 层存储引擎层

1. 建立连接

客户端连接 MySQL,连接器首先验证用户名和密码,并加载该用户的权限信息。连接成功后才能继续发送 SQL 请求。

2. 查询缓存(MySQL 8.0 已移除)

曾经 MySQL 会先查缓存,如果完全相同的语句执行过,就直接返回缓存结果,跳过后续步骤。但由于命中率低、维护成本高,MySQL 8.0 起已移除该功能。

3. 语法解析和语义分析

SQL 语句会先交给 解析器。这个阶段会检查 SQL 是否拼写正确、语法是否合法,确认涉及的表、字段是否存在。还会将 SQL 转换为内部的数据结构,便于后续处理。

4. 查询优化

经过语义分析的 SQL,会交给 优化器。优化器的任务是选择最佳的执行计划,比如判断用哪个索引、使用何种连接方式(如 nested loop、hash join)。最终目标是尽可能提高执行效率。

5. 权限检查

执行器在执行语句前,会再次验证当前用户是否有权限对相关表或字段进行操作。如果权限不足,直接返回错误。

6. 调用存储引擎执行

执行器将最终的执行计划交给对应的存储引擎(如 InnoDB)来完成具体的数据操作,并返回结果给客户端。



http://www.hkcw.cn/article/KkRRIoPfgW.shtml

相关文章

MySQL下载安装配置环境变量

MySQL下载安装配置环境变量 文章目录 MySQL下载安装配置环境变量一、安装MySQL1.1 下载1.2 安装 二、查看MySQL服务是否启动三、配置环境变量四、验证 一、安装MySQL 1.1 下载 官网社区版&#xff08;免费版&#xff09;&#xff1a;https://dev.mysql.com/downloads/mysql/ …

火语言UI组件--文件夹对话框

【组件功能】&#xff1a;选择单个或多个文件的对话框。 样式预览 设置 基础设置 属性名称属性释义输入值类型标题(title)对话框的标题字符串类型默认路径(defaultPath)对话框的默认展示路径字符串类型多选(multiSelections)是否允许多选布尔型(true / false)显示隐藏文件(s…

海底三维可视化平台

1. 摘要 本文作者为视觉分析构建了一个真实海底的“虚拟世界”。在3D环境中导入底部轮廓。在该模型中&#xff0c;通过地震反射获得的海床地层剖面被数字化为离散点&#xff0c;并用克里金算法进行插值&#xff0c;以在每个地层中产生均匀的网格。然后在每一层构建 Delaunay三…

联合国裁员计划曝光 预算削减20%

多家媒体29日披露的联合国内部文件显示,联合国秘书处计划削减20%预算,并裁员6900人,约占员工总数的20%。根据法新社和路透社获取的联合国内部备忘录,负责财政事务的联合国助理秘书长钱德拉穆利拉马纳坦本周向各部门负责人发出信函,要求执行联合国秘书长安东尼奥古特雷斯提…

一村民鸡舍惊现50斤重蟒蛇 民警与捕蛇师傅联手救助

6月1日清晨,当小朋友们正享受儿童节的快乐时,五华县公安局丁畲派出所接到了村民温先生的紧急求助电话。温先生称自家鸡舍里钻进了一条大蛇,吓得鸡和鹅四处逃窜。接到报警后,丁畲派出所的值班民辅警迅速行动,并联系了专业的捕蛇师傅一同前往现场。到达后,他们发现大蛇蜷缩…

朋友圈哪些内容不能随便晒 保护隐私安全

端午假期即将来临,许多人计划出行并准备在朋友圈分享快乐。然而,过度分享可能带来隐私泄露的风险。有些内容不宜随意晒出。例如,火车票、飞机票、登机牌、家门钥匙、车牌等含有个人信息的物品,一旦发布,可能会被不法分子利用高科技手段窃取,导致个人隐私泄露。身份证、护…

火出圈的“苏超”不只是有梗 比赛第一,友谊第十四!

“友谊第一,比赛第二”这句话在江苏省首届城市足球联赛中被重新演绎为“比赛第一,友谊第十四”,这句口号迅速在网络上走红。这个被球迷称为“苏超”的足球联赛近日火出圈。“苏超”是江苏省体育局与各设区市政府联合主办的江苏省首届城市足球联赛,共有13个设区市派出队伍参…

电影《女足》杀青 星爷新作引期待

6月2日,周星驰执导的电影《女足》正式杀青。该片结合了少林功夫与足球元素,围绕女子足球队展开,讲述了一群热爱足球的女孩如何克服困难,追求梦想的故事。剧情紧凑,笑点与泪点并存,令人期待。全组历时3个月拍摄,迪丽热巴于6月2日完成个人戏份,其他主演如张小斐、张艺兴也…

6月起全国推广免陪照护服务 缓解家庭陪护压力

俗话说“久病床前无孝子”,这句话反映了家庭在面对病人陪护时的无奈与压力。特别是随着老龄化社会的到来以及独生子女政策的影响,父母住院时的陪护问题变得愈发困难。如果医院能够提供标准化的照护服务,将大大减轻家庭负担。国家卫健委等三部委近期印发了一份方案,计划于6月…

python打卡 DAY 19 常见的特征筛选算法

目录 特征筛选算法笔记 一、方差筛选 (Variance Threshold) 1.1 基本原理 1.2 实现代码 1.3 注意事项 二、皮尔逊相关系数筛选 2.1 基本原理 2.2 实现代码 2.3 优缺点 三、Lasso回归筛选 3.1 基本原理 3.2 实现代码 3.3 参数选择 四、树模型特征重要性 4.1 基本…

三菱整数乘法出现小数点的原因分析 以及工程设置

三菱 PLC 中出现30*100029999.994的计算误差&#xff0c;主要与浮点数在计算机中的二进制表示方式有关。以下是详细解释和解决方案&#xff1a; 原因分析 浮点数二进制存储的精度限制 浮点数&#xff08;如三菱 PLC 使用的 IEEE 754 单精度浮点数&#xff09;在计算机中以二进制…

Git 第三讲---核心篇 git的远程管理

前言&#xff1a; 在上一讲《Git 第二讲 — 提高篇&#xff1a;Git的分支管理》中&#xff0c;我们掌握了如何通过分支实现代码的并行开发&#xff0c;学会了创建、切换、合并分支以及解决冲突的核心技巧。分支管理是Git强大功能的基石&#xff0c;但它更多聚焦于本地仓库的操…

Java网络编程API 1

Java中的网络编程API一共有两套&#xff1a;一套是UDP协议使用的API&#xff1b;另一套是TCP协议使用的API。这篇文章我们先来介绍UDP版本的API&#xff0c;并尝试来写一个回显服务器&#xff08;接收到的请求是什么&#xff0c;返回的响应就是什么&#xff09;。 UDP数据报套…

window ollama部署模型

注意去官网下载ollama,这个win和linux差别不大,win下载exe,linux用官网提供的curl命令 模型下载表:deepseek-r1 使用命令:Ollama API 交互 | 菜鸟教程 示例: 1.查看已加载模型: 2.文本生成接口 curl -X POST http://localhost:11434/v1/completions -H "Conte…

MySQL安装及启用详细教程(Windows版)

MySQL安装及启用详细教程&#xff08;Windows版&#xff09; &#x1f4cb; 概述 本文档将详细介绍MySQL数据库在Windows系统下的下载、安装、配置和启用过程。 &#x1f4e5; MySQL下载 官方下载地址 官方网站: https://dev.mysql.com/downloads/社区版本: https://dev.my…

vscode中的markdown表格列宽

vscode中的markdown表格列宽 当然&#xff0c;这个问题在csdn中应该是没有的&#xff0c;csdn是自适应文档页面的。这个自适应在vscode中好像不太好实现&#xff0c;至少目前我没能实现。 表格生成如上图&#xff0c;缩在一起&#xff0c;当然也会随着表格中录入数据自适应…

CangjieMagic 智能体框架嵌入式系统实测:以树莓派 4B 为例

目录 引言 CangjieMagic 对嵌入式开发板的要求 编译环境准备 本地编译 交叉编译 实战测试 程序编写 对cjpm.toml文件的修改 运行结果 结束语 引言 在人工智能与物联网技术飞速发展的今天&#xff0c;嵌入式系统作为连接物理世界与数字世界的桥梁&#xff0c;承担着越…

数值与字典解决方案二十七讲:两列数据相互去掉重复值后合并

《VBA数组与字典方案》教程&#xff08;10144533&#xff09;是我推出的第三套教程&#xff0c;目前已经是第二版修订了。这套教程定位于中级&#xff0c;字典是VBA的精华&#xff0c;我要求学员必学。7.1.3.9教程和手册掌握后&#xff0c;可以解决大多数工作中遇到的实际问题。…

林夏薇否认破产传闻,已发律师声明回应 正交律师处理

近期,TVB“视后”林夏薇被一家公司向香港高等法院申请破产。根据司法机构资料,案件延期至8月26日下午在高等法院提讯。对于破产一事,林夏薇回应称:“我丈夫Jason租住房子的公司有官司,正在上诉中,所以我莫名其妙,现在已交给律师处理,我也没有收到任何通知。”5月30日,…

下次放假安排已定可连休8天 国庆中秋合并假期

今天是端午节假期的最后一天,许多人已经开始期待下一次休假。根据国务院办公厅发布的2025年部分节假日安排通知,下一个长假将在四个月后的国庆节和中秋节期间。届时,国庆节与中秋节将合并放假,共8天。责任编辑:zx0176