数据库实践LAB大纲 06 INDEX

news2024/12/24 11:29:40

索引

索引是一个列表 —— 若干列集合和这些的记录在数据表存储位置的物理地址

作用

  1. 加快检索速度
  2. 唯一性索引 —— 保障数据唯一性
  3. 加速表的连接
  4. 分组和排序进行检索的时候 —— 减少时间消耗

一般建立原则

  1. 经常查询的数据
  2. 主键
  3. 外键
  4. 连接字段
  5. 排序字段
  6. 少涉及、重复值多的字段不建立索引

MySQL中 InnoDB存储引擎支持索引

nameuse
普通索引 INDEX值可空,没有唯一性限制
唯一值索引 UNIQUE值可空,但唯一
主键索引 PRIMARY KEY一个表只能由一个PK, 系统自动创建
全文索引 FULLTEXT在 varchar、char、text 类型的列上创建,便于查询字符串类型

物理存储区分:

  • 聚集索引
  • 非聚集索引

创建 修改 删除 显示

CREATE INDEX

CREATE [UNIQUE | FULLTEXT | SPATIAL] INDEX 索引名[索引类型]
on 表名(索引列名)
[索引选项]
索引列名 =:
列名[(长度)][ASC|DESC]
  • SPATIAL表示为空间索引
  • 索引类型:BTREE或HASH
  • 列名
    • CHAR,VARCHAR, length可以小于字段实际长度 —— 减少索引文件
    • BLOB和TEXT类型,必须指定 length
    • 可包含属于同一个表的多个列,用逗号分开 —— 复合索引
  • 没有PK索引

在这里插入图片描述

ALTER TABLE语句可以修改表定义,包括向表中添加索引
ALTER TABLE tbl_name ADD PRIMARY KEY | UNIQUE | INDEX | FULLTEXT (column_list)

删除

DROP INDEX 索引名 ON 表名

Alter TABLE 表名 ... 
DROP PRIMARYKEY 
| DROP {INDEX | KEY} 索引名 
| DROP FOREIGN KEY 外键名

显示

SHOW INDEXES FROM tbl_name;
SHOW INDEXES FROM tbl_name IN db_name;
# *INDEX和KEY是INDEXES同义词

返回

nameuse
table表的名称
NON_UNIQUE如果索引可以包含重复项,则为1;如果可以,则为0。
KEY_NAME索引的名称。主键索引始终具有PRIMARY名称。
seq_in_index索引中的列序列号。第一列序列号从1开始。
column_name列名称。
collation排序规则表示列在索引中的排序方式。A表示升序;B表示降序;NULL表示未分类。
cardinality基数返回索引中估计的唯一值数。请注意,基数越高 —— 查询优化器使用索引进行查找的可能性就越大。
sub_part索引前缀。如果对整个列编制索引,则为null。否则,它会显示部分索引列的索引字符数
packed表示密钥是如何打包的。
nullYES——如果列可能包含NULL值,如果不包含空值则为空
INDEX_TYPE表示使用诸如索引方法BTREE,HASH,RTREE,或FULLTEXT。
comment有关索引的信息未在其自己的列中描述
index_comment显示使用COMMENT属性创建索引时指定的索引的注释。
¤visible索引是否对查询优化器可见或不可见; YES 是,NO 不是。
expression如果索引使用表达式而不是列或列前缀值,则表达式指示键部分的表达式,并且column_name列也为NULL

索引的使用情况

建议使用

  1. 唯一性的限制,比如用户名
  2. 频繁用WHERE查询字段
  3. GROUP BY和ORDER BY的列
  4. UPDATE、DELETE的WHERE条件列(类似2)
  5. DISTINCT字段需要创建索引

