MySQL: MyISAM与InnoDB存储引擎特性及选型指南

7.2 存储引擎深入剖析:InnoDB vs MyISAM及其他引擎选型指南 摘要: MySQL支持多种存储引擎,各有特点和适用场景。InnoDB作为默认引擎,支持事务、行锁和MVCC,适合OLTP应用;MyISAM适合读多写少场景,但不支持事务;MEMORY引擎用于临时数据,Archive引擎适合历史数据存储。选型需考虑事务需求、读写比例和数据特性,InnoDB是大多数场景的推荐选择。通过合理配置和优化,可充分发挥各引擎优势,提升数据库性能。 阅读详情

MyISAM存储引擎核心特性与适用场景


1 ) 基础架构与文件组成

  • 数据存储结构:每个MyISAM表由三个文件构成
    • .FRM:表结构定义文件(所有存储引擎通用)
    • .MYD:数据文件(核心存储)
    • .MYI:索引文件(B树结构)
  • 创建表示例:
    CREATE TABLE myISAM_tbl (
      id INT PRIMARY KEY,
      c1 VARCHAR(50)
    ) ENGINE=MyISAM;  -- 显式指定存储引擎 
    

2 ) 核心特性与限制

2.1. 并发控制与锁机制

  • 表级锁:读写操作需加锁,写入时需独占锁,读取时需共享锁
  • 共享锁(读锁)可并发,独占锁(写锁)互斥
    • 读写互斥:读写混合操作并发性差,纯读操作性能较高(共享锁不互斥)

2.2. 损坏修复机制

  • 支持意外崩溃后的表修复(非事务性恢复,可能丢失数据):
    -- 创建 InnoDB 表(独立表空间)  
    CREATE TABLE myInnoDB_table (  
        id INT PRIMARY KEY,  
        c1 VARCHAR(50)  
    ) ENGINE=InnoDB;  
    
    -- 检查表状态  
    CHECK TABLE myISAM_table;  
    -- 修复损坏表  
    REPAIR TABLE myISAM_table;  
    
  • 命令行工具 myisamchk 需在服务停止后使用,否则可能加剧损坏。

2.3. 索引与压缩支持

  • 全文索引:MySQL 5.7 前唯一原生支持全文索引的官方引擎。
  • 前缀索引:支持对 TEXT/BLOB 字段前 500 字符建索引。
  • 表压缩:适用于只读场景,减少磁盘 I/O:
    myisampack -f myISAM_table.MYI  # 强制压缩  
    
  • 压缩后表变为只读,插入操作报错:The table is read only。

2.4. 容量限制

  • MySQL 5.0 前单表上限 4GB(需建表时指定 MAX_ROWS 和 AVG_ROW_LENGTH)。
  • 5.0 后单表上限提升至 256TB。

适用场景

  • 非事务型应用:数据仓库、报表系统(无需事务完整性)。
  • 只读应用:压缩表优化 I/O,共享锁支持高并发读。
  • 空间应用:MySQL 5.7 前唯一支持空间函数的引擎(如 GPS 数据)。

InnoDB存储引擎深度解析


1 ) 存储架构

  • 文件结构:
    • .frm:表结构定义文件。
    • .ibd:独立表空间文件(当innodb_file_per_table=ON时生成)。
    • ibdataX:共享表空间文件(innodb_file_per_table=OFF时使用)。

2 ) 表空间管理策略

配置参数innodb_file_per_table=ON (默认)innodb_file_per_table=OFF
存储方式每表独立.ibd文件共享系统表空间(ibdata1)
磁盘空间回收支持OPTIMIZE TABLE局部回收无法收缩,需全库导出重建
I/O性能多文件并行写入,高并发优化单文件顺序写入,易成瓶颈

数据存储方式由参数 innodb_file_per_table 决定:

  • ON(默认):每表独立 .ibd 文件。
  • OFF:数据存于共享表空间 ibdata1。
-- 查看/修改表空间模式  
SHOW VARIABLES LIKE 'innodb_file_per_table';  -- 输出: ON  
SET GLOBAL innodb_file_per_table = OFF;  

独立表空间优势

  • 避免共享表空间的空间浪费与磁盘碎片。
  • 支持单表优化(如OPTIMIZE TABLE),无需全库重建。
对比维度系统表空间独立表空间
空间回收删除数据后无法收缩文件OPTIMIZE TABLE 可回收空间
碎片管理易产生磁盘碎片碎片率低
I/O 性能多表写入存在瓶颈多文件并行写入提升吞吐

迁移至独立表空间步骤

  1. mysqldump 导出全库数据(含存储过程/触发器)。
  2. 停止 MySQL 服务,修改 my.cnf:
    [mysqld]  
    innodb_file_per_table = ON  
    
  3. 删除 ibdata* 文件,初始化数据目录。
  4. 重启服务并导入数据。

