当前位置: 首页 > news >正文

MySQL索引,存储引擎,并发控制和事务

目录

一. 存储引擎

1.1 定义 

1.2 常用的存储引擎

1.3 语句

二. 索引

2.1 定义

2.2 优缺点

2.3 索引的结构

2.4索引的类型

1. 普通索引

2. 唯一索引 unique

3. 主键索引 primary key

4. 全文索引 fulltext

2.5 语句

三. 事务

3.1 事务的定义

3.2 事务的ACID特性

3.3 事务的并发

3.4 并发控制机制锁

1. 锁的概念

2. 锁的分类

3.5 事务的隔离级别

3.6 事务控制语句

3.7 事务相关命令

四. explain工具和profile工具

4.1 explain工具

4.2 profile工具


一. 存储引擎

1.1 定义 

MySQL中的数据用各种不同的技术存储在文件(或者内存)中。这些技术中的每一种技术都使用不同的存储机制、索引技巧、锁定水平并且最终提供广泛的不同的功能和能力,此种技术称为存储引擎。

1.2 常用的存储引擎

MySQL 支持多种存储引擎其中目前应用最广泛的是InnoDB和MyISAM两种。

1. InnoDB

特点

  1. MySQL 5.5.5后的默认存储引擎
  2. 支持事务(ACID)
  3. 行级锁定
  4. 支持外键约束
  5. 支持崩溃恢复
  6. 实现了四种隔离级别
  7. 使用MVCC(多版本并发控制)
  8. 存储上限64G
  9. 支持数据缓存

适用场景:需要事务支持的应用,高并发系统,需要外键约束的数据库设计,企业级应用和大多数Web应用

2. MyISAM

特点

  1. MySQL 5.5.5之前的默认引擎
  2. 不支持事务
  3. 表级锁定
  4. 全文索引支持
  5. 较高的插入和查询速度
  6. 较低的空间和内存占用
  7. 存储上限256G

适用场景:读密集型应用,不需要事务支持的应用,全文检索,日志系统和数据仓库

1.3 语句

1.查看支持的存储引擎
SHOW ENGINES;2.查看表的存储引擎
#方法一:
SHOW TABLE STATUS FROM 数据库名 WHERE Name = '表名';
#方法二:
USE 数据库名;
SHOW CREATE TABLE 表名;3.修改表的存储引擎
#方法一:
USE 数据库名;
ALTER TABLE 表名 ENGINE=搜索引擎;
#方法二:
vim /etc/my.cnf
......
[mysqld]
......
default-storage-engine=搜索引擎systemctl restart mysqld4.创建表时指定存储引擎
CREATE TABLE 表名(
字段1 数据类型,...
) ENGINE=搜索引擎;

 

 

二. 索引

2.1 定义

索引类似于书籍的目录,它通过建立特定的数据结构,帮助数据库快速定位到所需的数据行;索引通过存储引擎实现。

2.2 优缺点

优点:

  • 索引可以降低服务需要扫描的数据量,减少了IO次数

  • 索引可以帮助服务器避免排序和使用临时表

  • 加快查询速度,提高数据库性能

缺点: 

  •  占用额外空间,影响插入速度

2.3 索引的结构

 因为索引通过存储引擎实现,而常见的搜索引擎是InnoDB引擎和MyISAM引擎。

B+Tree(最常见)

大多数关系型数据库(如MySQL、Oracle、PostgreSQL等)使用的是B+Tree:

  • B+Tree:MySQL的InnoDB和大多数现代数据库的首选索引结构
    • 树的高度通常在2-4层,即使对于大型数据库也能保持较低的查询复杂度
    • 叶子节点通过链表相连,支持范围查询
    • 非叶子节点只存储键值和指针
    • 所有数据记录都存储在叶子节点
假设定义一颗B+树高度为2,即一个根节点和若干叶子节点。那么这棵B+树的存放总行记录数=根节点指针数*
单个叶子记录的行数。这里先计算叶子节点,B+树中的单个叶子节点的大小为16K,假设每一条目为1K,那么
记录数即为16(16k/1K=16),然后计算非叶子节点能够存放多少个指针,假设主键ID为bigint类型,那么长
度为8字节,而指针大小在InnoDB中是设置为6个字节,这样加起来一共是14个字节。那么通过页大小/(主键
ID大小+指针大小),即16384/14=1170个指针,所以一颗高度为2的B+树能存放16*1170=18720条这样的
记录。根据这个原理就可以算出一颗高度为3的B+树可以存放16*1170*1170=21902400条记录。所以在
InnoDB中B+树高度一般为2-3层,它就能满足千万级的数据存储