不建议使用

  1. WHERE GROUPBY ORDERBY 未出现的字段
  2. 记录较少的表 < 1000个
  3. 大量重复数据(比重偏差小
  4. 频繁更新的字段 (字段频繁更新导致索引更新效率慢)

失效

  1. 对索引进行 表达式计算
  2. 使用函数
  3. 使用LIKE且前缀为%

注意

  1. 多表JOIN连接操作时
  • 连接表尽量不超3张
  • 对WHERE条件创造index
  • 于连接的字段创建索引,并且该字段在多张表中的类型必须一致
  1. 索引列尽量设置为 NOT NULL 约束
  2. 使用联合索引的时候要注意最左原则
  • 从左到右的使用索引中的字段
  • 一条 SQL 语句可以只使用联合索引的一部分,但要从最左侧开始,否则失效
  • 当遇到范围查询(>、<、between、like)就会停止匹配

最左匹配原则
在这里插入图片描述

EXPAIN

nameuse
¤ id选择标识符
¤ select_type表示查询的类型
¤ table输出结果集的表
¤ partitions匹配的分区
¤ type访问类型,常用的有: ALL、index、range、 ref、eq_ref、const、system、NULL(从左到右,性能从差到好)
¤ possible_keys表示查询时,可能使用的索引,为NULL表示没有相关索引
¤ key表示实际使用的索引,如果为NULL表示没有选择索引
¤ key_len索引字段的长度,不损失精确性的情况下,长度越短越好
¤ ref列与索引的比较
¤ rows扫描出的行数(估算的行数)
¤ filtered按表条件过滤的行百分比
¤ Extra执行情况的描述和说明

事务管理

MySQL 4.1开始支持事务,事务由作为一个单独单元的一个或多个SQL语句组成。

  • 这个单元中的每个SQL语句是互相依赖的,而且单元作为一个整体是不可分割的
  • 不能完成,整个单元就会回滚
  • 事务中的所有语句都成功的执行这个事务才被成功地执行

提交

当一个会话开始时,系统变量AUTOCOMMIT值为1,即自动提交功能是打开的

任意一条SQL语句发送到服务器时,MySQL服务器会立即解析、执行并将更新结果提交到数据库文件中

在执行事务时要首先关闭MySQL的自动提交,使用命令“set autocommit=0;”可以关闭MySQL的自动提交

  • 当MySQL关闭自动提交后,可以使用COMMIT命令来完成事务的提交,也标志transaction的结束
  • 使用命令“start transaction;”可以开启一个事务 —— 隐式关闭MySQL的提交

注意

  1. transaction不能嵌套 —— 开始第二个事务会自动提交第一个事务
  2. 下面语句会隐式执行commit
  • set autocommit=1、rename table、truncate table;
  • create、alter、drop;
  • grant、revoke、set password、create user、drop user、rename user
  • lock tables、unlock tables

example

set autocommit=0;
insert into account values(111,500);
commit;
insert into account values(222,500);
create table student(
studentid char(6) primary key,
name varchar(10),
sex char(2)
)engine=innodb;
insert into account values(333,500);
select * from account;

在上面SQL语句执行过程中

  1. 首先使用命令“set autocommit=0;”关闭
    MySQL的自动提交。
  2. 插入第一条记录后,使用commit命令完成事务的提交。
  3. 当插入第二条记录后,使用create命令创建数据表,由于create命令在执行时会隐式地执行commit命令,所以插入的第二条记录也会被提交。
  4. 当插入完第三条记录时,使用select语句查询到的是内存中的记录,所以查询结果可以看到新添加的三条记录。
  • 由于最后一条语句并没有提交,所以该值并没有写到数据库文件中。另一客户机执行查询时,看到的是外存数据库文件在服务器内存中的一个副本,所以只查询到两条添加记录
  • 当前客户机使用commit命令提交事务后,两个客户机看到的查询结果是相同的

回滚

销未提交的事务所做的各种修改操作,并结束当前这个事务

若只撤销一部分,可以用“部分回滚”

  • savepoint 保存点名;”可以在事务中设置一个保存点,使用“rollback to savepoint 保存点名;”可以将事务回滚到保存点状态

四大特性和隔离级别

四大特性

  • 事务是一个单独的逻辑工作单元,事务中的所有更新操作要么都执行,要么都不执行。
  • 事务保证了一系列更新操作的原子性。如果事务与事务之间存在并发操作,则可以通过事务之间的隔离级别来实现事务的隔离,从而保证事务间数据的并发访问。

ACID
ATOMICITY CONSISTENCY ISOLATION DURABILITY

  1. 原子性意味着每个事务都必须被认为是一个不可分割的单元,事务中的操作必须同时成功事务才是成功的。如果事务中的任何一个操作失败,则前面执行的操作都将回滚,以保证数据的整体性没有受到影响
  2. 事务的一致性保证了事务完成后,数据库能够处于一致性状态。如果事务执行过程中出现错误,那么数据库中的所有变化将自动地回滚,回滚到另一种一致性状态
  • 由MySQL的日志机制处理,它记录了数据库的所有变化,为事务恢复提供了跟踪记录
  • 如果系统在事务处理中发生错误,MySQL恢复过程将使用这些日志来发现事务是否已经完全成功地执行,是否需要返回
  1. 事务的隔离性确保多个事务并发访问数据时,各个事务不能相互干扰; 的每个事务在自己的空间执行,并且事务的执行结果只有在事务执行完才能看到 —— 其他事务暂时看不到结果 (可以使用页级锁定或行级锁定来隔离)
  2. 事务的持久性意味着事务一旦提交,其改变会永久生效,不能再被撤销。 —— 即使系统崩溃,一个提交的事务仍然存在

隔离级别

从低到高分别是

read uncommitted(读取未提交的数据)

read committed(读取提交的数据)

repeatable read(可重复读)

serializable(串行化)。

  1. read uncommitted(读取未提交的数据)提供了事务之间的最小隔离程度,处于这个隔离级别的事务可以读到其他事务还没有提交的数据
  2. read committed(读取提交的数据)处于这一级别的事务可以看见已经提交事务所做的改变
  3. repeatable read(可重复读)这是MySQL默认的事务隔离级别,它确保在同一事务内相同的查询语句其执行结果总是相同的(即使某个事务突然改了某个数据而且事务还没结束,前后查询的内容还是一样的)
  4. serializable(串行化) 最高级别的隔离,它强制事务排序,使事务一个接一个地顺序执行

解决多用户问题

用户对数据库并发访问时,为了确保事务完整性和数据库一致性,需要使用锁定 —— 防止用户读取正在由其他用户更改的数据,并可以防止多个用户同时更改相同数据

  • 高级别的事务隔离 —— 有效地实现并发,但会降低事务并发访问的性能

  • 低级别的事务隔离可以提高事务的并发访问性能,但可能导致并发事务中的脏读、不可重复读和幻读等问题

三个问题:

脏读不可重复读幻读
read uncommitted
read committed×
repeatable read××
serializable×××

脏读

一个事务可以读到另一个事务未提交的数据

  1. 打开MySQL客户机A,将当前MySQL会话的事务隔离级别设置为read uncommitted。
    set session transaction isolation level read uncommitted
  2. 开启事务,查询账号为“111”账户的余额。
  3. 打开MySQL客户机B,将当前MySQL会话的事务隔离级别设置为read uncommitted。
  4. 开启事务,将账号为“111”账户余额增加800。
  5. 在MySQL客户机A中查看账号为“111”账户的余额。
  6. 关闭MySQL客户机A和客户机B后,再查看账号为“111”账户的余额。

这个时候 A 读到了B未结束事务但已更新的结果(也就是加了 800)

不可重复读

同一个事务中,两条相同的查询语句其查询结果不一致

  • 一个事务访问数据时,另一个事务对该数据进行修改并提交,导致第一个事务两次读到的数据不一样
  1. 将MySQL客户机A与客户机B使用语句“set session transaction isolation level read committed;”,将他们的隔离级别都设置为read committed。
  2. 与例6-5相同,首先在MySQL客户机A中查询账号为“111”账户的余额。
  3. 在MySQL客户机B中将账号为“111”账户余额增加800,未提交事务时在MySQL客户机A中查询账号为“111”账户的余额,对比是否出现脏读。
  4. MySQL客户机B中提交事务后,在MySQL客户机A中查询账号为“111”账户的余额,对比是否出现不可重复读。

A读到的数据是B事务提交后的数据

幻读

当前事务读不到其他事务已经提交的修改(别人已经改了而且提交事务了,而你的读的内容还是修改之前的)

  1. 将MySQL客户机A与客户机B使用语句“set session transaction isolation level repeatable read;”,将他们的隔离级别都设置为repeatable read。
  2. 在MySQL客户机A中开启事务并查询账号为“999”的账户信息。
  3. 在MySQL客户机B中开启事务,插入一条账户信息(999,700),然后提交事务。
  4. 在MySQL客户机A中再次查账号为“999”的账户信息,判断是否可以避免不可重复读。
  5. 在MySQL客户机A中插入账户信息(999,700),并判断是否可以插入

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

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

相关文章

分享114个JS菜单导航,总有一款适合您

分享114个JS菜单导航&#xff0c;总有一款适合您 114个JS菜单导航下载链接&#xff1a;https://pan.baidu.com/s/1t4_v0PipMjw3ULTLqkEiDQ?pwdgoi2 提取码&#xff1a;goi2 Python采集代码下载链接&#xff1a;https://wwgn.lanzoul.com/iKGwb0kye3wj $.ajax({type: &quo…

“万字“ Java I/O流讲解

Java I/O流讲解 每博一文案 谁让你读了这么多书&#xff0c;又知道了双水村以外还有一个大世界&#xff0c;如果从小你就在这个天地里&#xff0c;日出而作&#xff0c;日落而息。 那你现在就会和众乡亲抱同一理想&#xff1a;经过几年的辛劳&#xff0c;像大哥一样娶个满意的…

2023年中国各大城市薪酬报告出炉

全国地区&#xff1a;https://download.csdn.net/download/std86021/87322224北京&#xff1a;https://download.csdn.net/download/std86021/87273488上海&#xff1a;https://download.csdn.net/download/std86021/87322226广州&#xff1a;https://download.csdn.net/downlo…

Linux之文本搜索命令

文本搜索命令学习目标能够知道文本搜索使用的命令1. grep命令的使用命令说明grep文本搜索grep命令效果图:2. grep命令选项的使用命令选项说明-i忽略大小写-n显示匹配行号-v显示不包含匹配文本的所有行-i命令选项效果图:-n命令选项效果图:-v命令选项效果图:3. grep命令结合正则表…

linux基本功系列之hostname实战

文章目录前言一. hostname命令介绍二. 语法格式及常用选项三. 参考案例3.1 显示本机的主机名3.2 临时修改主机名3.3 显示短格式的主机名3.4 显示主机的ip地址四. 永久修改主机名4.1 centos6 修改主机名的方式4.2 centos7中修改主机名永久生效总结前言 大家好&#xff0c;又见面…

Java、JSP企业快信系统的设计与实现

技术&#xff1a;Java、JSP等摘要&#xff1a;计算机网络的出现到现在已经经历了翻天覆地的重大改变。因特网也从最早的供科学家交流心得的简单的文本浏览器发展成为了商务和信息的中心。到了今天&#xff0c;互联网已经成为了大量应用的首选平台&#xff0c;人们已经渐渐习惯了…

02- 天池工业蒸汽量项目实战 (项目二)

忽略警告: warnings.filterwarnings("ignore") import warnings warnings.filterwarnings("ignore") 读取文件格式: pd.read_csv(train_data_file, sep\t) # 注意sep 是 , , 还是\ttrain_data.info() # 查看是否存在空数据及数据类型train_data.desc…

线程池框架

这是之前有做的一个可以接受用户传入任意类型的任务函数和任意参数&#xff0c;并且能拿到任务对应返回值的一个线程池框架&#xff0c;可以链接成动态库&#xff0c;用在相关项目里面。一共实现了两版&#xff0c;都是支持fixed和cached模式的&#xff0c;半同步半异步的&…

全局向量的词嵌入(GloVe)

诸如词-词共现计数的全局语料库统计可以来解释跳元模型。 交叉熵损失可能不是衡量两种概率分布差异的好选择&#xff0c;特别是对于大型语料库。GloVe使用平方损失来拟合预先计算的全局语料库统计数据。 对于GloVe中的任意词&#xff0c;中心词向量和上下文词向量在数学上是等…

分享113个JS菜单导航,总有一款适合您

分享113个JS菜单导航&#xff0c;总有一款适合您 113个JS菜单导航下载链接&#xff1a;https://pan.baidu.com/s/1d4nnh-UAxNnSp9kfMBmPAw?pwdcw23 提取码&#xff1a;cw23 Python采集代码下载链接&#xff1a;https://wwgn.lanzoul.com/iKGwb0kye3wj base_url "http…

MySQL 4:MySQL函数

为了提高代码的复用性和隐藏实现细节&#xff0c;MySQL提供了很多函数。函数可以理解为别人封装好的模板代码。 在MySQL中&#xff0c;函数有很多&#xff0c;主要可以分为以下几类&#xff1a;聚合函数、数学函数、字符串函数、日期函数、控制流函数、窗口函数。 一、聚合函…

研一寒假C++复习笔记--深拷贝和浅拷贝代码实例

目录 1--深拷贝和浅拷贝的基础概念 2--浅拷贝的代码实例 3--深拷贝代码实例 4--参考 1--深拷贝和浅拷贝的基础概念 ① 浅拷贝&#xff1a;简单的赋值拷贝操作&#xff1b; ② 深拷贝&#xff1a;在堆区重新申请空间&#xff0c;进行拷贝操作&#xff1b; 2--浅拷贝的代码…

CUDA中的统一内存

文章目录1. Unified Memory Introduction1.1. System Requirements1.2. Simplifying GPU Programming1.3. Data Migration and Coherency1.4. GPU Memory Oversubscription1.5. Multi-GPU1.6. System Allocator1.7. Hardware Coherency1.8. Access Counters2. Programming Mode…

格子玻尔兹曼法介绍

1 LBM简介格子玻尔兹曼法&#xff08;Lattice Boltzmann Method&#xff09;简称LBM&#xff0c;是一种CFD算法&#xff0c;可求解流动、传热等常见CFD问题。LBM基于格子玻尔兹曼方程&#xff08;LBE&#xff09;&#xff0c;从介观尺度&#xff08;mesoscope&#xff09;描述了…

Android Jetpack组件之WorkManager后台任务管理的介绍与使用(二)

一、介绍 通过上一篇文&#xff0c;Android Jetpack组件之WorkManager后台任务管理的介绍与使用(一)_蜗牛、Z的博客-CSDN博客 我们可以弄清楚workmanager从接入到使用的基本流程。基本可以满足我们日常。那只是简单的入门。如果遇到更复杂的功能&#xff0c;那简单的就无法满…

集中供热调度系统天然气仪表内网仪表图像识别案例

一、项目需求 出于能耗采集与冬季集中供暖工作的节能和能耗分析需要&#xff0c;要采集现场的6块天然气表计&#xff0c;并存储进入客户的mySQL数据库中&#xff0c;现场采集的表计不允许接线&#xff0c;且网络环境为内网环境&#xff0c;需要采集表计数据并存入数据库&#…

Java笔记-泛型的使用

参考&#xff1a; Java 泛型&#xff0c;你了解类型擦除吗&#xff1f; 泛型的使用 1、泛型的定义 可以广泛使用的类型&#xff0c;一种较为准确的说法就是为了参数化类型&#xff0c;或者说可以将类型当作参数传递给一个类或者是方法。 2、泛型的使用 2.1泛型类 public c…

FreeRTOS信号量 | FreeRTOS十

目录 说明&#xff1a; 一、信号量 1.1、信号量简介 1.2、信号量特点 二、二值信号量 2.1、二值信号量简介 2.2、获取与释放二值信号量函数 2.3、二值信号量使用过程与相关API函数 2.4、创建二值信号量函数了解 2.5、释放二值信号量了解 2.6、获取二值信号量了解 三…

Python语言零基础入门教程(十三)

Python 字典(Dictionary) 字典是另一种可变容器模型&#xff0c;且可存储任意类型对象。 字典的每个键值 key:value 对用冒号 : 分割&#xff0c;每个键值对之间用逗号 , 分割&#xff0c;整个字典包括在花括号 {} 中 ,格式如下所示&#xff1a; d {key1 : value1, key2 : …

企业进存销管理系统

技术&#xff1a;Java、JSP等摘要&#xff1a;随着当今世界计算机技术的飞速发展&#xff0c;计算机在企业管理中应用的普及&#xff0c;利用计算机实现企业进销存管理势在必行。本系统结合公司实际的进销存制度&#xff0c;通过对本公司的供应商、客户、商品、进货、销售、进销…