MySQL索引,事务

一.MySQL索引介绍

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

1.概述

       当数据保存在磁盘类存储介质上时,它是作为数据块存放。这些数据块是被当作一个整体来访问的,这样可以保证操作的原子性。硬盘数据块存储结构类似于链表,都包含数据部分,以及一个指向下一个节点(或数据块)的指针,不需要连续存储。
      记录集只能在某个关键字段上进行排序,所以如果需要在一个无序字段上进行搜索,就要执行一个线性搜索(LinearSearch)的过程,平均需要访问N/2的数据块,N是表示所占据的数据块数日。如果这个字段是一个非主键字段(也就是说,不包含唯一的访问入口)那么需要在N个数据块上搜索整个表格空间
      但是对于一个有序字段,可以运用二分查找(BinarySearch),这样只需要访间log2(N)的数据块。这就是为什么数据表使用索引后性能可以得到本质上提高的原因。
      素引是对记录集的多个字段进行排序的方法。在一张表中为一个字段创建一个索引,将创建另外一个数据结构,包含字段数值以及指向相关记录的指针,然后对这个索引结构进行排序,允许在该数据上进行二分法排序。
      使用索引的副作用是需要额外的磁盘空间。对于MyISAM引而言,这些索引是被统一保存在一张表中的。如果很多字段都建立了索引,那么会占用大量的磁盘空间,这个文件将很快到达底层文件系统所能够支持的大小限制

2.索引作用

  • 设置了合适的索引之后,数据库利用各种快速定位技术,能够大大加快查询速度,这是创建索引的最主要的原因。
  • 当表很大或查询涉及到多个表时,使用索引可以成千上万倍地提高查询速度。
  • 可以降低数据库的IO成本,并且索引还可以降低数据库的排序成本。
  • 通过创建唯一性索引,可以保证数据表中每一行数据的唯一性。
  • 可以加快表与表之间的连接。
  • 在使用分组和排序时,可大大减少分组和排序的时间。​​​​​​​

3.索引分类

        从物理存储的角度来划分,索引分为聚族索引和非聚族索引两种,聚族索引是按照数据存放的物理位置为顺序的,而非聚族索引就不一样了;聚索引能提高多行检索的速度,而非聚族索引对于单行的检索更快
    从逻辑的角度来划分,索引分为普通索引、唯一索引、主键索引、组合索引和全文索引。

(1)普通索引

普通索引是最基本的索引,它没有任何限制,也是大多数情况下用到的索引。

创建普通索引

mysql> create index index_name on users(user_name(20));

备注:index索引,on后面跟要创建索引的表名,表名括号内跟该表内标准型字段名以及它的字符长度。 

修改表格式添加索引

alter table 表名 add index 索引名(用于索引的字段)

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

CREATE TABLE table01 ( 
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_table01_title (title(11)) 
);
(2)唯一索引

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

创建唯一索引

create unique index 索引名 on 表名(索引字段(长度));

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

alter table 表名 add unique 索引名(索引字段(长度))

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

create table 表名 (
id int(10),
name char(20),
pwd char(50),
unique index 索引名(ip)
);
(3)主键索引

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

create table t2(
id int(10),
name char(20),
age char(2),
pwd char(50),
primary key (id)
);
(4)组合索引(最左前缀)

        平时用的SQL查询语句一般都有比较多的限制条件,所以为了进一步榨取MySQL的效率,就要考虑建立组合索引。在组合索引的创建中,有两种场景,即为单列索引和多列索引。下面通过一个场景来具体说明单列索引和多列索引
        在一个user用户表中,有name,age,sex三个字段,分别分三次建立了INDEX普通索引。那么在select * from user where name="" AND age="" AND sex="";数据查询语句中就会分别检索三条索引,虽然扫描效率有所提升,但却还未达到最优。这个时候就需要使用到组合索引(即多列索引)

create table user(
name char(20),
age int(3),
sex tinyint(1),
index user(name,age,sex)
);

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

select * from user where name="" and age="" and sex="";

        若使用的是组合索引index user(name,age,sex)。在查询中,name,age,sex的顺序必须如组合索引中一致排序,否则索引将不会生效,所以一般在建立索引时,要先想好响应的查询业务,尽量避免虽然有索引,但是使用不上的问题。

(5)全文索引

        对于较大的数据集,将资料输入一个没有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) 
);

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

