mysql中mylsam存储引擎和innodb存储引擎的区别

发布于:2025-09-07 ⋅ 阅读:(34) ⋅ 点赞:(0)

对比数据

2、表结构

reate database if not exists demo CHARSET utf8mb4;

use demo;

create table user_myisam(
    `id` INT AUTO_INCREMENT PRIMARY KEY,
    `name` VARCHAR(50),
    `age` TINYINT
) ENGINE = MyISAM;

create table user_innodb(
    `id` INT AUTO_INCREMENT PRIMARY KEY,
    `name` VARCHAR(50),
    `age` TINYINT
) ENGINE = InnoDB;

2、插入数据

DELIMITER $$
CREATE PROCEDURE batch_insert(IN cnt INT)
BEGIN
    DECLARE i INT DEFAULT 1;
    WHILE i <= cnt DO
            INSERT INTO user_myisam(name, age) VALUES (CONCAT('u',i), i%100);
            INSERT INTO user_innodb(name, age) VALUES (CONCAT('u',i), i%100);
            SET i = i + 1;
        END WHILE;
END$$
DELIMITER ;

CALL batch_insert(10);

3、区别

3.1 文件组织

MyISAM

docker exec -it mysql-lab bash
cd /var/lib/mysql/demo
ls -lh

在这里插入图片描述
InnoDB
在这里插入图片描述

3.2 锁差异

-- 会话 A:对 MyISAM 更新一行
LOCK TABLES user_myisam WRITE;   -- 显式写锁整张表
UPDATE user_myisam SET age = 99 WHERE id = 1;
-- 会话 B(开第二个 mysql 客户端):
SELECT * FROM user_myisam WHERE id = 2;  -- 被阻塞,因为表级锁

在这里插入图片描述

-- 换成 InnoDB:
UPDATE user_innodb SET age = 99 WHERE id = 1;
-- 会话 B 查询 id = 2 不会被阻塞(行锁)

3.3、崩溃差异

-- 会话 A 更新 MyISAM 不提交
UPDATE user_myisam SET age = 88 WHERE id = 2;
-- 在宿主机强行 kill -9 容器进程
docker kill mysql-lab
docker start mysql-lab
docker exec -it mysql-lab mysql -uroot -p123456 -e "CHECK TABLE demo.user_myisam;"  
-- 大概率出现 "Table is corrupted"

网站公告

今日签到

点亮在社区的每一天
去签到