0%

InnoDB 数据文件详解:表空间与存储机制

InnoDB 是 MySQL 中最常用的存储引擎,其数据存储机制与 MyISAM 有显著差异。InnoDB 采用 “表空间”(Tablespace)管理数据和索引,支持多种表空间模式,灵活适应不同场景。本文详细解析 InnoDB 数据文件的组成、表空间类型及存储特性。

InnoDB 数据文件的核心组成

InnoDB 的数据存储依赖两类关键文件:表空间文件日志文件,其中表空间文件是数据和索引的主要载体。

1. 表空间文件(存储数据和索引)

  • 作用:统一存储表结构、行数据、索引等信息(MyISAM 则分开存储为 .MYD 数据文件和 .MYI 索引文件)。
  • 常见文件格式:
    • .ibd:独立表空间文件(每个表对应一个)。
    • ibdata1ibdata2…:系统表空间文件(共享表空间,可包含多个表的数据)。

2. 日志文件(保障数据一致性)

  • 重做日志(Redo Log)
    文件名为 ib_logfile0ib_logfile1 等,记录数据修改操作,用于崩溃恢复(确保事务持久性)。
  • 撤销日志(Undo Log)
    通常存储在系统表空间中(或独立 undo 表空间),记录事务修改前的数据,用于事务回滚和 MVCC(多版本并发控制)。

InnoDB 表空间类型

InnoDB 支持两种表空间管理模式:共享表空间独立表空间,可通过配置参数切换。

阅读全文 »

MyISAM 数据文件详解:结构、特性与适用场景

MyISAM 是 MySQL 早期的默认存储引擎,其数据存储机制与 InnoDB 有显著差异,采用 “数据与索引分离” 的文件存储方式。了解 MyISAM 的数据文件结构,有助于理解其性能特点和适用场景。

MyISAM 的三大数据文件

MyISAM 为每个表创建三个独立的文件(文件名均以表名开头),分别存储表结构、数据和索引:

文件扩展名 作用描述 示例(表名为 user
.frm 存储表的元数据(表结构定义),包括字段类型、约束、索引定义等。 user.frm
.MYD 存储表的实际数据(MYData 的缩写),按插入顺序存储,不与索引绑定。 user.MYD
.MYI 存储表的索引(MYIndex 的缩写),包括主键索引、二级索引等,独立于数据文件。 user.MYI

示例:创建 MyISAM 表后的文件

1
2
3
4
5
6
-- 创建一个 MyISAM 引擎的表
CREATE TABLE user (
id INT PRIMARY KEY,
name VARCHAR(50) NOT NULL,
age INT
) ENGINE=MyISAM;

执行后,数据库目录下会生成三个文件:

  • user.frm(表结构)
  • user.MYD(数据)
  • user.MYI(索引)

各文件的核心特性

.frm 文件:表结构的载体

阅读全文 »

Shell 变量的读取与使用详解

在 Shell 脚本中,变量是存储和处理数据的基础。无论是系统环境变量还是用户自定义变量,掌握其读取和使用方式对编写高效脚本至关重要。本文将详细介绍 Shell 变量的读取方法、命令替换及交互式输入。

变量的基本赋值与读取

1. 变量赋值规则

  • 变量名与值之间用 = 连接,等号两边不能有空格(这是最容易出错的点)。
  • 变量名只能包含字母、数字和下划线,且不能以数字开头。
  • 若变量值包含空格或特殊字符,需用双引号(")包裹。
1
2
3
4
5
6
# 正确赋值(无空格)
name="Shell Script"
age=30

# 错误示例(等号两侧有空格)
# name = "Error" # 会被解析为命令,导致报错

2. 变量的读取方式

通过 $变量名${变量名} 读取变量值,两者的区别在于:

  • ${变量名} 用于明确变量边界,避免与后续字符混淆。
1
2
3
4
5
6
7
8
9
10
11
12
name="Tom"

# 基本读取
echo $name # 输出:Tom

# 变量后紧跟其他字符时,必须用${}
echo ${name}orrow # 输出:Tomorrow(正确解析为name变量 + "orrow")
echo $nameorrow # 输出空(Shell 会查找不存在的nameorrow变量)

# 变量拼接
greeting="Hello, $name"
echo $greeting # 输出:Hello, Tom

命令替换:将命令结果赋值给变量

通过 $(命令)命令 可以将命令的输出结果赋值给变量,这一过程称为命令替换

1. 语法格式

阅读全文 »

Nginx 配置限流:基于漏桶算法的流量控制策略

在高并发场景中,突发流量可能导致服务器过载、响应延迟甚至崩溃。Nginx 提供了基于漏桶算法的限流功能,通过limit_req_zonelimit_req指令控制请求速率,保护后端服务稳定。本文详细讲解 Nginx 限流的配置方法、核心参数及实战场景,帮助合理管控流量。

限流核心原理:漏桶算法

Nginx 限流基于漏桶算法(Leaky Bucket),其核心逻辑如下:

  • 想象一个 “漏桶”,请求如同水流注入桶中,桶底有一个固定速率的 “漏洞”;
  • 若请求注入速度超过漏洞的漏水速度,多余的水(请求)会溢出(被拒绝);
  • 通过控制漏洞的速率(rate)和桶的容量(burst),实现请求的匀速处理,避免瞬间压力。

基础配置:limit_req_zonelimit_req

Nginx 限流需两步配置:先在http块定义限流规则(limit_req_zone),再在location/server块应用规则(limit_req)。

定义限流区域(limit_req_zone

1
2
3
4
5
6
7
http {
# 定义限流规则
# $binary_remote_addr:以客户端IP的二进制形式作为key(节省内存)
# zone=mylimit:1m:创建名为mylimit的共享内存区域,大小1M(约可存储16000个IP状态)
# rate=1r/m:限制速率为每分钟1个请求(r/s表示每秒,r/m表示每分钟)
limit_req_zone $binary_remote_addr zone=mylimit:1m rate=1r/m;
}
阅读全文 »

Shell 位置参数变量:处理命令行传参的实用指南

在 Shell 脚本中,位置参数变量用于接收和处理命令行传入的参数,是实现脚本灵活性和复用性的关键。无论是简单的参数传递还是复杂的批量处理,掌握位置参数变量都能高效完成任务。以下是详细解析和示例。

基础位置参数变量

1. $n:按序号获取参数

  • $0:表示脚本本身的名称(包含路径时显示完整路径)。
  • $1~$9:表示第 1 到第 9 个参数。
  • ${10}及以上:10 个以上的参数需用大括号包裹(如${10}${11})。

示例params.sh 脚本

1
2
3
4
5
#!/bin/bash
echo "脚本名称:$0"
echo "第1个参数:$1"
echo "第2个参数:$2"
echo "第10个参数:${10}"

执行脚本:

1
sh params.sh a b c d e f g h i j k

输出:

1
2
3
4
脚本名称:params.sh
第1个参数:a
第2个参数:b
第10个参数:j

2. $#:获取参数总数

  • 表示命令行传入的参数总个数(不包含脚本名称$0)。
阅读全文 »