2 ) InnoDB 事务与锁机制深度解析

2.1 ACID 实现核心

日志类型作用配置参数
Redo Log保障事务持久性(Crash-Safe)innodb_log_buffer_size(内存缓冲区)
innodb_log_files_in_group(日志文件数)
Undo Log支持事务回滚与MVCC(多版本并发控制)innodb_undo_directory(独立存储路径)
  • Redo Log(重做日志):
    • 内存缓冲区:innodb_log_buffer_size 控制大小。
    • 磁盘文件:ib_logfile0、ib_logfile1(数量由 innodb_log_files_in_group 定义)。
  • Undo Log(回滚日志):
    • 支持事务回滚与 MVCC(多版本并发控制)。
    • 推荐存放于 SSD 提升随机读写性能。

通过日志系统实现事务核心特性:

  • Redo Log:保证持久性(顺序写,ib_logfile0/1)
  • Undo Log:保证原子性/隔离性(随机读写,支持 MVCC)
-- 日志参数配置 
SHOW VARIABLES LIKE 'innodb_log_buffer_size';  -- Redo缓冲区大小
SHOW VARIABLES LIKE 'innodb_log_files_in_group'; -- Redo文件数量

日志工作流程:

  1. 事务修改数据 → 写入 Undo Log(用于回滚/MVCC)。
  2. 提交事务 → 写入 Redo Log Buffer → 刷盘至 ib_logfile0/1。
  3. 定期将脏页(Dirty Page)从缓冲池(Buffer Pool)刷入表空间文件。

优化建议:

  • 将Undo Log存储在SSD设备以提升随机读写性能。

MVCC示例:

-- 会话1:更新数据未提交
BEGIN;
UPDATE innodb_table SET c1='BBBB' WHERE id=2;

-- 会话2:读取id=2(看到undo log中的旧版本数据,非阻塞)
SELECT * FROM innodb_table WHERE id=2;

2.2 锁机制详解

锁按照作用范围可以分为三类:

  • 表级锁(Table-Level Lock):锁定整张表,开销小、加锁快,但并发度低。
  • 行级锁(Row-Level Lock):锁定某一行记录,开销大、加锁慢,但并发度高。
  • 页级锁(Page-Level Lock):锁定一页数据(InnoDB 中较少单独讨论)。

锁按照类型分包括:

  • 共享锁(S锁):读锁,允许多线程并发读。
  • 排他锁(X锁):写锁,阻塞其他读写操作。
  • 意向锁:这里是 表级锁 非行级锁,辅助行锁管理(如IS、IX锁)。
  • 锁类型对比:
    锁级别实现方式并发性适用场景
    表级锁MySQL服务器层实现低DDL操作(如 ALTER TABLE)
    行级锁存储引擎层实现高高频写操作

行级锁: 细粒度锁定资源,支持高并发

  • 存储引擎层实现,支持高并发写。

  • MVCC 机制下读操作不阻塞写操作(通过 Undo Log 读取历史版本)

  • 共享锁 和 排他锁 都是 行级锁

  • 锁兼容性矩阵

    共享锁 (S)排他锁 (X)
    共享锁✅❌
    排他锁❌❌
  • 意向锁与行级锁的关系总结

    类型锁级别是否冲突作用说明
    意向锁(IS/IX)表级锁❌ 与行级锁标记事务意图,用于协调表锁与行锁
    行级锁(S/X)行级锁✅ 与自身互斥控制具体行的并发访问
    表级锁(S/X)表级锁✅ 与意向锁互斥锁定整张表,阻塞其他事务访问
    • 排它锁(X Lock):既可以是行级也可以是表级,但 InnoDB 中默认使用行级 X 锁(如 FOR UPDATE)。
    • 意向锁(IS/IX):是表级锁,用于辅助行级锁管理,提升锁冲突检测效率,不属于行级锁。
  • 实验:行级锁与MVCC

    -- 连接1:更新数据但不提交  
    BEGIN;  
    UPDATE myInnoDB SET c1 = 'BBBB' WHERE id = 2;  -- 对id=2加排他锁  
     
    -- 连接2:查询同一行(不受阻塞,读取Undo Log中的旧版本)  
    SELECT * FROM myInnoDB WHERE id = 2;  -- 返回更新前的值  
    
    • 关键机制:
      • MVCC(多版本并发控制):通过Undo Log提供数据快照,避免读操作阻塞。
      • 意向锁(Intention Locks):加速表级锁与行级锁的冲突检测。
  • 锁冲突案例

    -- 连接1:加行级排他锁  
    BEGIN;  
    UPDATE myInnoDB_table SET c1 = 'BBBB' WHERE id = 2;  -- 未提交  
    
    -- 连接2:尝试读取同一行(成功,MVCC 读取旧版本)  
    SELECT * FROM myInnoDB_table WHERE id = 2;  
    
    -- 连接1:加表级锁  
    LOCK TABLE myInnoDB_table WRITE;  
    
    -- 连接2:查询被阻塞  
    SELECT * FROM myInnoDB_table;  -- 等待锁释放  
    

