数据库实践LAB大纲 06 INDEX

限时加码!20+主流AI编程工具免费用 购周边加赠Coding Plan Lite,Claude Code、Cursor等即刻畅享,学习进阶更高效! 阅读详情

索引

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

作用

  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),并判断是否可以插入
数据科学能力通关地图:任务驱动的实战型学习框架 数据科学不是算法堆砌,而是将业务问题精准转化为可计算任务的能力体系。其核心原理在于以真实工作流(数据获取→清洗→建模→解释→部署)倒推知识组织,强调工具使用的边界认知、偏差-方差权衡的思维判断,以及面向业务方的结果翻译能力。这种能力导向的设计,显著提升模型在金融风控、电商推荐等高不确定性场景中的鲁棒性与落地效率,避免‘学完即废’困境。本文聚焦任务流驱动、三层能力金字塔与行业模块化设计,提供可验证、可迁移、可协作的数据科学实战路径。 阅读详情

相关推荐

Python变量作用域与多py文件之间变量传递【实战笔记|Flask项目适用】

本文详解Python变量作用域(LEGB规则)及多文件间变量传递机制,结合Flask项目实战,指出全局变量仅限单文件有效,跨文件需通过import导入。推荐使用配置文件(如config.py)、函数返回值或类实例传递数据,避免循环导入与全局变量滥用。强调函数传参、模块化设计为最佳实践,助力蓝图开发高效稳定。

weixin_42767242的博客 241

RAG Refresher Notebook:Jupyter 中从零跑通 RAG 实战全链路

在人工智能与自然语言处理领域,RAG(检索增强生成)已成为构建企业知识库、智能问答系统的核心技术范式。然而,许多开发者面对文档解析、文本切分、Embedding 向量化、向量检索、Prompt 组装与生成评估这一完整链路时,往往缺乏系统认知。Jupyter Notebook 作为数据科学与机器学习领域最流行的交互式开发工具,天然适合将 RAG 的每个环节透明化、模块化。通过“文档加载 → 文本切分 → 向量化 → 检索召回 → LLM 生成 → 指标评估”的工程实践,开发者可以快速定位知识库回答不准、召回率

weixin_34160277的博客 324

Latex | IEEE双栏排版中长公式的排版

IEEE双栏排版中,有时候公式过于长了,过宽,导致单栏排版不下。

qq_43466146的博客 1万+

数据库】MySQL 与 PostgreSQL 深度详细对比与选型指南

PostgreSQL 16/17 在类型系统、SQL 标准契合度、复杂查询与分析能力上优势明显,尤其适合高完整性要求、半结构化数据处理及复杂报表场景;MySQL 8.x 则在 Web OLTP 领域部署广泛、简单高效。两者均支持 ACID、MVCC 与并行查询,但 PG 在建模表达力、JSONB 操作、物化视图与联邦查询方面更强大。新项目应根据业务复杂度选择:复杂分析选 PG,轻量高并发选 MySQL

关注:https://github.com/Suhan42 329

本地短剧分销源码实战:架构设计、分佣链路与私有化部署全解析

海外场景下常见支付渠道包括 PayPal、Stripe、苹果内购、Google Play 结算以及各类本地钱包,建议抽象出统一 `PayChannel` 接口,每个渠道实现自己的下单、验签、退款三个方法,新增渠道不影响主流程。国际化不要写死文案。**幂等结算**是整套系统的生命线。1. **内容层**:剧集(Drama)、分季/分集(Episode)、播放源(PlaySource)、分类标签、推荐位。3. **交易层**:解锁订单(单集解锁、整剧解锁、会员解锁、积分兑换)、支付流水、退款、对账。

weixin_56812938的博客 250

MySQL 分布式集群系列 · 第四篇——实操部署指南:从零搭建生产级 MySQL NDB 集群

前三篇我们建立了 NDB 的完整认知:它是什么、由什么组成、为什么高性能。但认知终归要落到环境上——这一篇开始动手,从零搭建一套生产级的 NDB 集群。本篇以 5 台 CentOS 7.9 服务器为例(1 管理节点 + 2 数据节点 + 2 SQL 节点),基于 MySQL NDB Cluster 8.0 版本,走完环境准备、安装配置、启动验证、建表测试的全流程。文中所有配置与命令均可直接照抄,建议跟随操作同步验证。

2401_84561124的博客 133

django招聘网站信息爬取与分析系统79704-计算机课程设计、毕业设计

本系统采用B/S架构,前端用Vue.js框架构建用户界面,后端用Django框架进行业务逻辑处理,数据持久层用MySQL数据库。系统核心功能分为三个模块,学生用户包含招聘信息浏览、简历投递、面试通知查看以及基于Spark的数据对比可视化图表功能,企业端实现对岗位发布、简历接收、面试流程的管理,管理员端通过数据大屏集中监管所有招聘岗位、投递记录、通知信息,进行系统数据的综合管理。系统用Python编写的高效爬虫模块定时从目标网站获取招聘数据,保证信息源的实时性、广泛性。

高级程序源的博客 446

【Python量化系统工程化 #02】全市场K线一拉就卡死?增量更新让脚本每次只拉新数据

上次我们把数据存下来了,SQLite / Parquet / CSV 各种爽。然后你加了个定时器—— 加一行 。第一周一切顺利,5000 只股票每天 18 点拉一次、增量落 SQLite、回测一点不卡。然后……根因都指向同一件事:没有"上次拉到哪里了"的状态表,每次脚本都假设自己是从零开始。本文解决的就是这个:让脚本只拉"新数据",不是每次都全量重跑。完整跑一遍「首次全量 → 增量 → 幂等再跑」的真实流程,看实测能从"每次 30 分钟"压到"每次 60 秒"。最朴素的一句话:落到代码上需要两件事:就这么简

