MySQL 索引和事务

article/2025/8/20 9:05:29

目录

一:MySQL 索引介绍

1:索引概述

2:索引作用

3:索引的分类

(1)普通索引

(2)唯一索引

(3)主键索引

(4)组合索引(最左前缀)

(5)全文索引(FULLTEXT)

4:创建索引的原则依据

5:查看索引

6:删除索引

二:MySQL 事务


一:MySQL 索引介绍

    索引是一个排序的列表,在这个列表中存储着索引的值和包含这个值的数据所在行的物理地址。在数据十分庞大的时候,索引可以大大加快查询的速度。这是因为使用索引后可以不用扫描全表来定位某行的数据,而是先通过索引表找到该行数据对应的物理地址然后访问相应的数据。索引的作用类似于图书的目录,可以根据目录中的页码快速找到所需的内容。

1:索引概述

    当数据保存在磁盘类存储介质上时,它是作为数据块存放。这些数据块是被当作一个整体来访问的,这样可以保证操作的原子性。硬盘数据块存储结构类似于链表,都包含数据部分,以及一个指向下一个节点(或数据块)的指针,不需要连续存储。

    记录集只能在某个关键字段上进行排序,所以如果需要在一个无序字段上进行搜索,就要执行一个线性搜索(Linear Search)的过程,平均需要访问 N/2的数据块,N 是表示所占据的数据块数目。如果这个字段是一个非主键字段(也就是说,不包含唯一的访问入口),那么需要在N个数据块上搜索整个表格空间。

    但是对于一个有序字段,可以运用二分查找(Binary Search),这样只需要访问 1og2(N)的数据块。这就是为什么数据表使用索引后性能可以得到本质上提高的原因。

    索引是对记录集的多个字段进行排序的方法。在一张表中为一个字段创建一个索引,将创建另外一个数据结构,包含字段数值以及指向相关记录的指针,然后对这个索引结构进行排序,允许在该数据上进行二分法排序。

    使用索引的副作用是需要额外的磁盘空间。对于 MyISAM 引擎而言,这些索引是被统一保存在一张表中的。如果很多字段都建立了索引,那么会占用大量的磁盘空间,这个文件将很快到达底层文件系统所能够支持的大小限制。  

2:索引作用

作用类别具体作用说明
加速数据检索快速定位数据通过索引结构(如B+树)快速找到目标数据,避免逐行扫描
避免全表扫描如果没有索引,查询必须扫描整张表,效率极低
提高查询性能优化 WHERE 子句索引可以加速条件筛选,如 WHERE id = 100
加速 JOIN 操作在多表关联查询时,索引能提高连接字段的匹配速度
优化 ORDER BY 排序如果排序字段有索引,MySQL 可以直接按索引顺序读取,避免额外排序
优化 GROUP BY 分组分组操作可以利用索引提高效率
保证数据完整性唯一性约束(唯一索引)确保列值不重复,如 UNIQUE INDEX
主键约束(主键索引)确保每行数据有唯一标识,且不允许 NULL
优化特定操作覆盖索引(Covering Index)查询的列全部包含在索引中时,MySQL 可以直接从索引返回数据,无需回表查询
索引条件下推(Index Condition Pushdown, ICP)MySQL 5.6+ 支持,将 WHERE 条件下推到存储引擎层过滤,减少回表次数
加速表连接提高多表关联查询效率外键或连接字段上的索引可以大幅提升 JOIN 性能
注意事项索引会占用存储空间索引是额外的数据结构,会占用磁盘空间
影响写入性能(INSERT/UPDATE/DELETE)数据修改时,索引需要同步更新,可能降低写入速度
不合理的索引可能无法被优化器使用索引设计不当(如选择性低的列)可能导致优化器忽略索引,仍然全表扫描

3:索引的分类

    从物理存储的角度来划分,索引分为聚簇索引和非聚索引两种,聚索引是按照数据存放的物理位置为顺序的,而非聚簇索引就不一样了;聚簇索引能提高多行检索的速度,而非聚簇索引对于单行的检索更快。

    从逻辑的角度来划分,索引分为普通索引、唯一索引、主键索引、组合索引和全文索引。这些索引分类的具体解释如下所示。

(1)普通索引

    普通索引是最基本的索引,它没有任何限制,也是大多数情况下用到的索引。它有以下几种创建方式。

直接创建索引:

mysql> CREATE INDEX index_name ON table_name(column(length));

column 是指定要创建索引的列名。通常可以考虑将查询语句中在JOIN 子句和WHERE 子句里经常出现的列作为索引列。

