MySQL索引、事务与隔离级别探究

当提到数据库管理系统(DBMS)时,MySQL 往往是首选的开源关系型数据库之一。MySQL 提供了强大的功能,涵盖了许多数据库管理方面的核心概念,其中包括索引、事务和隔离级别。在本篇博客中,我们将深入探讨这些关键概念以及它们在 MySQL 中的作用~~

目录

索引:数据库的关键性能优化工具

1.什么是索引?

2.为什么使用索引?

3.如何创建索引?

事务:确保数据库的一致性和完整性

1.什么是事务?

2.为什么使用事务?

3.如何使用事务?

4.事务的四大特性

隔离级别:管理事务之间的可见性

1.什么是隔离级别?

2.不同隔离级别的特点

 事务常见的并发问题

不可重复读(Non-repeatable Read):

脏读(Dirty Read):

幻读(Phantom Read):

 数据库查询用到的数据结构分析


索引:数据库的关键性能优化工具

1.什么是索引?

在 MySQL 中,索引是一种数据结构,它可以加速对表中数据的检索操作。索引的工作原理类似于书籍的目录,它提供了一种快速查找数据的方式,而不必扫描整个表格。

2.为什么使用索引?

  • 提高查询性能:通过使用索引,数据库可以更快速地定位和检索数据,特别是在大型表中。
  • 加速排序和连接操作:索引还有助于排序和连接操作,这些操作通常需要更多的计算资源。

3.如何创建索引?

在 MySQL 中,你可以使用 CREATE INDEX 语句来创建索引,通常是在表创建后或在已存在的表上添加索引。例如:

CREATE INDEX idx_username ON users(username);

这将在名为 "users" 的表的 "username" 列上创建一个索引。

需要注意的是主键会自带索引,unique也会~~ 

事务:确保数据库的一致性和完整性

1.什么是事务?

事务是一组数据库操作,它们要么全部成功执行,要么全部失败,没有中间状态。在 MySQL 中,事务是用来确保数据库的一致性和完整性的关键机制。

2.为什么使用事务?

  • 数据一致性:事务可以确保数据在多个操作之间保持一致,即使在操作期间发生故障也不会丢失数据。
  • 数据完整性:事务可以保护数据免受意外的修改或损坏。
  • 并发控制:事务还用于管理多个用户同时访问数据库的情况,以防止数据冲突和混乱。

3.如何使用事务?

在 MySQL 中,你可以使用 BEGINCOMMITROLLBACK 语句来管理事务。例如:

BEGIN; -- 开始事务
-- 执行一系列数据库操作
COMMIT; -- 提交事务,将更改保存到数据库
-- 或者
ROLLBACK; -- 回滚事务,撤销更改

回滚事务:当第一个sql执行完了,数据库崩溃,当下次数据库重新启动完成之后,就会自动把上次修改一半的数据给进行还原~~ 

4.事务的四大特性

  1. 原子性(Atomicity)

    • 原子性确保事务是一个不可分割的操作单元。要么所有的操作都成功执行,要么全部失败回滚,不存在中间状态。如果事务的任何部分失败,那么数据库会自动回滚到事务开始之前的状态,以确保数据的一致性。
  2. 一致性(Consistency)

    • 一致性保证了事务的执行不会破坏数据库的完整性约束。在事务开始和结束时,数据库必须处于一致的状态。这意味着事务必须使数据库从一个一致的状态转移到另一个一致的状态,而不会违反任何完整性约束。
  3. 隔离性(Isolation)

    • 隔离性确保事务在并发执行时不会相互干扰。每个事务都应该感觉自己是唯一执行的,即使有多个事务同时运行。为了实现隔离性,数据库系统通常使用锁和其他机制来管理并发访问。
  4. 持久性(Durability)

    • 持久性确保一旦事务提交,其结果将永久保存在数据库中,即使系统崩溃或断电也不会丢失。数据库系统通常将已提交的事务的更改记录在持久存储介质(例如磁盘)上,以确保数据的持久性。