阻塞(Blocking) vs 死锁(Deadlock)

  • 阻塞:锁兼容性导致的等待(如写锁阻塞读锁),可能引发连接堆积。

  • 死锁:多事务循环占用资源,InnoDB 自动检测并回滚代价最小的事务。

    问题类型原因解决方案
    阻塞锁资源竞争(如长事务持有排他锁)✅ 优化慢查询
    ✅ 减少ALTER TABLE时间
    死锁事务循环等待资源(如A等B,B等A)⚠️ 数据库自动回滚最小代价事务
    ✅ 统一资源访问顺序
    ✅ 添加索引减少锁范围
  • 死锁处理:
    • 自动检测并回滚权重最小的事务

    • 规避方案:固定资源访问顺序,优化索引

      -- 死锁示例  
      -- 事务1  
      UPDATE table1 SET col=1 WHERE id=1;  
      UPDATE table2 SET col=1 WHERE id=1;  
      
      -- 事务2(相反顺序)  
      UPDATE table2 SET col=1 WHERE id=1;  
      UPDATE table1 SET col=1 WHERE id=1;  -- 触发死锁  
      

3 ) InnoDB 监控与适用场景

3.1 性能监控工具

  • SHOW ENGINE INNODB STATUS:输出关键统计信息,包括:
    • 最近 30 秒性能指标(如读写 I/O、缓冲池命中率)。
    • 锁/事务状态(如活跃事务 ID)。
    • 死锁检测日志。

示例:

SHOW ENGINE INNODB STATUS;  -- 关键输出字段:
# 或
SHOW ENGINE INNODB STATUS\G;

输出模块解析:

  1. BACKGROUND THREAD:InnoDB后台线程状态(如主线程循环次数)。
  2. SEMAPHORES:信号量等待统计(诊断锁竞争)。
  3. TRANSACTIONS:活跃事务列表(含事务ID和状态)。
  4. FILE I/O:I/O线程操作(读写请求队列)。
  5. BUFFER POOL AND MEMORY:缓冲池使用率(命中率优化依据)。
  6. ROW OPERATIONS:每秒读写量(性能瓶颈定位)。

关键监控区块:

  • TRANSACTIONS:当前活跃事务
  • FILE I/O:I/O 线程状态
  • BUFFER POOL AND MEMORY:缓存命中率
  • ROW OPERATIONS:每秒读写量

使用建议:

  • 间隔30秒以上采样,避免平均值失真。
  • 关注 LATEST DETECTED DEADLOCK 模块分析死锁成因。

性能指标含义

INSERT BUFFER AND ADAPTIVE HASH INDEX 
Ibuf: size 1, free list len 0, seg size 2...
  • seg size:插入缓冲区大小
  • merged ops:合并操作次数(反映写效率)

3.2 适用场景

  • 全文索引与空间数据:MySQL 5.7+ 原生支持,替代 MyISAM。
  • OLTP应用:高并发写入、短事务(如电商、支付系统), 行级锁支持细粒度并发控制。
  • 需事务支持的场景:财务、订单管理等强一致性需求,(严格 ACID 需求)。
  • MySQL 5.7+:支持全文索引与空间函数,覆盖MyISAM特性。

系统表空间迁移独立表空间操作指南


步骤:

  1. 导出数据:
    mysqldump -u root -p --all-databases > full_backup.sql
    
  2. 停止MySQL服务:
    systemctl stop mysql
    
  3. 修改配置:
    在my.cnf中添加:
    # /etc/my.cnf  
    [mysqld]  
    innodb_file_per_table=ON
    
  4. 删除原系统表空间文件(如 ibdata1, ib_logfile*),并重建数据目录:
    rm /var/lib/mysql/ibdata*
    mysql_install_db --user=mysql  
    
  5. 重启并重建表空间:
    systemctl start mysql
    
  6. 导入数据:
    mysql -u root -p < full_backup.sql
    

关键说明:

  • 系统表空间仍存储 数据字典(表/列/索引元数据)、Undo回滚段(MySQL 5.7+可分离)和 临时表。
  • 独立表空间默认启用(MySQL 5.6+),强烈推荐生产环境使用。

存储引擎对比与选型指南


特性MyISAMInnoDB
事务支持❌ 不支持✅ ACID兼容
锁粒度表级锁行级锁
崩溃恢复手动修复(REPAIR TABLE)自动恢复(Redo/Undo Log)
全文索引✅ 原生支持✅ MySQL 5.6+支持
适用场景只读报表/历史数据高并发OLTP/金融交易

