mysql中mylsam存储引擎和innodb存储引擎的区别
对比数据
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)
BEGINDECLARE i INT DEFAULT 1;WHILE i <= cnt DOINSERT 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"