隔离级别:管理事务之间的可见性

1.什么是隔离级别?

隔离级别定义了在一个事务中所做的更改对其他事务的可见性程度。MySQL 提供了四个隔离级别,分别是 READ UNCOMMITTED(读未提交)、READ COMMITTED(读已提交)、REPEATABLE READ(可重复读) 和 SERIALIZABLE(可重复读)

2.不同隔离级别的特点

  1. READ UNCOMMITTED(读未提交)

    • 最低的隔离级别,不提供任何隔离性。
    • 允许一个事务读取另一个事务未提交的更改。
    • 可能导致脏读、不可重复读和幻读问题。
    • 通常不建议在生产环境中使用。
  2. READ COMMITTED(读已提交)

    • 允许一个事务只能读取已提交的更改,避免了脏读。
    • 但仍可能存在不可重复读和幻读的问题。
    • 是大多数数据库系统的默认隔离级别。
  3. REPEATABLE READ(可重复读)

    • 确保一个事务在同一查询中多次读取相同数据时获得一致的结果。
    • 避免了脏读和不可重复读,但仍可能存在幻读。
    • MySQL 的默认隔离级别。
  4. SERIALIZABLE(串行化)

    • 最高的隔离级别,确保一个事务不会受到其他事务的影响。
    • 避免了脏读、不可重复读和幻读问题,但会对并发性产生较大影响。
    • 适用于需要最高数据完整性和一致性的场景,但性能较差。

 事务常见的并发问题

  1. 不可重复读(Non-repeatable Read)

    • 不可重复读发生在一个事务在读取同一行数据的两次操作之间,另一个并发事务修改了这一行数据,导致第一事务两次读取到的数据不一致。
    • 这可能会导致事务在不同时间点看到不同的数据状态。
    • 举个例子

    解决方法

    • 使用较高隔离级别,如 REPEATABLE READ 或 SERIALIZABLE,以减少不可重复读的概率。
    • 在需要读取数据的事务中使用锁,或者使用数据库提供的事务隔离级别。
    • 举个例子
  2. 脏读(Dirty Read)

    • 脏读发生在一个事务读取了另一个事务未提交的数据时。如果未提交的事务回滚,那么脏读操作就读取了不正确的数据。
    • 脏读可能导致事务基于不稳定的数据做出决策,最终导致数据不一致。
    • 举个例子:

    解决方法

    • 使用较高隔离级别,如 READ COMMITTED、REPEATABLE READ 或 SERIALIZABLE,以避免脏读。
    • 在写入数据时使用事务,并在事务完成后再允许其他事务读取数据。
    • 举个例子:我和朋友们商量号,在我写代码的过程中不要来看,等我改完,提交到csdn,你们在通过我的csdn来看,“写操作”和“读操作”不能并发了~~
  3. 幻读(Phantom Read)

    • 幻读发生在一个事务在两次查询之间,另一个并发事务插入了新行或删除了行,导致第一事务两次查询得到的行数不一致。
    • 幻读通常与范围查询有关,例如,在一个事务内查询某个范围的数据行。
    • 举个例子:

    解决方法

    • 使用较高隔离级别,如 SERIALIZABLE,以避免幻读。
    • 使用行级锁或其他并发控制手段来确保在事务执行期间数据不被插入或删除。
    • 举个例子:

 数据库查询用到的数据结构分析

 

 

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

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

相关文章

记录一次OSSClient使用不当导致的OOM排查过程

首发:公众号《赵侠客》 前言 最近线上有个比较边缘的项目出现OOM了,还好这个项目只是做一些离线的任务处理,出现OOM对线上业务没有什么影响,这里记录一下排查的过程 Dump日志查看 项目配置的主要JVM参数设置如下: …

Java精品项目源码第61期垃圾分类科普平台(代号V061)

