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

yizhihongxing

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日

相关文章

  • SQL中查找某几个字段完全一样的数据

    要查询SQL中某几个字段完全一样的数据,可以采用以下步骤: 1.使用SELECT语句进行数据查询。2.在SELECT语句中使用DISTINCT关键词进行筛选,过滤掉重复的数据。3.使用GROUP BY语句进行分组,将具有相同值的数据归为一组。4.使用HAVING语句进行进一步筛选,找出具有相同值的数据组。 例如,在以下学生表格中,要查询姓名和年龄完全一样的所…

    database 2023年5月21日
    00
  • 详解MySQL多表关联更新

    MySQL多表关联更新,是指在多个表之间建立关联关系,并在其中一个表中更新与另一个表相关的数据。例如,我们有两个表:用户表(users)和订单表(orders)。用户表中存储了用户的基本信息,订单表中存储了用户的订单信息(比如订单编号、用户ID、订单金额等)。如果我们要更新用户表中的数据(比如用户的名字),同时更新相关订单表中的数据(比如订单中的用户姓名需要…

    MySQL 2023年3月10日
    00
  • Shell、Perl、Python、PHP访问 MySQL 数据库代码实例

    Shell、Perl、Python、PHP都是常用的编程语言,通过它们,我们可以方便的访问和操作MySQL数据库。下面,我们将详细讲解在这些编程语言中如何访问MySQL数据库,以及提供一些代码实例。 一、Shell访问MySQL数据库 Shell是一种常见的面向文本的命令行界面,可以通过Shell脚本实现对MySQL数据库的访问和操作。 1. 安装MySQL…

    database 2023年5月22日
    00
  • MyBatis-plus批量插入的通用方法使用

    MyBatis-plus是MyBatis的增强工具,在使MyBatis更加易用和便捷的同时,也加强了MyBatis的一些功能。其中,批量插入是MyBatis-plus中的一个重要功能之一。本篇攻略将针对MyBatis-plus批量插入的通用方法进行详细的讲解,包括必要的代码实现和示例说明。 准备工作 在使用MyBatis-plus批量插入的功能之前,我们需要…

    database 2023年5月21日
    00
  • MySql更新优化策略

    MySql更新优化策略 在进行数据库更新操作时,我们需要关注数据库性能优化,优化可以提高更新操作的效率,减少不必要的资源消耗。以下是一些MySql数据库更新优化策略。 1.使用WHERE子句 使用WHERE子句可以只更新满足条件的记录,避免不必要的更新操作,减少对系统资源的消耗。例如,我们可以使用如下语句来更新表中ID=1的一条记录,而不更新其他记录: UP…

    database 2023年5月21日
    00
  • Python3 下 Redis 返回 bytes 类型的问题

    Python3 下 Redis 默认返回 bytes 类型数据,而 Python3 下 bytes 类型和 str 类型不能直接互用,容易出错,解决方法是在建立 Redis 连接的时候将 decode_responses 设置为 True,表示将返回的 bytes 数据解码为 str 数据 def __init__(self, host=’localhost…

    Redis 2023年4月13日
    00
  • PHP实现对xml的增删改查操作案例分析

    下面就为您详细讲解如何在PHP中实现对XML文件的增删改查(CRUD)操作。 Step 1:读取XML文件 在PHP中,可以使用simplexml_load_file()函数读取XML文件。示例代码如下: $xml = simplexml_load_file(‘test.xml’); 这里的test.xml为您要操作的具体XML文件名。 Step 2:查询X…

    database 2023年5月22日
    00
  • oracle 字符串转成行

    下面是“Oracle字符串转成行”的详细攻略。 1. 概述 在Oracle数据库中,有时需要将一个字符串按照一定的规则转换成多行数据,这就需要使用字符串转行的工具函数。Oracle提供了多种方式实现字符串转行操作,本文将介绍其中的两种方式。 2. 使用connect by语句 connect by语句是Oracle中用于实现递归查询的语句。在字符串转行操作中…

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