2501_94338261的博客 218

GPU视频分析问题清单:环境、参数、验证和排错

本文为仓储物流园区车流量统计与通道拥堵分析提供标准化GPU视频分析平台部署指南,涵盖装卸区、货架区、叉车通道等核心场景。基于“算力与解复用分离”架构,明确硬件配置(如RTX4090/A10、16GB显存)、关键参数(ROI、callback_url)及六阶段交付流程,重点解决RTSP断流、计数误报、延迟高等问题,并提出硬件解码、抽帧优化、TensorRT量化等性能提升策略,确保实时性与低延迟,助力高效运维。

tt120326的博客 326

基于springboot+vue的学生信息管理系统的设计与实现 源码+文档

本文分享基于SpringBoot3+Vue3的高校选课管理系统项目,涵盖管理员、教师、学生多角色功能,实现课程管理、选课审批、成绩录入、考勤登记及通知公告等。技术栈为Vue3、ElementPlus、ECharts、SpringBoot3、MyBatis-Plus、SpringSecurity与MySQL。提供源码、数据库、万字文档、答辩PPT及部署指导,支持定制开发与持续技术答疑。获取方式见置顶链接(点我进入)。

大学生毕设选题 / 源码文档 → 置顶文章名片交流 268

KES-Operator 发布:KES 数据库集群步入 Kubernetes 原生管理时代

KES-Operator 正式发布后,KES 集群可接入 Kubernetes 进行统一管理,部署、状态维护、扩缩容、备份与监控等操作将依托该体系实现。后续,电科金仓将持续完善 KES-Operator 相关能力,满足 KES 在 Kubernetes 环境下更多场景的使用与运维需求。

2301_80350265学无止尽5的博客 1万+

Django入门教程(十一):ORM单表操作实战——增删改查与双下划线模糊查询

ORM 是 Django 操作数据库的核心方式。本文以 Book 模型为例,系统讲解单表数据的添加、查找、删除与修改四大操作,详解 QuerySet 的常用方法与双下划线模糊查询语法,帮你彻底掌握用 Python 代码操作数据库的能力。

Smell_of_earth的博客 240

CREATE INDEX CONCURRENTLY:线上建索引不阻塞 DML 的代价与坑

摘要(148字): PostgreSQL 大表建索引应必用 CREATE INDEX CONCURRENTLY,避免阻塞 DML。其代价为两次全表扫描、耗时更长及额外资源开销,需在低峰期执行。失败后会残留 INVALID 索引,持续消耗更新性能,必须手动 DROP 后重试。禁止在事务块内使用、同表并发构建或对分区表直接操作。牢记“线上建索引,CONCURRENTLY 不能省;失败留 invalid,DROP 重来才算成”。

旺仔爱编程 309

Oracle Undo问题总结(ORA-600 [4xxx] 系列错误)

Oracle Undo问题总结(ORA-600 [4xxx] 系列错误)

oradh的专栏 199

2026年江西省职业院校技能大赛应用软件系统开发赛项(中职组)资料指导来啦

江西2026应用软件系统开发赛项(中职组)

职业院校技能大赛资料 278

Collections常用方法(速查笔记)

Java Collections 是 java.util 包中的核心工具类,掌握高频用法可高效应对开发需求。常用包括:创建不可变集合(如 singletonList、emptySet)、包装只读或线程安全集合(如 unmodifiableList、synchronizedMap),以及排序、反转、打乱、二分查找等操作。注意:sort、reverse 等方法会修改原列表,使用时需谨慎,必要时先拷贝。建议结合官方 Javadoc 查阅方法摘要,提升编码效率与安全性。

qq_38980678的博客 344

数据库里的“雪花ID”是什么暗号?一文搞懂分布式主键!

所以,下次再看到 ER 图里的bigint id PK "雪花ID",你就知道:这其实是开发者为了应对高并发、分布式架构,给数据表安排的一个高性能、全局唯一的“身份证号”。它不是暗号,而是现代后端开发的“标配神器”。

sevenez的专栏 108

Redis 常用命令大全:11 大类命令速查手册

本文整理Redis常用11大类命令,涵盖连接、key管理、字符串、Hash、List、Set、ZSet、发布订阅、事务、脚本及服务器管理,以速查表形式呈现,支持快速检索。重点包括:SET/GET缓存、INCR计数器、HSET结构化存储、LPUSH队列、SADD去重、ZADD排行榜、PUBLISH消息广播、MULTI事务、EVAL脚本及INFO监控等核心操作,助力运维高效排查与开发调试。

fly0512的博客 195

高并发系统怎么设计?从四个场景找到真正的瓶颈

同样是电商系统,商品详情在重复读取,购物车在频繁修改,下单支付在争用库存,订单导出在长时间占用资源。本文沿着这些熟悉的场景,如何识别系统瓶颈、选择方案

新林的博客 343

一套自建交付的系统,七个核验点分别能到哪一步

交付一套自己这边部署的系统,验收时该看什么,往往比怎么装更花时间。装的部分有安装文档可依,核的部分常常没有清单。下面这七个核验点,是按“能不能当场看到”来排的,每一点尽量落成一个具体动作,而不是一句结论。

2601_96810189的博客 460
上一篇: 数据库实践LAB大纲 05 JDBC 连接
下一篇: 2022FALL嵌入式大纲
JamSlade
博客等级 码龄6年 1万+粉丝 403原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值