ALTER TABLE article ADD FULLTEXT index_content(content);

直接创建索引语法:

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

4.创建索引的原则依据

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

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

  • 表的主键、外键必须有索引。因为主键具有唯一性,外键关联的是子表的主键,查询时可以快速定位。
  • 记录数超过300行的表应该有索引。如果没有索引,需要把表遍历一遍,会严重影响数据库的性能。
  • 经常与其他表进行连接的表,在连接字段上应该建立索引。
  • 唯一性太差的字段不适合建立索引。
  • 更新太频繁地字段不适合创建索引。
  • 经常出现在 where 子句中的字段,特别是大表的字段,应该建立索引。索引应该建在选择性高的字段上。
  • 索引应该建在小字段上,对于大的文本字段甚至超长字段,不要建索引。

5.查看索引

查看索引的方法有三个:

  1. show create table 表名;
  2. show index from 表名;
  3. show keys tables 表名;

 6.删除索引

索引的删除方法有两种:

  1. drop index 索引名 on 表名;
  2. alter table 表名 drop index 索引名;

​​​​​​​二.MySQL事务

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

        在MySQL中只有使用了Innodb数据库引擎的数据库或表才支持事务。

        事务处理可以用来维护数据库的完整性,保证成批的SQL语句要么全部执行,要么全部不执行。

        是一个不可分割的工作逻辑单元,在数据库系统上执行并发操作时,事务是最小的控制单元

        适用于多用户同时操作的数据库系统的场景,如银行、保险公司及证券交易系统等​​​​​​​

一般来说事务是必须满足4个条件:原子性(不可分割性),一致性,隔离性,持久性。

  1. 原子性(Atomicity)

    • 一个事务中的所有操作被视为一个单独的工作单元,即不可分割。这意味着事务中的所有操作要么全部成功完成,要么全部失败回滚,不会出现只完成部分操作的情况。
    • 如果事务在执行过程中发生错误或被中断,系统将撤销事务中已经执行的所有操作,将数据库状态回滚到事务开始前的状态,以确保数据的一致性和完整性。
  2. 一致性(Consistency)

    • 在事务开始之前和事务结束以后,数据库的完整性没有被破坏。
    • 这意味着事务必须使数据库从一个一致性状态转换到另一个一致性状态。换句话说,事务的执行不会破坏数据的完整性和业务规则。
    • 例如,在一个转账操作中,从一个账户扣除的金额必须等于在另一个账户中添加的金额,以确保账户总金额的一致性。
  3. 隔离性(Isolation)

    • 事务在并发执行时,彼此之间是不可见的,即一个事务的执行不能被其他事务所干扰。
    • 数据库允许多个并发事务同时对其数据进行读写和修改,但隔离性确保了这些操作之间的独立性。一个事务对数据的修改在最终提交之前对其他事务是不可见的。
    • 事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(Read committed)、可重复读(Repeatable read)和串行化(Serializable)。这些级别提供了不同程度的并发控制和数据一致性保证。
  4. 持久性(Durability)

    • 一旦事务被提交,其对数据的修改就是永久性的,即使系统发生故障也不会丢失。
    • 为了确保持久性,DBMS(数据库管理系统)通常会将事务的修改写入到磁盘上的稳定存储介质中,并在系统恢复时重新应用这些修改以恢复数据的一致性状态。

事务的控制语句​​​​​​​

  1. begin transaction 或 start transaction:用于开始一个新的事务。
  2. commit:提交事务。将事务中的所有更改永久地保存到数据库中。
  3. rollback:回滚事务。撤销事务中所做的所有更改,并将数据库恢复到事务开始之前的状态。
  4. savepoint:在事务中设置一个保存点。允许在后续的回滚操作中只撤销到指定的保存点。
  5. rollback to savepoint:将事务回滚到指定的保存点。撤销从上一个保存点(或事务开始)到当前点之间的所有更改。
  6. set transaction:设置事务的属性,如隔离级别、访问模式等。
  7. lock table 和 unlock table:锁定和解锁表。用于在事务中控制对表的并发访问。
  8. set autocommit:设置自动提交模式。当自动提交模式打开时,每个单独的SQL语句都被视为一个单独的事务,并在执行后自动提交,值为1开启自动提交,0关闭自动提交。
  9. set transaction isolation level:设置事务的隔离级别。不同的隔离级别提供了不同程度的并发控制和数据一致性保证

 MySql事务处理主要有两种方法