其中 length 是可选项。如果忽略 length 的值,则使用整个列的值作为索引。如果指定使用列前的 length 个字符来创建索引,就是使用列的一部分来创建索引,这样有利于减小索引文件的大小,节省索引列所占的空间。在某些情况下,只能对列的前缀进行索引。索引列的长度有一个最大上限255个字节(MyISAM和 InnoDB 表的最大上限为 1000个字节),如果索引列的长度超过了这个上限,就只能用列的前缀进行索引。另外,BLOB或TEXT类型的列也必须使用前缀索引。column 和 length 的含义,在下面创建索引的操作语句中意义相同。

修改表结构的方式添加索引:

mysql> ALTER TABLE table_name ADD INDEX index_name (column(length));

创建表结构时,同时创建索引:

CREATE TABLE `table` (
`id`  int(11) NOT  NULL  AUTO_INCREMENT,

`title` char (255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,

`content`  text CHARACTER SET utf8 COLLATE utf8_general_ci NULL,

`time` int(10) NULL DEFAULT NULL ,

PRIMARY KEY (`id`),

INDEX index_name (title(length))

)

(2)唯一索引

    唯一索引与普通索引类似,不同的就是:唯一索引的索引列的值必须唯一,但允许有空值(注意和主键不同)。如果是组合索引,则列值的组合必须唯一。唯一索引创建方法和普通索引类似。

创建唯一索引:

mysql>CREATE UNIQUE INDEX index_name ON table_name (column(length));

修改表结构的时候添加唯一索引:

mysql>ALTER TABLE table_name ADD UNIQUE index_name(column(length));

创建表的时候同时创建唯一索引:

CREATE TABLE `table` (

`id` int(11) NOT NULL AUTO_INCREMENT,

`title` char(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,

`content` text CHARACTER SET utf8 COLLATE utf8_general_ci NuLL ,

`time` int(10) NULL DEFAULT NULL ,

PRIMARY KEY ( `id` ),

UNIQUE indexName (title(length))

);

(3)主键索引

    主键索引是一种特殊的唯一索引,一个表只能有一个主键,不允许有空值。一般是在建表的时候同时创建主键索引。

CREATE TABLE `table_name` (

`id` int(11) NOT NULL AUTO_INCREMENT,

`title` char(255) NOT NULL,

PRIMARY KEY (`id`)

);

(4)组合索引(最左前缀)

    平时用的 SQL 查询语句一般都有比较多的限制条件,所以为了进一步榨取MySQL 的效率,就要考虑建立组合索引。在组合索引的创建中,有两种场景,即为单列索引和多列索引。下面通过一个场景来具体说明单列索引和多列索引。

    在一个 user 用户表中,有 name,age,sex 三个字段,分别分三次建立了INDEX 普通索引。那么在 select*from user where name =’’ AND ageAND sex=’’;数据查询语句中就会分别检索三条索引,虽然扫描效率有所提升,但却还未达到最优。这个时候就需要使用到组合索引(即多列索引),如下所示。

create table user(

name varchar(9),

age int(3),
sex tinyint(1),
index user(name, age, sex)

);

    在 MySQL 中,有一个知识点叫最左原则。下面的 select 语句的 where 条件是依次从左往右执行的。

mysql> select * from user where name = ' ' AND age = ' ' AND sex = ' ';

    若使用的是组合索引 index user(name,age,sex)。在查询中,name、age、的顺序必须如组合索引中一致排序,否则索引将不会生效,例如:sex

mysql> select * from user where age = ' ' AND name = ' ' AND sex = ' ';

    如果采用“select * from user where age = ' ' AND name = ' ' AND sex = ' ';”查询方式,这条组合索引将无效化,所以一般在建立索引时,要先想好相应的查询业务,尽量避免虽然有索引,但是使用不上的问题。

(5)全文索引(FULLTEXT)

    对于较大的数据集,将资料输入一个没有FULLTEXT 索引的表中,然后创建索引,其速度比把资料输入现有FULLTEXT 索引的速度更快。不过切记对于大容量的数据表,生成全文索引是一个非常消耗时间、非常消耗硬盘空间的做法。

创建表的全文索引:

CREATE TABLE `table` (
`id` int(11) NOT NULL AUTO_INCREMENT

`title` char(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,

`content` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL,

`time` int(10) NULL DEFAULT NULL,

PRIMARY KEY (`id`),

FULLTEXT (content)

);

修改表结构添加全文索引:

mysql>ALTER TABLE article ADD FULLTEXT index_content (content);

直接创建索引:

mysqI>CREATE FULLTEXT INDEX index_content ON article(content);

4:创建索引的原则依据

数据库建立索引的原则:

  • 确定针对该表的操作是大量的查询操作还是大量的增删改操作;
  • 尝试建立索引来帮助特定的查询。检查自己的sq1语句,为那些频繁在where 子句中出现的字段建立索引;
  • 尝试建立复合索引来进一步提高系统性能。修改复合索引将消耗更长时间同时复合索引也占磁盘空间;
  • 对于小型的表,建立索引可能会影响性能;
  • 应该避免对具有较少值的字段进行索引;
  • 避免选择大型数据类型的列作为索引。

索引建立的原则:

    索引查询是数据库中重要的记录查询方法,要不要建立索引以及在那些字段上建立索引都要和实际数据库系统的查询要求结合来考虑,下面给出实际生产环境中的一些通用的原则:

  • 在经常用作过滤器的字段上建立索引;
  • 在 SQL语句中经常进行 GROUP BY、ORDER BY 的字段上建立索引;
  • 在不同值较少的字段上不必要建立索引,如性别字段;
  • 对于经常存取的列避免建立索引;
  • 用于联接的列(主健/外健)上建立索引;
  • 在经常存取的多个列上建立复合索引,但要注意复合索引的建立顺序要按照使用的频度来确定;
  • 缺省情况下建立的是非簇集索引,但在以下情况下最好考虑簇集索引,如:含有限数目(不是很少)唯一的列;进行大范围的查询;充分的利用索引可以减少表扫描 I/0的次数,有效的避免对整表的搜索。当然合理的索引要建立在对各种查询的分析和预测中,也取决于 DBA 所设计的数据库结构。

5:查看索引

mysql>show index from tablename;

mysql>show keys from tablename;

以 renyuan 表为例,查看renyuan 表的索引内容

字段解析:

  • Table:表的名称。
  • Non unique:如果索引不能包括重复词,则为0;如果可以,则为1。
  • Key name:索引的名称。Seq_in_index:索引中的列序号,从 1开始Column name:列名称。
  • Collation:列以什么方式存储在索引中。在 MySQL 中,有值'A’(升序)或 NULL(无分类)。
  • Cardinality:索引中唯一值数目的估计值。通过运行 ANALYZE TABLE 或myisamchk-a 可以更新。基数根据被存储为整数的统计数据来计数,所以即使对于小型表,该值也没有必要是精确的。基数越大,当进行联合时,MySQL 使用该索引的机会就越大。
  • Sub_part:如果列只是被部分地编入索引,则为被编入索引的字符的数目。
  • 如果整列被编入索引,则为 NULL。
  • Packed:指示关键字如何被压缩。如果没有被压缩,则为NULL。
  • Nu11:如果列含有 NULL,则含有 YES。如果没有,则该列含有 NO。
  • Index type:用过的索引方法(BTREE,FULLTEXT,HASH,RTREE)。
  • Comment:备注。

6:删除索引

    索引在创建之后,是会占用一定的磁盘空间的,因此表内如果有不再使用的索引从数据库性能方面考虑,最好是删除无用索引。索引的删除有如下两种方法。

DROP INDEX 索引名 ON 表名;

ALTER TABLE 表名 DROP INDEX 索引名;

以 renyuan 表为例,删除renyuan 表的索引。

添加索引

删除索引

二:MySQL 事务

    MySQL 事务主要用于处理操作量大,复杂度高的数据。比如说,在人员管理系统中,要删除一个人员,即需要删除人员的基本资料,又需要删除和该人员相关的信息,如信箱,文章等等。这样,这些数据库操作语句就构成一个事务!

  • 在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务。
  • 事务处理可以用来维护数据库的完整性,保证成批的 SQL 语句要么全部执行,要么全部不执行。
  • 事务用来管理 insert,update,delete 语句。

    一般来说,事务是必须满足4个条件(ACID):原子性(Atomicity,或称不可分割性)、一致性(Consistency)、隔离性(Isolation,又称独立性)持久性(Durability)

特性描述关键点
原子性 (Atomicity)事务中的所有操作要么全部成功,要么全部失败回滚- 不可分割的工作单位
- 失败时完全回滚
- 没有部分完成的状态
一致性 (Consistency)事务执行前后,数据库必须保持一致性状态- 符合所有数据规则和约束
- 保持数据完整性
- 触发所有定义的约束(如外键、唯一性等)
隔离性 (Isolation)多个并发事务执行时,彼此隔离,防止数据混乱- 隔离级别:
- 读未提交(脏读)
- 读提交(避免脏读)
- 可重复读(MySQL默认)
- 串行化(完全隔离)
持久性 (Durability)事务一旦提交,对数据的修改是永久性的,即使系统故障也不会丢失- 通过事务日志(如redo log)实现
- 系统崩溃后可通过日志恢复

    在 MySQL 命令行的默认设置下,事务都是自动提交的,即执行 SQL 语句后就会马上执行COMMIT操作。因此要显式地开启一个事务必须使用命令BEGIN或 START TRANSACTION,或者执行命令 SET AUTOCOMMIT=0,用来禁止使用当前会话的自动提交。

语句分类命令语法作用描述注意事项
开启事务BEGIN; 或 START TRANSACTION;显式开始一个新事务在InnoDB引擎中,默认自动提交(auto-commit)需关闭才有效
提交事务COMMIT; 或 COMMIT WORK;永久保存事务中的所有修改提交后无法回滚
回滚事务ROLLBACK; 或 ROLLBACK WORK;撤销事务中的所有未提交修改只能回滚未提交的事务
设置保存点SAVEPOINT savepoint_name;在事务内创建标记点,允许部分回滚一个事务可创建多个保存点
回滚到保存点ROLLBACK TO savepoint_name;回滚到指定保存点,保留该点之前的操作保存点之后的操作会被撤销
删除保存点RELEASE SAVEPOINT savepoint_name;删除已创建的保存点删除不存在的保存点会报错
设置隔离级别SET TRANSACTION ISOLATION LEVEL level;设置事务隔离级别(READ UNCOMMITTED/READ COMMITTED/REPEATABLE READ/SERIALIZABLE)需在事务开始前设置,部分级别可能影响性能

MYSQL 事务处理主要有两种方法:

(1)用 BEGIN, ROLLBACK,COMMIT 来实现

  • BEGIN 开始一个事务
  • ROLLBACK 事务回滚
  • COMMIT 事务确认

(2)直接用 SET 来改变 MySQL 的自动提交模式

  • SET AUTOCOMMIT=0 禁止自动提交
  • SET AUTOCOMMIT=1 开启自动提交

以下是事务的示例:


http://www.hkcw.cn/article/ATEaLrdEwV.shtml

相关文章

MySQL 数据库操作

目录 一. MySQL 数据库介绍 二. MySQL 库操作 1.系统数据库 2.数据库操作 三. MySQL 表操作 1.表介绍 2.查看表 3.创建表 4.查看表结构 5.修改表 6.复制和删除 四. MySQL 数据操作 1.插入数据 INSERT 2.删除与更新 INSERT 4.查询数据 INSERT 单表查询 1.单表…

郑州首店停工?胖东来方面回应 工程正常对接中

随着于东来此前公布的胖东来郑州首店开业日期(2026年元旦)临近,网友愈发关注该超市的动态。近日,有网友发现该店的建设似乎停工了。跟不久前热热闹闹的地面部分施工现场相比,如今很难见到工人师傅的身影,甚至“中建七局”几个大字已被拆除。这让网友们开始担忧是否能按计…

女子穿高跟鞋跑步摔伤起诉健身房 责任划分引争议

女子穿高跟鞋跑步摔伤起诉健身房 责任划分引争议!一名女子穿着高跟鞋在健身房跑步机上跑步,不久后因跟不上跑步机速度而摔倒,导致十级伤残。她随后起诉健身房要求赔偿。然而,健身房跑步机旁的墙上贴有不能穿高跟鞋跑步的提醒。2024年3月8日,刘娜(化名)穿着高跟鞋进入益阳…

减肥走回家时家人会在路上迎接我

减肥走回家时家人会在路上迎接我。责任编辑:zx0002

沃尔沃高管谈汽车安全:不抢风头,只想多救一命

沃尔沃高管谈汽车安全。4月15日晚,全新一代沃尔沃XC90正式上线,限时尊享价从47.9万元起跳。这台顶着“旗舰SUV”光环的北欧大块头,不但没来啥夸张参数堆料,也没整那些炫酷得让人眼花缭乱的智能化噱头——它依然稳稳地押注在“安全”两个字上,用最不招摇的方式稳扎传统豪华…

主持人李彬因长期服药满头白发面部浮肿,却依旧保持乐观

5月29日,知名主持人李彬罕见露面发视频,视频中李彬满头白发声音沙哑向大家问好。此前,李彬曾自曝生病,需长期服用药物导致面部浮肿,却依旧保持乐观。李彬,出生于河北省衡水市,中国影视演员、主持人,曾主持《超级大赢家》。责任编辑:zx0002

.NET WinForm图像识别二维码/条形码并读取其中内容

需求:图像识别出一张图片中的二维码或者条形码,并读取其中内容。 一、安装库(特别注意,网上很多都没说清楚) 如果是基于.net framework,则安装ZXing.Net(建议0.14.0版本左右,具体看实际,版本太高,部分接口…

Java 注解与反射(超详细!!!)

Java 注解与反射(超详细!!!) 文章目录 Java 注解与反射(超详细!!!)1.注解1.1内置注解1.1.1 SuppressWarnings注解用法 1.2 元注解1.3自定义注解 2.反射2.1 反…

开关电源输出噪声--陶瓷 电解电容差异

对于LED恒流源驱动,输出只用电解电容,噪声大 对于LED恒流源驱动,输出用电解电容和陶瓷电容(C77& C78改成22uf陶瓷电容),噪声小到50 mV左右

【运维实战】定时任务-crontab命令

定时任务的应用场景 数据备份 定期对重要数据进行备份,是保障数据安全的重要手段。比如,我们可以设置每周日凌晨对整个数据库进行全量备份,或者每天对关键业务数据进行增量备份。这样,即便遇到硬件故障、误操作等意外情况&#…

[免费]SpringBoot+Vue垃圾分类管理【论文+源码+SQL脚本】

大家好,我是java1234_小锋老师,看到一个不错的SpringBootVue垃圾分类管理【论文源码SQL脚本】,分享下哈。 项目视频演示 【免费】SpringbootVue垃圾分类管理系统 Java毕业设计_哔哩哔哩_bilibili 项目介绍 本论文主要论述了如何使用JAVA语言…

等保测评-Linux主机测评篇

Linux主机测评 目录 Linux主机测评 0x01 前言 0x02 测评过程 1.身份的鉴别 a).对登陆的用户进行身份鉴别和标识,身份标识具有唯一性 b).应具有登录次数限制,登陆超时等措施 c).在进行远程控制中,防止传输过程被窃听 2.访问控制 a).…

