MySql 索引、锁、事务知识点小结

MySql索引、锁、事务知识点小结

MySql作为一种快速、安全、可靠的数据库,在开发中广泛使用。了解MYSQL索引、锁、事务知识点,可以帮助我们更好的管理、优化和提高Mysql的性能。

索引

索引是数据库中数据的快速查找结构。一个主键只能有一个索引,如果你经常使用where子句,order by子句,join子句进行查询,建立索引可以大大缩短查询的时间。

MySQL支持多种索引类型,如B-tree索引、哈希索引、全文索引等。

B-tree索引

B-tree索引最常使用的索引类型,用于对值进行分类和排序。在B-tree索引中,所有的节点数据都是排好序的,且中间节点保存了指向下一级节点的指针。B-tree索引可以加快查询速度,且适用于范围查询(如BETWEEN、>等)。

例如,为表users建立一个名为index_userId的B-tree索引:

CREATE INDEX index_userId ON users(userId);

哈希索引

哈希索引利用哈希算法将索引值映射到一个哈希表中。哈希索引不能进行范围查询,只能进行等于查询和IN查询,适用于使用哈希算法分布数据的场景。

例如,为表users建立一个名为hash_userId的哈希索引:

CREATE INDEX hash_userId ON users(userId) USING HASH;

锁是用于限制多个客户之间访问相同信息的并发控制方法。MySQL中常用的锁类型有共享锁和排他锁。

共享锁

共享锁是指多个客户可以同时读取相同的资料,但是他们之间是阻塞的,不能同时进行写操作。在共享锁的情况下,其他客户可以获取共享锁和读取相同的数据,但是无法进行写操作。共享锁使用LOCK SHARED语句进行获取。

LOCK TABLE users SHARED;

排他锁

排他锁是指当一个客户正在修改资料时,其他的客户不能读取或修改相同资料。排他锁称为写锁,可以使用LOCK WRITE语句进行获取。

LOCK TABLE users WRITE;

事务

事务是指作为一个单独单元执行的一系列相关的操作,事务的ACID原则包括原子性、一致性、隔离性和持久性。

事务的四种隔离级别

  • 未提交读(read uncommitted):事务不会加锁,也可以读取未提交的事务,可能出现脏读、不可重复读和幻读的问题。
  • 提交读(read committed):事务会在查询结束后立即释放锁,不能读取未提交的事务,可以避免脏读的问题,但可能会引起不可重复读和幻读。
  • 可重复读(repeatable read):保证在同一事务中所有读取的数据结果都是一致的,但可能出现幻读。
  • 可串行化(serializable):最高的隔离级别,会对读取和写入的数据加强锁机制,可以避免脏读、不可重复读和幻读,但会降低并发性能。

MySQL默认的隔离级别为可重复读(repeatable read)。可以使用SET TRANSACTION语句来修改隔离级别。

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
START TRANSACTION;
//操作
COMMIT;

示例

索引示例

例如,我们创建一个表,随机生成1000万不重复的整数值,并建立索引:

CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `number` int(11) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uniq_number` (`number`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

查询number=1000,未建立索引时查询时间大约为0.22秒,建立索引后查询时间只需要0.0005秒,效果显著。

SELECT * FROM `user` WHERE `number` = 1000; -- 未建立索引
SELECT * FROM `user` USE INDEX(`uniq_number`) WHERE `number` = 1000; -- 建立索引

事务示例

例如,我们有一个银行数据库,两个客户同时修改余额:

SELECT * FROM `account` WHERE `id` = 1; -- 客户A查询自己的余额
UPDATE `account` SET `balance` = `balance` - 100 WHERE `id` = 1; -- 客户A进行100元转账
SELECT * FROM `account` WHERE `id` = 2; -- 客户B查询自己的余额
UPDATE `account` SET `balance` = `balance` + 100 WHERE `id` = 2; -- 客户B进行100元接收转账

如果客户A和客户B同时执行转账操作,可能会导致余额错误,但通过使用事务,可以避免并发问题:

START TRANSACTION;
SELECT * FROM `account` WHERE `id` = 1 FOR UPDATE; -- 客户A查询自己的余额并上锁
UPDATE `account` SET `balance` = `balance` - 100 WHERE `id` = 1; -- 客户A进行100元转账
SELECT * FROM `account` WHERE `id` = 2 FOR UPDATE; -- 客户B查询自己的余额并上锁
UPDATE `account` SET `balance` = `balance` + 100 WHERE `id` = 2; -- 客户B进行100元接收转账
COMMIT;

以上是MySQL索引、锁、事务知识点的小结和示例,可以帮助我们更好地学习和使用MySQL。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:MySql 索引、锁、事务知识点小结 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • error while loading shared libraries xx.so处理方法

    当在 Linux 系统上运行一个程序时,如果弹出错误提示 error while loading shared libraries xx.so,会导致程序无法正常运行。这种错误一般是因为程序所依赖的共享库没有找到或者路径不正确。 针对这种错误,我们可以采用以下方法解决: 方法一:修改动态库搜索路径 修改动态库搜索路径的方法比较常见。可以在环境变量 LD_LI…

    database 2023年5月22日
    00
  • IDEA无法连接mysql数据库的6种解决方法大全

    IDEA无法连接mysql数据库的6种解决方法大全 问题描述 当使用IntelliJ IDEA开发Java项目时,连接MySQL数据库时可能会遇到无法连接的问题。此时,需要采取一些措施来解决问题。 以下是6种常见的解决方法: 方法一: 检查MySQL服务是否启动 首先,需要检查MySQL服务是否已经启动。可以在命令行中输入以下命令来检查: net start…

    database 2023年5月18日
    00
  • 十分简单易懂的Java应用程序性能调优技巧分享

    十分简单易懂的Java应用程序性能调优技巧分享 Java应用程序性能调优需要对代码进行分析、优化,以提高系统的响应和吞吐能力。本文就介绍一些简单易懂的Java应用程序性能调优技巧,以帮助开发者提高应用程序性能。 进行性能分析 性能分析是性能调优的第一步。常见的Java性能分析工具有:VisualVM、JConsole、jstack、jmap、jstat等。通…

    database 2023年5月19日
    00
  • 各种路由器的默认密码

    路由器是连接你的设备和互联网的交点,每个路由器都会有一个管理界面,需要输入账号和密码才能登录管理。然而,很多用户未曾更改默认的账号和密码就直接使用,这样会给黑客留下可乘之机。以下是关于各种路由器默认密码的攻略,希望对大家有所帮助。 一、如何找到路由器默认密码 查找路由器的默认用户名和密码通常可以在路由器的文档中找到,或者通过到路由器制造商的网站搜索找到。各大…

    database 2023年5月22日
    00
  • Docker环境下Spring Boot应用内存飙升分析与解决场景分析

    当我们使用Docker环境运行Spring Boot应用时,可能会遇到应用内存使用异常飙升的情况。这可能是由于应用程序在容器内部的配置或者资源限制不当导致的。本文将详细介绍一些场景分析与排查技巧,以便解决这种问题。 1. 场景分析 1.1 发现内存泄漏 我们可以通过查看应用程序容器的进程信息来确定是否存在内存泄漏。可以使用docker stats命令查看容器…

    database 2023年5月21日
    00
  • Redis5.0怎么安装?Linux下载安装Redis的操作步骤和配置教程

    接下来我将为您介绍在Linux下如何下载安装Redis5.0的详细操作步骤。 环境要求 操作系统:Ubuntu 16.04 或更高版本 具备 sudo 权限的用户 步骤一:下载安装Redis 打开终端,通过以下命令安装Redis依赖库: sudo apt-get update sudo apt-get upgrade sudo apt-get install…

    database 2023年5月22日
    00
  • MybatisPlus批量保存原理及失效原因排查全过程

    针对“MybatisPlus批量保存原理及失效原因排查全过程”的完整攻略,我将依次进行讲解。 1. Mybatis Plus 批量保存原理 Mybatis Plus 实现 Mybatis 的批量操作比起原始的 SqlSessionFactory,是原生支持批量插入、更新和删除的,而且你无需再考虑对数据层相关的代码进行批量包装处理。 具体的实现方式是,在执行批…

    database 2023年5月21日
    00
  • Navicat运行sql文件导入数据不全或导入失败的解决方案

    下面是详细讲解“Navicat运行sql文件导入数据不全或导入失败的解决方案”的完整攻略。 问题的背景 在使用Navicat工具进行sql文件导入时,可能会出现数据导入不全或导入失败的情况,这给数据导入带来了很大的麻烦。因此,我们需要找到解决这种情况的方法。 解决方案 方案一:增加sql文件导入参数 可以通过增加sql文件导入的参数来解决问题。具体操作如下:…

    database 2023年5月18日
    00
合作推广
合作推广
分享本页
返回顶部