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日

相关文章

  • MySQL5.6.22安装配置方法图文教程

    以下是MySQL5.6.22安装配置方法图文教程的完整攻略: 准备工作 在开始安装之前,我们需要进行一些基本的准备工作。 系统要求 MySQL要求主机最低要求: CPU:Pentium III 或更高。 内存:256MB 或更高。 存储:500MB 或更高。 下载MySQL安装包 你可以从MySQL的官网上下载最新版本的MySQL安装包。下载地址:https…

    database 2023年5月22日
    00
  • VirtualBox CentOS7.7.1908 Python3.8 搭建Scrapy开发环境【图文教程】

    VirtualBox CentOS7.7.1908 Python3.8 搭建Scrapy开发环境【图文教程】 本教程将介绍如何在VirtualBox虚拟机上安装CentOS 7.7.1908系统,以及如何安装Python3.8和Scrapy框架来搭建开发环境。 步骤一:安装VirtualBox 首先下载并安装VirtualBox软件,可以从官方网站(http…

    database 2023年5月22日
    00
  • MySQL合并查询结果的实现

    MySQL的合并查询结果分为两种方式:UNION和UNION ALL。两种方式的区别在于返回结果是否去重。 UNION的格式如下: SELECT column_name(s) FROM table_name1 UNION SELECT column_name(s) FROM table_name2; 它会将两个SELECT语句的结果集合并,并去除重复的行,合…

    database 2023年5月22日
    00
  • 几种MySQL中的联接查询操作方法总结

    几种MySQL中的联接查询操作方法总结 在MySQL中,联接查询是非常常见的操作,它可以将多个数据表中的数据合并在一起,能够满足复杂查询的需求。本文总结了几种MySQL中的联接查询操作方法,希望能为读者提供一些参考。 内连接查询(INNER JOIN) 内连接查询是联接操作中最常用的一种方法。它会将多个表中共有的数据记录连接在一起,只输出同时存在于这些表中的…

    database 2023年5月22日
    00
  • Redis缓存的主要异常及解决方案

    作者:京东物流 陈昌浩 1 导读 Redis 是当前最流行的 NoSQL数据库。Redis主要用来做缓存使用,在提高数据查询效率、保护数据库等方面起到了关键性的作用,很大程度上提高系统的性能。当然在使用过程中,也会出现一些异常情景,导致Redis失去缓存作用。 2 异常类型 异常主要有 缓存雪崩 缓存穿透 缓存击穿。 2.1 缓存雪崩 2.1.1 现象 缓存…

    Redis 2023年4月11日
    00
  • Sqlserver 2005附加数据库时出错提示操作系统错误5(拒绝访问)错误5120的解决办法

    下面是关于“Sqlserver 2005附加数据库时出错提示操作系统错误5(拒绝访问)错误5120的解决办法”的完整攻略。 问题描述 当我们在使用 SQL Server 2005时,有时会遇到“附加数据库时出错提示操作系统错误5(拒绝访问)错误5120”的问题。这一问题的原因在于 SQL Server 没有足够的权限访问我们要附加的数据库文件,从而导致出现错…

    database 2023年5月19日
    00
  • MySQL在线开启或禁用GTID模式

    以下是详细讲解MySQL在线开启或禁用GTID模式的攻略。 什么是GTID模式 GTID(Global Transaction ID)是MySQL 5.6引入的新特性,它可以跟踪在所有复制集群在所有服务器上执行过的每个事务,用于提高高可用性和易维护性。GTID分为两个模式: 开启GTID模式: 当启用GTID模式时,每个写操作都会被标记为一个全局唯一的ID,…

    database 2023年5月22日
    00
  • Teradata和PouchDB的区别

    我来为您详细讲解Teradata和PouchDB的区别。 Teradata和PouchDB简介 Teradata Teradata是一种关系型数据库管理系统,它可以管理大型企业应用的数据仓库,支持高性能的并发处理和多用户访问。它有多个组件,包括数据库、服务和工具等。作为一种企业级数据库,Teradata具有可扩展性、稳定性、高性能等优势。 PouchDB P…

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