2.4索引的类型

  1. B+ TREE、HASH(精确数据查找)、R TREE(地理位置)、FULL TEXT(全文搜索)

  2. 聚簇(集)索引、非聚簇索引:数据和索引是否存储在一起

  3. 主键索引、二级(辅助)索引

  4. 稠密索引、稀疏索引:是否索引了每一个数据项

  5. 简单索引、组合索引: 是否是多个字段的索引

  6. 左前缀索引:取前面的字符做索引

  7. 覆盖索引:从索引中即可取出要查询的数据,性能高

1. 普通索引

最基本的索引类型

create index 索引名 on 表名 (字段); 
#索引名建议以“_index”结尾alter table 表名 add index 索引名 (字段);
#将原有索引修改为普通索引#创建表时定义索引
CREATE TABLE 表名 (字段1 数据类型[,...],INDEX 索引名 (列名));#例如
create index index_name on testlog(name);alter taable students add index index_name (StuID);

 

2. 唯一索引 unique

与普通索引类似,但区别是唯一索引列的每个值都唯一;唯一索引允许有空值。

#创建唯一索引
create unique index 索引名 on 表名 (字段); #将原有索引修改为唯一索引
alter table 表名 add unique 索引名 (字段);#创建表时定义唯一索引
CREATE TABLE 表名 (字段1 数据类型[,...],UNIQUE INDEX 索引名 (列名));#举例
create unique index idd_naem on students(name);alter table students add unique idd_name (name);

3. 主键索引 primary key

主键索引是一种特殊的唯一索引,必须指定为“PRIMARY KEY”;一个表只能有一个主键,不允许有空值,并且添加主键将自动创建主键索引。

#创建表时建立主键索引
create table 表名 ([...],primary key (列名));#将原有索引修改为主键索引
alter table 表名 add primary key (字段);#举例
create table test2 (id int,pid int,primary key(id));alter table test add primary key(id);

4. 全文索引 fulltext

create fulltext index 索引名 on 表名 (字段);  alter table 表名 add fulltext 索引名 (字段);#创建表的时候创建全文索引
create table 表名 (字段1 数据类型[,...],fulltext 索引名 (列名));
#数据类型可以为 char、varchar 或者 text#使用全文索引查询
select * from 表名 where match(列名) against('查询内容');

2.5 语句

1. 查看索引
show create table 表名;
show index from 表名;
show keys from 表名;

各字段的含义如下

字段含义
Table表的名称
Non_unique如果索引不能包括重复词,则为 0;如果可以,则为 1
Key_name索引的名称
Seq_in_index索引中的列序号,从 1 开始
Column_name列名称
Collation列以什么方式存储在索引中。在 MySQL 中,有值‘A’(升序)或 NULL(无分类)
Cardinality索引中唯一值数目的估计值
Sub_part如果列只是被部分地编入索引,则为被编入索引的字符的数目。如果整列被编入索引,则为 NULL
Packed指示关键字如何被压缩。如果没有被压缩,则为 NULL
Null如果列含有 NULL,则含有 YES。如果没有,则该列含有 NO
Index_type用过的索引方法(BTREE, FULLTEXT, HASH, RTREE)
Comment备注
2.删除索引
drop index 索引名 on 表名;#如果是主键索引
alter table 表名 drop primary key;

三. 事务

3.1 事务的定义

MySQL中的事务(Transaction)是数据库操作的基本单位,它确保一组操作要么全部成功,要么全部失败,以维护数据的一致性和完整性。

3.2 事务的ACID特性

在可靠数据库管理系统(DBMS)中,事务(transaction)应该具有的四个特性:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。 

  1. 原子性(Atomicity):事务中的所有操作要么全部完成,要么全部不完成,不会出现部分完成的情况。
  2. 一致性(Consistency):事务执行前后,数据库的状态必须保持一致。
  3. 隔离性(Isolation):多个事务并发执行时,一个事务的操作不会影响其他事务。
  4. 持久性(Durability):事务一旦提交,其结果就是永久性的,即使系统故障也不会丢失。