其他存储引擎简要对比

引擎特性适用场景
CSV数据以CSV格式存储数据交换/外部导入导出
Memory数据存于内存,重启丢失缓存/临时高速查询
Archive高压缩比,仅支持插入/查询日志归档/历史数据存储

关键总结:

  • MyISAM:适合只读静态数据(如报表),但不支持事务与行锁。
  • InnoDB:默认引擎,强事务支持与高并发,推荐绝大多数场景。
  • 迁移建议:MyISAM表可通过ALTER TABLE转换:
    ALTER TABLE myisam_table ENGINE=InnoDB;
    

附录:操作代码示例


1 ) SQL操作

-- 启用独立表空间 
SET GLOBAL innodb_file_per_table = ON;

-- 创建InnoDB表
CREATE TABLE my_innodb (
  id INT PRIMARY KEY,
  c1 VARCHAR(50)
) ENGINE=InnoDB;

-- 迁移表至独立表空间
ALTER TABLE my_innodb ENGINE=InnoDB;  -- 仅迁移数据,不回收系统空间

和

/* InnoDB表空间检查 */
SHOW VARIABLES LIKE 'innodb_file_per_table';
 
/* 行级锁测试 */
-- 连接1
BEGIN;
UPDATE myInnoDB_tbl SET c1='new_value' WHERE id=2; -- 持有行锁 
 
-- 连接2
SELECT * FROM myInnoDB_tbl WHERE id=2; -- 读取Undo Log旧版本,非阻塞 

2 ) NestJS集成示例

修复示例

// database.providers.ts 
import { createPool } from 'mysql2/promise';
 
export const databaseProviders = [
  {
    provide: 'DATABASE_CONNECTION',
    useFactory: async () => {
      return createPool({
        host: 'localhost',
        user: 'root',
        database: 'test_db',
        waitForConnections: true,
        connectionLimit: 10,
        // InnoDB事务超时设置 
        innodb_lock_wait_timeout: 50  
      });
    },
  },
];
 
// myisam.service.ts
import { Injectable } from '@nestjs/common';
import { InjectConnection } from '@nestjs/typeorm';
import { Connection } from 'mysql2/promise';
 
@Injectable()
export class MyISAMService {
  constructor(@InjectConnection() private connection: Connection) {}
 
  async repairTable(tableName: string) {
    await this.connection.query(`REPAIR TABLE ${tableName}`);
  }
}

事务示例

import { Injectable } from '@nestjs/common';
import { DataSource } from 'typeorm';

@Injectable()
export class TransactionService {
  constructor(private dataSource: DataSource) {}

  async transferFunds() {
    await this.dataSource.transaction(async (manager) => {
      await manager.query(`UPDATE accounts SET balance = balance - 100 WHERE id = 1`);
      await manager.query(`UPDATE accounts SET balance = balance + 100 WHERE id = 2`);
    }); // 自动提交或回滚
  }
}

查询表空间状态

// NestJS 示例:查询表空间状态 
import { Injectable } from '@nestjs/common';
import { InjectConnection } from '@nestjs/typeorm';
import { Connection } from 'typeorm';
 
@Injectable()
export class InnodbService {
  constructor(@InjectConnection() private connection: Connection) {}
 
  async getTablespaceStatus(): Promise<any> {
    const query = `
      SELECT 
        table_name AS tableName,
        (data_length + index_length) / 1024 / 1024 AS sizeMB,
        engine
      FROM information_schema.tables 
      WHERE table_schema = DATABASE()`;
    return this.connection.query(query);
  }
}

通过系统表 information_schema.tables 实时监控表空间状态

// 数据库模块配置 (app.module.ts)  
import { Module } from '@nestjs/common';  
import { TypeOrmModule } from '@nestjs/typeorm';  
 
@Module({  
  imports: [  
    TypeOrmModule.forRoot({  
      type: 'mysql',  
      host: 'localhost',  
      port: 3306,  
      username: 'root',  
      password: 'password',  
      database: 'test_db',  
      entities: [__dirname + '//*.entity{.ts,.js}'],  
      synchronize: true, // 生产环境关闭  
      extra: {  
        engine: 'InnoDB', // 默认存储引擎  
        file_per_table: true // 独立表空间  
      }  
    }),  
  ],  
})  
export class AppModule {}  

操作 InnoDB 表示例

// 1. 实体定义(Entity)  
import { Entity, PrimaryGeneratedColumn, Column } from 'typeorm';  
 
@Entity()  
export class MyInnoDB {  
  @PrimaryGeneratedColumn()  
  id: number;  
 
  @Column()  
  c1: string;  
}  
 
// 2. 事务操作(Service层)  
import { Injectable } from '@nestjs/common';  
import { InjectRepository } from '@nestjs/typeorm';  
import { Repository, DataSource } from 'typeorm';  
 
