【MySQL】3.MySQL核心概念解析:数据完整性、事务处理、索引及聚簇索引与非聚簇索引
探索MySQL的内部机制,理解数据完整性、事务处理、索引策略以及聚簇索引与非聚簇索引的区别是至关重要的。这些概念构成了数据库设计和优化的基础,对于确保数据的准确性、提高查询效率、维护数据的一致性和实现复杂的数据库操作至关重要。本文将逐一剖析这些核心概念。
一.数据完整性与约束
1.主键(PRIMARY KEY)
定义:
在MySQL中,主键是一个或多个列的组合,它们的唯一性约束保证了表中每个记录都可以被唯一标识。主键列不能包含 NULL 值,并且每个表只能有一个主键。
作用:
- 唯一性:确保列的值在表中是唯一的。
- 非 NULL:保证主键列中的所有值都是非 NULL 的。
- 数据完整性:作为识别和链接其他表中数据的关键字。
创建主键的SQL示例:
CREATE TABLE users (id INT AUTO_INCREMENT,username VARCHAR(50) NOT NULL,PRIMARY KEY (id)
);
2.外键约束(FOREIGN KEY)
定义:
外键约束是一种完整性约束,用于维护两个表之间的链接。它保证在一个表中的外键列中的所有值都必须在另一个表的相应列中存在。
作用:
- 保证数据的参照完整性:确保引用的数据在主表中是有效的。
- 维护数据的一致性:在主表中进行数据更新或删除操作时,外键约束可以自动更新或级联删除相关联的从表数据。
创建外键的SQL示例:
CREATE TABLE orders (order_id INT AUTO_INCREMENT,user_id INT,order_date DATE,PRIMARY KEY (order_id),FOREIGN KEY (user_id) REFERENCES users(id)
);
在这个例子中,orders 表中的 user_id 是一个外键,它引用了 users 表中的 id 列。
3.不使用外键约束保证数据参照完整性
虽然外键约束是保证数据参照完整性的一种机制,但在某些情况下,可能由于性能考虑或使用不支持外键的数据库系统,你可能会避免使用外键。在这种情况下,可以采取以下措施:
-
应用逻辑:在应用程序层面实现外键约束的逻辑,例如,在删除或更新主表中的数据之前,检查从表中是否有相关联的记录。
-
触发器:使用数据库触发器(Trigger)来模拟外键的行为。例如,可以创建一个
BEFORE DELETE触发器,当尝试删除users表中的记录时,自动检查orders表中是否有相关联的订单。 -
级联更新/删除:在业务逻辑中实现级联更新或删除的机制,确保当主表中的数据发生变化时,所有相关的从表数据也相应更新或删除。
-
定期数据校验:定期运行数据校验脚本来检查数据的一致性,并修复任何不匹配的记录。
以下是使用触发器来保证数据参照完整性的一个例子:
DELIMITER //CREATE TRIGGER before_delete_user
BEFORE DELETE ON users
FOR EACH ROW
BEGINDECLARE order_count INT;SELECT COUNT(*) INTO order_count FROM orders WHERE user_id = OLD.id;IF order_count > 0 THENSIGNAL SQLSTATE '45000'SET MESSAGE_TEXT = 'Cannot delete user with existing orders';END IF;
END; //DELIMITER ;
这个触发器会在删除 users 表中的记录之前检查 orders 表中是否有相关联的订单,如果有,则阻止删除操作并给出错误信息。
二.事务处理
1.什么是事务
事务是数据库操作的一个单元,它由一个或多个数据库操作组成,这些操作要么全部成功,要么全部失败。事务保证了数据库的完整性和一致性,即使在系统崩溃或其他错误情况下也是如此。
事务的四个主要属性(ACID属性)
- 原子性(Atomicity):事务中的所有操作要么全部完成,要么全部不完成,不会结束在中间某个点。
- 一致性(Consistency):事务必须使数据库从一个一致的状态转移到另一个一致的状态。
- 隔离性(Isolation):并发执行的事务之间不会互相影响。
- 持久性(Durability):一旦事务提交,则其结果永久保存在数据库中,即使系统发生故障。
2.如何使用MySQL实现事务
在MySQL中,可以通过以下步骤实现事务:
- 设置事务隔离级别(可选,但建议)。
- 开启事务。
- 执行事务中的SQL语句。
- 提交事务(如果所有操作都成功)或回滚事务(如果操作中有任何失败)。
示例:
-- 设置事务隔离级别为可串行化(最严格的隔离级别)
SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE;-- 开启事务
START TRANSACTION;-- 执行SQL语句
UPDATE accounts SET balance = balance - 100 WHERE user_id = 'user1';
UPDATE accounts SET balance = balance + 100 WHERE user_id = 'user2';-- 如果操作成功,提交事务
COMMIT;-- 如果操作失败,在某些情况下可能需要回滚事务
ROLLBACK;
3.MySQL中的事务隔离级别及影响
MySQL支持以下四个事务隔离级别:
- READ UNCOMMITTED:未提交读。事务可以读取未提交的数据,可能导致脏读、幻读或不可重复读。
- READ COMMITTED:提交读。事务只能读取已提交的数据,解决了脏读问题,但幻读和不可重复读仍可能发生。
- REPEATABLE READ(默认级别):可重复读。在一个事务的执行期间,其他事务不能修改或插入事务开始时未查询到的行,解决了幻读问题。
- SERIALIZABLE:串行化。最高隔离级别,事务串行执行,避免了脏读、幻读和不可重复读,但会降低并发性能。
设置事务隔离级别的SQL示例
-- 查看当前隔离级别
SHOW VARIABLES LIKE 'transaction_isolation';-- 设置隔离级别为可重复读
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;-- 设置隔离级别为串行化
SET GLOBAL TRANSACTION ISOLATION LEVEL SERIALIZABLE;
选择不同的隔离级别对应用的影响包括:
- 数据的一致性和准确性。
- 并发性能和系统资源的使用。
- 系统设计的复杂性,如需要在应用层面实现额外的锁机制。
在设计数据库应用时,需要根据应用的需求和性能考虑,权衡选择合适的事务隔离级别。
三.索引
1.索引是什么
在数据库中,索引是一种数据结构,它提高了数据库查询数据的效率。索引类似于书籍的目录,它允许数据库管理系统(DBMS)在不扫描整个表的情况下快速找到记录的位置。
2.索引如何提高查询性能
-
快速定位:索引允许数据库使用高效的搜索算法(如二分搜索、哈希)快速定位到表中的数据,而不需要扫描整个表。
-
减少数据访问:索引可以减少数据库需要读取的数据量,因为索引通常存储在内存中或者磁盘上单独的地方,访问速度比随机读取表数据快。
-
排序优化:索引本身就可以是有序的,这有助于优化ORDER BY查询,减少数据排序的时间。
-
避免复杂操作:对于涉及多个表的查询,索引可以减少连接操作的开销。
-
使用统计信息:数据库查询优化器可以使用索引的统计信息来制定更快的查询执行计划。
3.索引的类型:
-
主键索引:自动创建的,保证主键列的唯一性。
-
唯一索引:保证列的值是唯一的。
-
复合索引:在两个或更多列上创建的索引。
-
全文索引:用于对文本数据进行全文搜索。
-
空间索引:用于地理空间数据类型,以优化地理空间数据的查询。
4.创建索引示例
-- 创建简单的索引
CREATE INDEX index_name ON table_name (column1, column2);-- 创建唯一索引
CREATE UNIQUE INDEX unique_index_name ON table_name (column);-- 创建复合索引
CREATE INDEX composite_index_name ON table_name (column1, column2, column3);-- 创建全文索引(MySQL 5.6及以上版本支持)
CREATE FULLTEXT INDEX ft_index_name ON table_name (text_column);
5.注意事项:
- 虽然索引可以提高查询性能,但它们也可能降低数据插入、删除和更新操作的性能,因为索引需要维护。
- 过多的索引可能导致查询优化器选择困难,因此需要合理设计索引。
- 索引占用额外的磁盘空间。
在创建索引时,应该考虑查询需求和索引的成本,选择对性能提升最有帮助的列进行索引。同时,定期对索引进行维护和优化也是非常重要的。
四.聚簇索引和非聚簇索引
在数据库系统中,索引是一种提高数据检索速度的数据结构。聚簇索引(Clustered Index)和非聚簇索引(Non-Clustered Index)是两种不同类型的索引,它们在存储方式、性能影响以及使用场景上存在一些关键的区别:
1.聚簇索引(Clustered Index)
- 存储方式:聚簇索引决定了表数据在磁盘上的物理存储顺序。表中的每一行数据都存储在索引树的叶子节点上。
- 唯一性:一个表只能有一个聚簇索引,因为它决定了数据的物理存储方式。
- 性能:由于聚簇索引直接反映了数据的物理存储顺序,对于范围查询(如ORDER BY)非常高效。
- 主键索引:通常,主键会自动创建一个聚簇索引(除非明确指定为主键创建非聚簇索引)。
2.非聚簇索引(Non-Clustered Index)
- 存储方式:非聚簇索引是一种独立的数据结构,它存储索引列的值和指向数据行的逻辑指针(如行号或数据页地址)。
- 唯一性:一个表可以有多个非聚簇索引,它们不改变数据的物理存储方式。
- 性能:非聚簇索引对于点查询(如精确匹配)非常有效,但对于范围查询可能需要回表查询,因为索引和数据是分开存储的。
- 包含列:非聚簇索引可以包含额外的列,这些列不作为索引键,但可以被索引用于查询优化。
3.区别
- 存储顺序:聚簇索引的顺序就是数据的物理存储顺序,而非聚簇索引不是。
- 索引与数据位置:聚簇索引的叶节点直接包含数据,非聚簇索引的叶节点包含指向数据的指针。
- 表的主键:通常,表的主键会自动创建聚簇索引,除非特别指定为非聚簇索引。
- 数量限制:一个表只能有一个聚簇索引,但可以有多个非聚簇索引。
- 维护成本:由于聚簇索引影响数据的物理存储,其维护成本可能更高,特别是在大量数据插入或删除时。
4.示例
-- 创建聚簇索引(通常为主键)
CREATE TABLE users (id INT PRIMARY KEY,username VARCHAR(50),email VARCHAR(100)
);-- 创建非聚簇索引
CREATE INDEX idx_username ON users (username);
在这个例子中,users 表的 id 列自动拥有一个聚簇索引。另外,我们为 username 列创建了一个非聚簇索引 idx_username。
5.使用场景
- 聚簇索引:适用于经常通过索引键进行范围查询的场景,如时间序列数据。
- 非聚簇索引:适用于需要快速定位特定值的场景,尤其是当查询不经常涉及索引键的范围时。
五.结语
过本文的深入探讨,你现在应该对MySQL中的几个关键概念有了全面的认识:
数据完整性:通过主键和外键约束来保证数据的准确性和一致性,即使在复杂的数据库关系中也能保持数据的引用完整性。
事务处理:掌握了事务的ACID属性和如何在MySQL中实现事务,包括设置隔离级别和处理事务的提交与回滚。
索引:了解了索引的类型、如何创建索引以及索引如何提升查询性能,同时也认识到了索引的维护成本和对写操作可能带来的影响。
聚簇索引与非聚簇索引:理解了这两种索引的存储方式、性能影响和适用场景,为选择合适的索引类型提供了指导。
这些知识为高效地使用MySQL数据库、优化数据库性能和维护数据完整性奠定了坚实的基础。在实际应用中,合理地应用这些概念可以显著提高数据库应用的稳定性和响应速度。
相关文章:
【MySQL】3.MySQL核心概念解析:数据完整性、事务处理、索引及聚簇索引与非聚簇索引
探索MySQL的内部机制,理解数据完整性、事务处理、索引策略以及聚簇索引与非聚簇索引的区别是至关重要的。这些概念构成了数据库设计和优化的基础,对于确保数据的准确性、提高查询效率、维护数据的一致性和实现复杂的数据库操作至关重要。本文将逐一剖析这…...
【netty系列-03】深入理解NIO的基本原理和底层实现(详解)
Netty系列整体栏目 内容链接地址【一】深入理解网络通信基本原理和tcp/ip协议https://zhenghuisheng.blog.csdn.net/article/details/136359640【二】深入理解Socket本质和BIOhttps://zhenghuisheng.blog.csdn.net/article/details/136549478【三】深入理解NIO的基本原理和底层…...
大数据Scala教程从入门到精通第二篇:Scala入门
一:Scala入门 1:为什么学习Scala Spark新一代内存级大数据计算框架,是大数据的重要内容 Spark就是使用Scala编写的。因此为了更好的学习Spark,需要掌握Scala这门语言 Spark的兴起,带动Scala语言的发展! 2:Scala的发展…...
Spring Data JPA数据批量插入、批量更新真的用对了吗
Spring Data JPA系列 1、SpringBoot集成JPA及基本使用 2、Spring Data JPA Criteria查询、部分字段查询 3、Spring Data JPA数据批量插入、批量更新真的用对了吗 4、Spring Data JPA的一对一、LazyInitializationException异常、一对多、多对多操作 前言 在前两篇文章已经…...
数据结构-线性表-应用题-2.2-12
1)算法的基本设计思想:依次扫描数组的每一个元素,将第一个遇到的整数num保存到c中,count记为1,若遇到的下一个整数还是等于num,count,否则count--,当计数减到0时,将遇到的下一个整数保存到c中,计…...
目录页码右对齐快速解决
选择目录–段落–制表符,按图中设置即可...
分红76.39亿,分红率再创新高,成长活力无限的伊利带来丰厚回报
伊利47万股东,又等来了一个好消息。 4月29日,伊利股份发布2023年报,实现营业总收入1261.79亿元,归母净利润104.29亿元,双创历史新高,实现连续31年稳健增长。 在递交亮眼成绩单的同时,乳业巨头伊…...
关于行进线路。
https://map.tianditu.gov.cn/ 作者:Chockhugh 链接:https://www.zhihu.com/question/20545559/answer/494685117 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 以50km,几乎全是…...
Unity 编辑器工具 - 资源引用查找器
目录 1.功能概述 2.完整代码 3. 实现原理 4. 使用预览 5.新增优化版本 在Unity项目开发过程中,管理和维护资源之间的引用关系是至关重要的。当然我们项目也是需要这个功能 毕竟项目大了之后查找资源引用还是交给 资源引用查找器 比较好。 1.功能概述 资源引用…...
MySQL中的批量更新实战
MySQL中的批量更新实战 表结构 mysql> desc dept; --------------------------------------------------------- | Field | Type | Null | Key | Default | Extra | --------------------------------------------------------- | deptno | int(11) …...
为软件教学文档增加实践能力
为了更方便软件教学,我们在凌鲨(OpenLinkSaas)上增加了公共资源引用的功能。 目前可以被引用的公共资源: 微应用常用软件公共知识库Docker模板 引用公共资源 引用微应用 目前微应用包含了主流数据库,终端等工具,可以方便的进行各种相关实…...
39-2 Web应用防火墙 - WAF数据库层绕过
如果你本地没有安装mysql就先安装一下:4-2 MySQL 的下载与安装_mysql5.7.9.1下载-CSDN博客 一、数据库层绕过简介 绕过数据库层通常用于规避Web应用防火墙(WAF)的SQL注入防护规则。攻击者需要利用数据库特性,寻找规避常规安全策略的方法。这里涉及到不同数据库的特性、SQ…...
薪酬激励策略:留住企业核心人才的关键
在竞争激烈的商业环境中,企业为了保持竞争力和市场地位,必须高度重视人才的管理和发展。企业的核心人才是推动企业发展的关键因素,因此,如何有效地激励和留住这些核心人才,成为企业持续发展的关键之一。薪酬激励策略作…...
【bbs02补】注册功能form组件-前端-后端-总结、登录功能(前端、后端、生成验证码)
1 注册功能 1.1 注册功能form组件 1.2 注册功能前端 1.3 注册功能后端 1.4 forms组件和前后端总结 2 登录功能 2.1 登录前端 2.2 生成验证码 1 注册功能 1.1 注册功能form组件 # 注册页面-用户名-密码-确认密码-邮箱-手机号-头像# form组件 可以帮助我们1 快速生成前端页面2 数…...
MindSponge分子动力学模拟——定义一个分子系统
技术背景 在前面两篇文章中,我们分别介绍了分子动力学模拟软件MindSponge的软件架构和安装与使用。这里我们进入到实用化阶段,假定大家都已经在本地部署好了基于MindSpore的MindSponge的编程环境,开始用MindSponge去做一些真正的分子模拟的工…...
unity想让方法带一个默认参数怎么写
在C#中,包括Unity使用的C#版本,你可以为方法参数提供默认值。这允许你在调用方法时省略某些参数,并使用这些参数的默认值。以下是如何为一个方法参数设置默认值的示例: using UnityEngine; public class MyClass : MonoBehaviou…...
从零开始的软件测试学习之旅(六)测试网络基础知识
测试网络基础知识 HTTP和HTMLURLDNS客户端和服务器请求方法和状态码面试高频Fiddler抓包工具教学弱网 HTTP和HTML 概念 html: HyperText Markup Language 超文本标记语言 http: HyperText Transfer Protocol 超文本传输协议 超文本: 图片, 音频, 视频 关系:http 可以对 html 的…...
NSS题目练习
[SWPUCTF 2021 新生赛]gift_F12 通过题目提示可以知道flag应该可以在源代码中找到 查看源代码,直接用 ctrlf 搜索flag即可 [SWPUCTF 2021 新生赛]jicao 题目打开后能看到一串php代码,要求是用post传参传入idwllmNB以及用get传参传入json[x]"wllm&q…...
Springboot+vue项目零食销售商城
摘要 随着科学技术的飞速发展,社会的方方面面、各行各业都在努力与现代的先进技术接轨,通过科技手段来提高自身的优势,零食销售商城当然也不能排除在外。零食销售商城是以实际运用为开发背景,运用软件工程原理和开发方法ÿ…...
cesium 雷达遮罩(电弧球效果)
cesium 雷达遮罩(电弧球效果) 以下为源码直接复制可用 1、实现思路 通过修改“material”材质来实现轨迹球效果 2、代码示例 2.1 index.html <!DOCTYPE html> <html lang="en"><head><!...
idea大量爆红问题解决
问题描述 在学习和工作中,idea是程序员不可缺少的一个工具,但是突然在有些时候就会出现大量爆红的问题,发现无法跳转,无论是关机重启或者是替换root都无法解决 就是如上所展示的问题,但是程序依然可以启动。 问题解决…...
C++实现分布式网络通信框架RPC(3)--rpc调用端
目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中,我们已经大致实现了rpc服务端的各项功能代…...
ES6从入门到精通:前言
ES6简介 ES6(ECMAScript 2015)是JavaScript语言的重大更新,引入了许多新特性,包括语法糖、新数据类型、模块化支持等,显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var…...
微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】
微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来,Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...
.Net框架,除了EF还有很多很多......
文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...
理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端
🌟 什么是 MCP? 模型控制协议 (MCP) 是一种创新的协议,旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议,它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...
LeetCode - 394. 字符串解码
题目 394. 字符串解码 - 力扣(LeetCode) 思路 使用两个栈:一个存储重复次数,一个存储字符串 遍历输入字符串: 数字处理:遇到数字时,累积计算重复次数左括号处理:保存当前状态&a…...
深入理解JavaScript设计模式之单例模式
目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式(Singleton Pattern&#…...
鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/
使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题:docker pull 失败 网络不同,需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...
Element Plus 表单(el-form)中关于正整数输入的校验规则
目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入(联动)2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...