3.3 事务的并发

在数据库系统中,当多个事务并发执行时,如果没有适当的控制机制,会导致以下四种典型问题:

1. 脏读

当一个事务读取了另一个未提交事务修改过的数据时,就会发生脏读。

示例

  • 事务A修改了一行数据但还未commit提交

  • 事务B读取了这行被修改的数据

  • 如果事务A回滚,则事务B读取到的数据是无效的

2. 不可重复读

当同一个事务内多次读取同一数据,但由于其他事务在这期间对数据进行了修改并提交,导致两次读取的结果不同。

示例

假如事务A读取了一行数据,如果事务B修改了这行数据并提交,那么事务A再次读取同一行数据,发现数据已变化。

3. 幻读

当一个事务在读取某个范围内的记录时,另一个事务在该范围内插入了新记录,当第一个事务再次读取该范围的记录时,会发现有新的"幻影"记录。

示例

  • 事务A查询满足某条件的所有行(如age > 20的用户)

  • 事务B插入了一条满足该条件的新记录并提交

  • 事务A再次执行相同的查询,发现多了一条记录

4. 丢失更新

当两个或多个事务选择同一行数据并基于最初选定的值更新该行时,由于每个事务都不知道其他事务的存在,最后的更新覆盖了其他事务所做的更新,导致数据更新丢失。

示例

  • 事务A读取一行数据(如余额=100)

  • 事务B也读取同一行数据(余额=100)

  • 事务A将余额更新为120并提交

  • 事务B将余额更新为110并提交

  • 最终余额变为110,事务A的更新被丢失

3.4 并发控制机制锁

1. 锁的概念

锁是数据库管理系统用于实现并发控制的一种机制,通过锁可以防止多个事务同时修改同一数据而导致的数据不一致问题。

2. 锁的分类

  1. 读锁:也称为共享锁,S锁;只读不可写(包括当前事务),多个读互不阻塞只能读不能写,别人也能看。
  2. 写锁:独占锁,排它锁,也称为 X 锁,写锁会阻塞其它事务(不包括当前事务)的读和写,写锁别人看都看不了。

S(读)锁和S(读)锁是兼容的,X(写)锁和其它锁都不兼容

死锁:死锁是并发控制中的一种严重问题,具体表现为两个或多个事务在同一资源相互占用,并请求锁定对方占用的资源的状态。

3.5 事务的隔离级别

数据库系统通过实现不同的隔离级别来解决事务并发的问题。

SQL标准定义了四种隔离级别 

隔离级别脏读不可重复读幻读性能影响默认使用的数据库
读未提交 允许 允许 允许最小几乎不作为默认
读已提交 防止 允许 允许较小Oracle<br>SQL Server<br>PostgreSQL
可重复读 防止 防止 允许中等MySQL (InnoDB)
串行化 防止 防止 防止最大几乎不作为默认

事务隔离级别的作用范围分为两种:
● 全局级:对所有的会话有效
● 会话级:只对当前的会话有效 

3.6 事务控制语句

#显式地开启一个事务
begin;#提交事务,并使已对数据库进行的所有修改变为永久性的。
commit;#回滚
#回滚会结束用户的事务,并撤销正在进行的所有未提交的修改。
rollback;#创建回滚点,相当于存档
#一个事务中可以有多个 
#XX代表回滚点名称。
savepoint XX ;#把事务回滚到标记点,相当于读档
rollback to XX;
#禁止自动提交
SET AUTOCOMMIT=0;#开启自动提交,Mysql默认为1
SET AUTOCOMMIT=1;#查看Mysql中的AUTOCOMMIT值					
SHOW VARIABLES LIKE 'AUTOCOMMIT';

3.7 事务相关命令

#查询当前会话的隔离级别
SELECT @@transaction_isolation;
SELECT @@tx_isolation; 
或
SHOW SESSION VARIABLES LIKE 'transaction_isolation';
SHOW SESSION VARIABLES LIKE 'tx_isolation';#查询全局隔离级别
SELECT @@global.transaction_isolation;
SELECT @@global.tx_isolation;
或
SHOW GLOBAL VARIABLES LIKE 'transaction_isolation';
SHOW GLOBAL VARIABLES LIKE 'tx_isolation';#transaction_isolation,%isolation%和tx_isolation的区别
变量名	                MySQL 版本	
tx_isolation	        5.7 及更早版本	
transaction_isolation	8.0 及更新版本
isolation               在不确定版本时