@Injectable()  
export class MyService {  
  constructor(  
    @InjectRepository(MyInnoDB)  
    private readonly myRepo: Repository<MyInnoDB>,  
    private dataSource: DataSource,  
  ) {}  
 
  async updateWithTransaction() {  
    const queryRunner = this.dataSource.createQueryRunner();  
    await queryRunner.connect();  
    await queryRunner.startTransaction();  
 
    try {  
      // 更新数据(自动加行锁)  
      await queryRunner.manager.update(  
        MyInnoDB,  
        { id: 2 },  
        { c1: 'BBBB' },  
      );  
 
      // 提交事务  
      await queryRunner.commitTransaction();  
    } catch (err) {  
      // 回滚事务  
      await queryRunner.rollbackTransaction();  
      throw err;  
    } finally {  
      await queryRunner.release();  
    }  
  }  
}  

代码说明:

  • 通过 @Entity 定义InnoDB表结构,@PrimaryGeneratedColumn 指定主键。
  • 使用 QueryRunner 显式控制事务,确保操作的原子性。
  • 更新操作自动触发InnoDB行级锁,通过MVCC机制处理并发读。

总结

  1. 存储优化:

    • 必须启用 innodb_file_per_table=ON
    • 定期执行 OPTIMIZE TABLE 回收空间
  2. 事务配置:

    • Redo Log 大小建议 ≥ 1GB (innodb_log_file_size)
    • Undo Log 独立存放于 SSD (innodb_undo_directory)
  3. 锁优化:

    • 避免长事务 (SHOW PROCESSLIST)
    • 索引减少锁范围
  4. 版本选择:

    • ≥ MySQL 5.7 可完全替代 MyISAM

意向锁是表级锁,用于协调行级锁与表级锁之间的关系,两者作用层级不同但协同工作

意向锁与行级锁交互关系对比表

锁类型锁级别作用对象是否自动添加与其他锁的兼容性(✅兼容 ❌互斥)说明
意向共享锁(IS)表级锁整张表✅ 是IS ✅ IX ✅ S ✅ X ❌表示事务打算在某些行上加共享锁(S Lock)
意向排它锁(IX)表级锁整张表✅ 是IS ✅ IX ✅ S ❌ X ❌表示事务打算在某些行上加排它锁(X Lock)
共享锁(S)行级锁单行或多行用户控制IS ✅ IX ✅ S ✅ X ❌读锁,多个事务可同时读
排它锁(X)行级锁单行或多行用户控制IS ✅ IX ✅ S ❌ X ❌写锁,阻止其他事务读写
表级共享锁(S)表级锁整张表用户控制IS ✅ IX ❌ S ✅ X ❌锁定整张表只读
表级排它锁(X)表级锁整张表用户控制IS ❌ IX ❌ S ❌ X ❌锁定整张表读写,阻塞所有其他事务

补充说明

  • 意向锁不会与行级锁冲突:IX/IS 锁是表级标记,不影响具体行的读写操作
  • 意向锁加快表级锁判断:事务加表锁前只需检查意向锁,无需逐行扫描
  • 行级锁依赖索引:若 SQL 未命中索引,InnoDB 会退化为表级锁

InnoDB 核心优势:

  • 支持事务、行级锁、崩溃恢复,适用于OLTP(在线事务处理)系统。
  • MySQL 5.7+ 支持全文索引与空间函数,可替代MyISAM的特殊场景。

与其他引擎对比:

特性InnoDBMyISAM
事务支持不支持
锁粒度行级锁表级锁
崩溃恢复强弱
全文索引5.6+支持原生支持

InnoDB的核心价值在于:

  1. 数据安全:通过事务日志与锁机制保障ACID特性。
  2. 高并发:行级锁与MVCC优化读写冲突。
  3. 灵活存储:独立表空间支持动态空间管理。

InnoDB通过事务支持、行级锁和高效日志机制成为MySQL核心存储引擎。独立表空间是生产环境首选方案,避免系统表空间的空间浪费与I/O瓶颈。锁机制需区分阻塞(资源等待)与死锁(相互资源占用),并通过统一访问顺序或索引优化解决。监控工具 SHOW ENGINE INNODB STATUS 提供实时性能洞察,适用于高并发OLTP场景。

强烈建议:除历史遗留系统外,所有新项目默认采用InnoDB引擎,充分利用其现代数据库设计优势。

59、MySQL实用工具:myisamchk与myisampack深度解析 本文深入解析了MySQL中的两个实用工具myisamchk和myisampack。myisamchk可用于MyISAM表的检查、修复、索引分析等操作,并提供了详细的选项说明和使用注意事项。myisampack则专注于压缩MyISAM表,以减少存储空间并保持高效的行访问性能。文章还对比了这两个工具在数据维护和性能优化场景下的应用,帮助用户更好地管理和优化MySQL数据库。 阅读详情