(1)用BEGIN,ROLLBACKCOMMIT来实现

  1. BEGIN开始一个事务
  2. ROLLBACK事务回滚
  3. COMMIT事务确认

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

  1. SETAUTOCOMMIT=0禁止自动提交
  2. SETAUTOCOMMIT=1开启自动提交

注意:

在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务。

mysql> SET AUTOCOMMIT=0;mysql>use auth; 
mysql>CREATE TABLE kgc_transaction_test( id int(5)) engine=innodb;
mysql>select * from kgc_transaction_test; mysql>begin;     //开始事务 
mysql>insert into kgc_transaction_test value(1); 
mysql> insert into kgc_transaction_test value(2); 
mysql> commit;      //提交事务 
mysql>select * from kgc_transaction_test;mysql>begin;     //开始事务 
mysql>insert into kgc_transaction_test values(3); 
mysql>rollback;     //回滚 
mysql> select * from kgc_transaction_test;     //因为回滚所以数据没有插入

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

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

相关文章

【LeetCode 274】H指数

1. 题目 2. 分析 这题没啥难度,需要熟练运用Python API。 sort(reverseTrue)可以用于排序List,并且倒序排序。 3. 代码 class Solution:def hIndex(self, citations: List[int]) -> int:citations.sort(reverseTrue)res 0for idx,cite in enume…

前端面试题(十)答案版

1. HTTPS 一次会发送几次请求? HTTPS 一次会发送至少 2 次请求: - 第一次是客户端发送 HTTP 请求,服务器返回 HTTP 状态码 301 或 302,要求客户端访问 HTTPS。 - 第二次是客户端根据重定向请求,发送 HTTPS 请求,并完成 SSL/TLS 握手等流程。 2. 一个搜索框,多个页面共用,但每个…

动态规划2

目录 121 买卖股票的最佳时机 打家劫舍 62 不同路径 64 最小路径和 53 最大子数组和 (动归 普通数组部分) 152 乘积最大子数组 300 最长递增子序列 1143 最长公共子序列 72 编辑距离 121 买卖股票的最佳时机 给定一个数组 prices ,…

【C++】 ubuntu下获取屏幕尺寸、分辨率

1. 给/dev/fb0权限 sudo chmod 0777 /dev/fb0 注意:不执行这一条权限,无法获取任何数据 2. 获取屏幕尺寸 int fd; struct fb_var_screeninfo screenInfo; fd open("/dev/fb0",O_RDWR); ioctl(fd,FBIOGET_VSCREENINFO,&screenInfo); pr…

【毛毛虫案例-拖拽 Objective-C语言】

一、这个毛毛虫案例啊,是这个样子的, 1.首先,你这个脑袋,这个蓝色的脑袋,它是可以拽起来的, 下面的红色球,一个一个中心点之间,相互去附着, 其他的红色球,是拖不起来的, 只有这个蓝色的东西,可以拽起来,这个蓝色的View,还有重力, 这个蓝色的View,我在拖动它…

[深度学习] 变分自编码器VAE

变分自编码器(Variational Autoencoders, VAEs)是一种生成模型 Tutorial on Variational Autoencoders,它结合了概率图模型和深度学习,通过学习数据的潜在表示来生成新的数据样本。VAEs在数据生成、异常检测、数据压缩等领域具有广…

如何应对UI测试自动化的不稳定循环!

以下为作者观点: 当我加入UI自动化团队时,我很高兴能为新功能的自动化测试用例开发做出贡献。然而,我很快意识到团队花费了大量时间来修复之前迭代中不稳定的测试。这种情况让我感到困惑,因为当自动化测试脚本已知不稳定时&#…

git使用中 error: pathspec ‘XXX‘ did not match any file(s) known to git 报错解决方法

报错原因 本人在本地开发中,切换线上新创建分支时: $ git checkout master01 error: pathspec master01 did not match any file(s) known to git解决方式 $ git branch -a | grep master * masterremotes/origin/HEAD -> origin/masterremotes/or…

python开发api接口框架

在现代软件开发领域中,API接口框架扮演着非常重要的角色。它可以帮助开发者快速搭建和部署API,提供数据交换的接口,使得不同系统之间可以进行通信和数据传输。Python作为一门功能强大且易于学习的编程语言,被广泛应用于API接口的开…