设置全局隔离级别
SET GLOBAL TRANSACTION ISOLATION LEVEL  隔离级别名称;设置当前会话隔离级别
SET SESSION TRANSACTION ISOLATION LEVEL  隔离级别名称;隔离级别名称有四种选择:
READ UNCOMMITTED (读未提交)
READ COMMITTED (读已提交)
REPEATABLE READ (可重复读,MySQL默认级别)
SERIALIZABLE (串行化)#持久化设置,即要使设置在MySQL重启后仍然有效,需修改配置文件my.cnf
vim /etc/my.cnf[mysqld]
transaction-isolation = isolation_levelsystemctl restart mysqld

四. explain工具和profile工具

都是MySQL中用于分析查询执行计划的强大工具

4.1 explain工具

#语法
explain select clause#例子
explain select * from students where stuid=20;

列名说明
id执行编号,标识select所属的行。如果在语句中没子查询或关联查询,只有唯一的select,每行都将显示1。否则,内层的select语句一般会顺序编号,对应于其在原始语句中的位置
select_type简单查询:SIMPLE|复杂查询:PRIMARY(最外面的SELECT)、DERIVED(用于FROM中的子查询)、UNION(UNION语句的第一个之后的SELECT语句)、UNIONRESUlT(匿名临时表)、SUBQUERY(简单子查询)
table访问引用哪个表(引用某个查询,如“derived3”)
type关联类型或访问类型,即MySQL决定的如何去查询表中的行的方式
possible_keys查询可能会用到的索引
key显示mysql决定采用哪个索引来优化查询
key_len显示mysql在索引里使用的字节数
ref当使用索引列等值查询时,与索引列进行等值匹配的对象信息
rows为了找到所需的行而需要读取的行数,估算值,不精确。通过把所有rows列值
filtered按表条件过滤的行百分比
Extra额外信息 Using index:MySQL将会使用覆盖索引,以避免访问表 Using where:MySQL服务器将在存储引擎检索后,再进行一次过滤 Using temporary:MySQL对结果排序时会使用临时表 Using filesort:对结果使用一个外部索引排序

4.2 profile工具

#检查是否支持
SELECT @@have_profiling;#启用profiling
SET profiling = 1;#查看最近的查询profiles
SHOW PROFILES;
show profile for query 1

相关文章:

  • 每周资讯 | 网易游戏发布会9款新品曝光;TikTok小程序测试开启
  • python与flask框架
  • 文献阅读——NeuroBayesSLAM
  • 【MySQL】 数据库基础数据类型
  • Unity EventCenter 消息中心的设计与实现
  • 蓝牙的选型、设计及测试
  • 电力设备类——如何使用YOLOv8模型对配网缺陷检数据集进行训练、评估和可视化 这个配网销钉缺失检测图像数据集 配网缺陷检测图像数据集 配网缺陷
  • Don’t Shake the Wheel 论文阅读
  • Docker部署OpenSearch集群
  • QT中延时的用法及定时器的用法
  • 用HTML5+JavaScript实现汉字转拼音工具
  • 基于DQN的学习资源难度匹配智能体
  • 静态库的使用方法
  • 基于OAuth2-proxy和Keycloak为comfyui实现SSO
  • MCP Server 实践之旅第 3 站:MCP 协议亲和性的技术内幕
  • StringBuilder 和 StringBuffer 的线程安全分析
  • 动态规划中的 求“最长”、“最大收益”、“最多区间”、“最优策略” 双重 for + 状态转移
  • 问题六、SIMTOSIM部分遇到的问题及解决方法
  • IP隧道技术中数据包头部的变化分析:必然增加的封装机制
  • 自学嵌入式 day 23 - 数据结构 树状结构 哈希表
  • 独立网站如何做/企业百度推广
  • 做网站公司排行/南京seo培训
  • 武汉网站建设电话多少钱/微博seo排名优化
  • 惠民县建设局网站/网络运营怎么学
  • 海洋cms/seo关键词优化怎么收费
  • 融安有那几个网站做的比较好的/sem账户托管