Java精品项目源码第61期垃圾分类科普平台(代号V061) 大家好,小辰今天给大家介绍一个垃圾分类科普平台,演示视频公众号(小辰哥的Java)对号查询观看即可 文章目录 Java精品项目源码第61期垃圾分类科普平台(代号V061)难度指数&…

Word 文档转换 PDF、图片

工作有需要 Word 文档转换 PDF、图片 的场景,我们来看看 Java 开发中怎么解决这个问题的。 Word 转 PDF Word 转 PDF 分为商用 Aspose 方案和开源 Apache POIiText 方案。 Aspose 方案 这种方式在目前来看应该是最好的,无论是转换的速度还是成功的概…

《Linux运维总结:Centos7.6之OpenSSH7.4升级版本至9.4》

一、环境信息 操作系统:Centos7.6.1810 OpenSSH_7.4p1, OpenSSL 1.0.2k-fips 如下图所示: 注意:升级后由于加密算法的区别,低版本的SSH工具可能无法连接,建议改用Xshell7或SecureCRT9.0以上版本。 二、注意事项 1、检…

URL 管理器

基本介绍 对外接口 对外提供两个接口:一个可以提取URL,一个可以增加URL,分别对应图上的1和2。 当要爬取某个网页时,则可以从1接口提取出该网页的URL进行爬取。 有时候爬取的网页内容中会包含别的网页链接,即包含有U…

【LeetCode-简单题】剑指 Offer 05. 替换空格

文章目录 题目方法一:常规做法:方法二:双指针做法 题目 方法一:常规做法: class Solution {public String replaceSpace(String s) {int len s.length() ;StringBuffer str new StringBuffer();for(int i 0 ; i &l…

unity 使用Photon进行网络同步

Pun使用教程 第一步:请确保使用的 Unity 版本等于或高于 2017.4(不建议使用测试版)创建一个新项目。 第二步:打开资源商店并找到 PUN 2 资源并下载/安装它。 导入所有资源后,让 Unity 重新编译。 第三步&#xf…

Java文字描边效果实现

效果: FontUtil工具类的完整代码如下: 其中实现描边效果的函数为:generateAdaptiveStrokeFontImage() package com.ncarzone.data.contentcenter.biz.img.util;import org.springframework.core.io.ClassPathResource; import org.springfr…

Prompt-To-Prompt——仅通过文本进行图像编辑

文章目录 1.摘要2.算法2.1 Cross-attention in text-conditioned Diffusion Models2.2 Controlling the Cross-attentionWord SwapAdding a New PhraseAttention Re–weighting 3.应用Text-Only Localized EditingGlobal editingFader Control using Attention Re-weightingRea…

HPC集群自动弹性扩缩的两种实现方式

常青藤 HPC常青园 2023-07-28 19:48 发表于北京 弹性扩缩技术正在成为HPC集群中的一项重要技术。它可以根据实际需求动态调整集群资源,应对用户负载的波动。对于运维团队来说,自动弹性扩缩能够减轻集群运维负担,提高集群资源利用率&#xff0…

Kettle REST Client获取token调用接口解析JSON入文件实例

Kettle REST Client获取token调用接口解析JSON入文件实例 需求说明 通过kettle组件调用接口并解析JSON成结构化数据入文件。 完整实例 解决方法 利用生成记录组件定义URL参数通过REST ClENT组件请求得到TOKEN通过JSON INPUT组件解析接口请求的结果通过JAVASCRIPT组件拼接生…

储存高精长整型の另一种思路——二维数组

利用二维数组储存高精长整型 题目解题思路问题解决代码实现总结反思 题目 luogu P2437 蜜蜂路线 解题思路 最初只觉得是一道很简单的递推 先考虑从第一个点出发的情况,对于第 k ( k ≥ 3 ) k (k≥3) k(k≥3)个点,路线数表示如下: a [ k …