【Windows 常用工具系列 17 -- windows bat 脚本多参数处理】

请阅读【嵌入式开发学习必备专栏】 文章目录 bat 脚本命令行参数使用示例多参数处理使用示例遍历所有参数 bat 脚本命令行参数 在Windows批处理(.bat)脚本中接收命令行参数是一个常见的需求,这样的脚本能够根据提供的参数执行不同的操作。命…

Kubernetes之Controller详解

本文尝试从Kubernetes Controller的种类、交互逻辑、最佳实践、伪代码示例及历史演进5个方面对其进行详细阐述,希望对您有所帮助! 一、Kubernetes Controller种类 Kubernetes Controller Manager 是 Kubernetes 集群的核心组件之一,负责管理…

身边的故事(十一 ):阿文的故事:红包

虽然是发小,但是小时候的记忆很模糊了,从哪里写起呢?时间节点从大学开始吧,初中的那些有机会后续再写了。 今年回家过年的时候收到阿番要结婚的消息。大年初三阿番就在微信上给我发电子请帖。阿番的女朋友和阿番同居已经有三四年。…

C++ std::array的原理和语法

原理 std::array 是C标准库提供的一个模板类,用于表示固定大小的数组。与传统的C风格数组不同,std::array 提供了更加安全和功能丰富的接口,并且它的大小在编译时就已经确定。std::array 实际上是对传统数组的一个轻量级封装,提供…

无线幅频仪制作(WiFi通信)-含STM32源程序,JAVA上位机与设计报告

资料下载地址:无线幅频仪制作(WiFi通信)-含STM32源程序,JAVA上位机与设计报告 目录 项目功能 1、 系统方案1.1 比较与选择 1.1.1 控制器的论证与选择 1.1.2 信号源的论证与选择 1.1.3 放大器模块的论证与选择 1.1.4 键盘与显示模块的论证与选择 1.1.5 网络通…

[保姆级教程]uniapp小程序获取右上角胶囊位置信息

文章目录 导文使用uni.getMenuButtonBoundingClientRect();方法实现完整案例 隐藏默认导航栏&#xff1a;全局隐藏当前页面隐藏 导文 uniapp小程序获取右上角胶囊位置信息 使用uni.getMenuButtonBoundingClientRect();方法实现 <script>const menuButtonInfo uni.getMe…

logstash配置文件中明文密码加密

1 案例背景 应用配置文件中禁止使用明文密码&#xff0c;需要加密处理 上图中&#xff0c;红框打码位置为es的明文密码&#xff0c;需要对其进行处理 2 创健keystore文件 /rpa/logstash/bin/logstash-keystore --path.settings /rpa/isa/conf/logstash/ create 注&#xff1…

记录正则提取文章

收到了个word版的电子书&#xff0c;需要拆分并转换为md存储到数据库中&#xff0c;便于搜索&#xff0c;记录下用正则提取文章的过程 word原文中有目录&#xff0c;可提取出目录后&#xff0c;在正文中根据目录来正则提取文章 正则的多行匹配 在匹配大量文章的时候&#xff…

互联网时代的语义网知识表示框架---OWL和OWL2 Fragments

文章目录 RDF和RDFSOWL的重要词汇RDF和RDFS 前面介绍了RDF和RDFS,通过RDF (S)可以表示一些简单的语义,但在更复杂的场景下, RDF (S)语义的表达能力显得太弱,还缺少常用的特征: 对于局部值域的属性定义。RDF (S)中通过rdfs:range定义了属性的值域,该值域是全局性的…

llm-universe | 四. 构建RAG应用

构建RAG应用 一.将LLM 接入 LangChain二.构建检索问答链1.加载向量数据库2.创建一个 LLM3.构建检索问答链4.检索问答链效果测试5.添加历史对话的记忆功能5.1 记忆&#xff08;Memory&#xff09;5.2 对话检索链&#xff08;ConversationalRetrievalChain&#xff09; 三. 部署知…

ts可选参数

可选参数 参数后加个问号&#xff0c;代表这个参数是可选的 function bdd(x:number,y?:number){return x y } console.log(bdd(2,3)) function bdd(x:number,y?:number){return x y } console.log(bdd(2))