面向对象基本概念:多态;附带应用例子

目录 一. 多态的概念简介 二. 多态的例子一:偏好过滤器 三. 多态的例子二:审查描述符(需要元编程知识) 四. 总结 面向对象编程(Object Oriented Programming,OOP)有三大核心概念:封装,继承,多态。前两个…

Linux 串口连接乱码

用到的全部软件,都放在这个网盘里面了,自取。 链接: https://pan.baidu.com/s/1AR6Lj8FS7bokMR5IrLmsIw?pwd3dzv 提取码: 3dzv 如果链接失效了,关注公号:每日早参,回复:资源,即可免费获取&…

linux之web实战rsync

一、rsync简介 rsync是用于数据备份共享以及增量同步的工具,它可以在本地计算机与远程计算机之间,或者两个本地目录之间同步文件(但不支持两台远程计算机之间的同步)。它也可以当作文件复制工具,替代cp和mv命令 二、…

链表经典题目(力扣 easy)

全部题目来自力扣,这里只做学习的记录,内容中部分为AI生成,有不对的地方可以评论或者私信哦~~ 203. 移除链表元素 (版本一)虚拟头节点法 # Definition for singly-linked list. # class ListNode: # def __init_…

UFSH2024 程序化生成 笔记

这篇只是把里面涉及到的网站连接做个记录。有些网站“藏"得太深了。找了半天才找到相关连接 官方视频: [UFSH2024]关于程序化生成,我们还能做什么? | 周杰 徐凯鸣 腾讯IEG Global_哔哩哔哩_bilibili 官方案例资源连接: Vit…

openEuler安装MySql8(tar包模式)

操作系统版本: openEuler release 22.03 (LTS-SP4) MySql版本: 下载地址: https://dev.mysql.com/downloads/mysql/ 准备安装: 上传安装包: 把下载下来的安装包上传到服务器:/opt/software/mysql目录…

JSON Schema

1.JSON Schema的含义 JSON Schema 是用于验证 JSON 数据结构的强大工具,Schema可以理解为模式或者规则,可以理解为JSON中的正则表达式 2.语法 2.1 type 作用:约束数据类型 取值范围:integer,string,object&…

替代 WPS 的新思路?快速将 Word 转为图片 PDF

在这个数字化办公日益普及的时代,越来越多的人开始关注文档处理工具的功能与体验。当我们习惯了某些便捷操作时,却发现一些常用功能正逐渐变为付费项目——比如 WPS 中的一项实用功能也开始收费了。 这款工具最特别的地方在于,可以直接把 W…