相关推荐

从零到一:Gromacs伞形采样的实战避坑指南

本文详细介绍了Gromacs伞形采样技术的实战应用与避坑指南,涵盖核心原理、环境准备、参数设置、数据分析及性能优化等关键环节。特别针对蛋白质-配体结合自由能计算等典型应用场景,提供了弹簧常数设置、采样窗口间距等实用参数建议,帮助研究人员高效完成分子动力学模拟。

weixin_29243279的博客 515

MyISAM与InnoDB两者之间区别与选择,详细总结,性能对比

在MYSQL中使用全文索引(FULLTEXT index) MYSQL的一个很有用的特性是使用全文索引(FULLTEXT index)查找文本的能力.目前只有使用MyISAM类型表的时候有效(MyISAM是默认的表类型,如果你不知道使用的是什么类型的表,那很可能就是 MyISAM).全文索引可以建立在TEXT,CHAR或者VARCHAR类型的字段,或者字段组合上.我们将建立一个简单的表用来解释各种特性. 简单用法(MATCH()函数)对3.23.23以后的版本有效,复杂的用法(IN BOOLEAN MOD

吒哇 8913

手把手教你用STM32CubeMX和HAL库驱动MT6835磁编码器(SPI读取21位角度)

本文详细介绍了如何使用STM32CubeMX和HAL库驱动MT6835磁编码器,通过SPI接口读取21位高精度角度数据。从硬件准备、CubeMX配置到HAL库驱动实现与优化,提供了完整的实战指南,帮助开发者快速掌握磁编码器的应用技巧,适用于机器人关节和精密仪器等高精度场景。

weixin_28716769的博客 439

MySQL数据库---存储引擎(MyISAM与InnoDB)

数据库存储引擎是数据库底层软件组织,数据库管理系统(DBMS)使用数据引擎进行创建、查询、更新和删除数据。不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等功能,使用不同的存储引擎,还可以 获得特定的功能。现在许多不同的数据库管理系统都支持多种不同的数据引擎。MySQL的核心就是存储引擎。MySQL中的数据用各种不同的技术存储在文件中,每一种技术都使用不同的存储机制、索引技巧、锁定水平并最终提供不同的功能和能力,这些不同的技术以及配套的功能在MySQL中称为存储引擎。

weixin_60917414的博客 8112

Kubernetes多网卡环境下Calico网络配置避坑指南:如何精准指定业务网卡

本文针对Kubernetes多网卡环境下Calico网络配置的常见痛点,提供了精准指定业务网卡的实战指南。通过深入分析Calico的IP自动检测机制,详细解读并对比了五种IP_AUTODETECTION_METHOD配置方法(如interface、cidr、can-reach等),帮助运维人员从根源上解决网络分区和Pod通信失败问题,确保生产集群网络的稳定与可靠。

weixin_28835551的博客 730

springboot+vue项目基础开发(12)vue项目的搭建

在src目录下新建 api,utils,views文件夹。删除componets目录下自动生成的所有文件。在utils文件夹下创建request.js。启动项目,记得是要在管理员下启动。

m0_58498702的博客 153

MySQL进阶(数据库引擎)——MyISAM和InnoDB引擎的区别

MyISAM和InnoDB引擎的区别

Arya的博客,专注后端领域 3242

DICOM标准:DICOM医学影像中的覆盖层(Overlay)概念详解

DICOM标准:深入详解DICOM医学影像中的覆盖层(Overlay)

编程技术探索者,分享C/C++、C#、Java、数据库等开发经验,聚焦实战技巧与AI兴趣,助力编程爱好者成长。 1562

Mysql第三章:存储引擎(MyIsam和Innodb和MVCC)

数据库_MySQl_(存储引擎) 一:什么是存储引擎 MySQL中的数据用各种不同的技术存储在文件(或者内存)中。每一种技术都使用不同的存储机制、索引技巧、锁定水平并且最终提供广泛的不同的功能和能力。通过选择不同的技术,你能够获得额外的速度或者功能,从而改善你的应用的整体功能。例如,如果你在研究大量的临时数据,你也许需要使用内存MySQL存储引擎。内存存储引擎能够在内存中...

huyiju的博客 1万+

【100%通过率】华为OD机试真题 JavaScript【数字最低位排序】【最低位排序】

2023华为OD机试真题 JavaScript【数字最低位排序】【最低位排序】 给定一个非空数组(列表) 起元素数据类型为整型 请按照数组元素十进制最低位从小到大进行排序 十进制最低位相同的元素,相对位置保持不变 当数组元素为负值时,十进制最低为等同于去除符号位后对应十进制值最低位

MISAYAONE的博客 587

量化之趋势跟踪策略

趋势跟踪策略 import numpy as np import pandas as pd import matplotlib as mpl import matplotlib.pyplot as plt import seaborn as sns from finance import GetData import warnings; warnings.filterwarnings('ignore') data = GetData.get_data('../data/002236.csv') .

木头大左的博客 2533

MySQL存储引擎详解:InnoDB、MyISAM等核心特性与选型指南

数据库存储引擎是数据库管理系统的核心组件,负责数据的存储、索引和检索。MySQL采用插件式架构,支持多种存储引擎,每种引擎都有其独特的实现原理和适用场景。从技术实现来看,存储引擎通过不同的索引结构(如B+树、哈希)、锁机制(行锁、表锁)和事务支持(ACID特性)来满足各类业务需求。在工程实践中,InnoDB凭借其事务支持和行级锁定成为电商、金融等关键业务的首选,而MyISAM则在读密集型场景如日志分析中仍有价值。合理选择存储引擎能显著提升系统性能,例如将临时数据存入Memory引擎可实现微秒级响应,使用Ar

weixin_33391446的博客 222

TriCore架构-如何将系统刷成HSM

本文介绍了芯片刷写操作流程:首先加载project_Merge.s19文件,进入UCB界面展开BMHD0_ORIG和BMHD1_ORIG。重点说明需要将STAD地址从原始值A0000000修改为0XA00A0000,并详细描述了编辑、更新和写入芯片的步骤。最后提示在HSM刷写过程中如遇错误可能需要输入密码。该操作涉及关键地址修改,需谨慎执行。

xiandang8023的博客 95

MySQL存储引擎MyISAM与InnoDB区别总结整理

1、MySQL默认存储引擎的变迁在MySQL 5.1之前的版本中,默认的搜索引擎是MyISAM,从MySQL 5.5之后的版本中,默认的搜索引擎变更为InnoDB。2、MyISAM与InnoDB存储引擎的主要特点MyISAM存储引擎的特点是:表级锁、不支持事务和全文索引,适合一些CMS内容管理系统作为后台数据库使用,但是使用大并发、重负荷生产系统上,表锁结构的特性就显得力不从心;以下是MySQL 5 MySQL存储

徐刘根的博客 2万+

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

MySQL存储引擎详解:InnoDB、MyISAM与Memory

引擎核心优势核心劣势一句话总结InnoDB事务、行锁、外键占用空间大全能冠军,默认首选MyISAM简单、全文索引表锁、无事务偏科选手,适合只读Memory速度极快数据易失短跑冠军,临时使用最终建议:除非有特殊需求,否则默认选择InnoDB。随着MySQL版本迭代,InnoDB不断完善,已能覆盖绝大多数业务场景。

✨ 欢迎来到【Seal ^_^ 的优快云博客】!✨ 1280

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

MySQL - 存储引擎MyISAM和Innodb

首先,我们先看一下MySQL的体系架构,对MySQL整个架构有一个直观的感受: MySQL Server架构自顶向下大致可以分网络连接层、服务层、存储引擎层和系统文件层。存储引擎在MySQL的体系架构中位于第三层,负责MySQL中数据的存储与提取,是与底层系统文件打交道的子系统。MySQL存储引擎是插件式的,执行器通过调用存储引擎的API接口操作数据,接口屏蔽了不同存储引擎之间的差异,可以根据不同的需求去选择不同的存储引擎。存储引擎是根据MySQL提供的文件访问层抽象接口定制的一种文件访问机制,这种机制就

迪曼奥特迦-博客 5063

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

MySQL的三种存储引擎 InnoDB、MyISAM、Memory

InnoDB是一种兼顾高可靠性和高性能的通用存储引擎,在 MySQL 5.5 之后,InnoDB是默认的MySQL 存储引擎。MyISAM是MySQL早期的默认存储引擎。Memory引擎的表数据时存储在内存中的,由于受到硬件问题、或断电问题的影响,只能将这些表作为临时表或缓存使用。

weixin_46039745的博客 1588

Mysql的【存储引擎】之【InnoDB】与【MyISAM】的区别

"InnoDB"是一种数据库存储引擎,最初由Innobase Oy公司开发,后来被MySQL AB公司收购。这个名称确实不是一个显而易见的缩写或全称,但"Inn"可能代表"inner"(内部)的一个缩写,"DB"代表数据库。因此,可以将"InnoDB"解释为一种内部支持数据库操作的存储引擎。希望这次的解释更清楚了。如果您还有任何疑问,请随时告诉我。--Innobase Oy是一家位于芬兰赫尔辛基的数据库技术公司,最初开发了InnoDB存储引擎。公司成立于1995年,专注于开发高性能的数据库管理系统技术。

sun0322 1321

MySQL 的存储引擎到底怎么选?InnoDB vs MyISAM 深度对比

InnoDB 是 MySQL 默认引擎,提供完整的事务能力,确保数据一致性。Buffer Pool 可配置大小(如:innodb_buffer_pool_size=1G),建议占用 70%~80% 的物理内存;在 MySQL 中,存储引擎是“可插拔”的,用户可以为不同的表指定不同的引擎。InnoDB 会在写入前记录 redo log,即使 MySQL 崩溃,也能根据日志恢复数据,保障数据不丢失。相比 MyISAM 的表级锁,InnoDB 支持高并发下的细粒度控制,避免写操作之间互相阻塞。

小健学Java的博客 1521

MySQL存储引擎MyISAM和InnoDB

数据库存储引擎是数据库底层软件组件,数据库管理系统使用数据引擎进行创建、查询、更新和删除数据操作。不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等功能,使用不同的存储引擎还可以获得特定的功能。现在许多数据库管理系统都支持多种不同的存储引擎。MySQL 的核心就是存储引擎。

热爱IT行业 1681

MySQL 存储引擎解析:InnoDB/MyISAM/Memory 原理与选型

MySQL存储引擎是负责数据存储和读取的底层组件,采用插件式架构。InnoDB是5.5+版本默认引擎,支持ACID事务、行级锁、MVCC和聚簇索引,适合高并发OLTP场景。MyISAM是5.5前默认引擎,采用表级锁,查询速度快但不支持事务,适合读多写少场景。InnoDB通过redo/undo日志实现事务,MyISAM则通过分离的.MYD/.MYI文件存储数据。优化建议:InnoDB优先使用自增主键,避免长事务;MyISAM适合静态数据或批量导入场景。

2201_75355172的博客 983

深入解析MySQL存储引擎:从InnoDB到MyISAM的技术全景

MySQL作为最流行的关系型数据库之一,其存储引擎架构设计为不同业务场景提供了灵活的选择。本文将全面剖析MySQL存储引擎的核心机制、实现原理及最佳实践,助您做出精准的技术选型决策。

秃头之旅 1058

MySQL存储引擎选型:InnoDB vs MyISAM,到底该选谁?

选存储引擎就像相亲,没有绝对的好坏,只有合不合适。建议先用默认的InnoDB开发,遇到性能瓶颈再考虑优化方案。如果是做数据仓库这种离线分析的场景,MyISAM可能还会是你最后的倔强~技术无止境,多动手实践才是王道!如果有哪里没说清楚,欢迎在评论区提问,我会用大白话给你解答~

程序猿小白菜 956

MyISAM 与 InnoDB 深度对比:如何正确选择 MySQL 存储引擎

MySQL存储引擎深度对比:InnoDB vs MyISAM MySQL采用插件式存储引擎架构,MyISAM和InnoDB是最主要的两种引擎。MyISAM以出色的读性能著称,支持全文索引和快速COUNT(*),但仅提供表级锁,不支持事务、行锁和外键。InnoDB则具备完整的ACID事务支持、行级锁、MVCC并发控制和崩溃恢复能力,是大多数现代应用的首选。 关键区别: 事务:InnoDB支持,MyISAM不支持 锁机制:InnoDB行锁,MyISAM表锁 恢复能力:InnoDB有崩溃恢复,MyISAM无 性能

qq_43414012的博客 1128

MySQL存储引擎深度解析:InnoDB、MyISAM、MEMORY 与 ARCHIVE 的全面对比与选型建议

MySQL 的多存储引擎机制为开发者提供了极大的灵活性,但这也意味着我们必须理解每种引擎的底层结构与优缺点。技术选型不是拍脑袋,而是结合业务需求、访问模式和系统架构做出的综合判断。💬欢迎留言讨论你在实际项目中对不同引擎的使用经验!

chao_789的博客 1158

【MYSQL】存储引擎MyISAM和InnoDB

在实现上面两个功能的同时,需要考虑客观条件的限制,因为机器的内存大小是有限的,所以MySQL的InnoDB Buffer Pool的大小同样是有限的,如果需要缓存的页占用的内存大小超过了Buffer Pool大小,也就是Free链表中已经没有多余的空闲缓存页的时候岂不是很尴尬,发生了这样的事儿该咋办?所以,我们不得不再创建一个存储脏页的链表,凡是在LRU链表中被修改过的页都需要加入这个链表中,因为这个链表中的页都是需要被刷新到磁盘上的,所以也叫FLUSH链表,有时候也会被简写为FLU链表。

xiazi0721的博客 1227
上一篇: MySQL: 数据库性能优化核心要素:硬件选型与配置策略
下一篇: MySQL: 操作系统对MySQL性能的影响及选型指南
Wang's Blog
博客等级 码龄12年 7428粉丝 2412原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wang's Blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值