zodream梦想开源/个人编程日记

zodream梦想开源/个人编程日记

简单的个人编程日记

马上订阅 zodream梦想开源/个人编程日记 RSS 更新: https://zodream.cn/blog/rss

MySql 数据库引擎 MyISAM与InnoDB 怎么选择

2019年12月22日 22:27
编程技术

MySql 数据库引擎 MyISAM与InnoDB 怎么选择

介绍

InnoDB

Mysql 5.5 版本开始, InnoDB是默认的表存储引擎, 其特点是行锁设计、支持MVCC、支持外键、提供一致性非锁定读、同时被设计用来最有效的利用以及使用内存和CPU

MyISAM

基于传统的ISAM类型, ISAM是Indexed Sequential Access Method (有索引的顺序访问方法) 的缩写,它是存储记录和文件的标准方法

比较

MyISAM InnoDB
支持事务、回滚 不支持 支持,默认封装成事务提交,多条最好使用一个事务
支持外键 不支持 支持
表级锁 表、行(默认)级锁,行锁是实现在索引上,可能会导致“死锁”
全文索引 支持 5.6 以后支持(使用sphinx插件更好)
count(*) 事先保存表的总行数 遍历(加了wehre则一样)
索引、主键 允许没有索引和主键,索引都是保存行的地址 没有则生成一个不可见的6字节的主键
安全性 更安全
高并发 容易表损坏 效率更好
巨大数据量 利用CPU效率更高
查询、更新、插入的效率 更高
加索引查询 更快
加索引更新 慢1/2 慢1/30
内存、空间 占用更大
存储文件 frm是表定义文件,myd是数据文件,myi是索引文件 frm是表定义文件,ibd是数据文件

测试:

测试环境:win10 MySQL8.0 php7.4

CPU 占用差不多、内存占用不高、机械硬盘写入跑满


CREATE TABLE `test_log` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `name` VARCHAR(255) NOT NULL,
  `created_at` INT(10) NULL,
  PRIMARY KEY (`id`));

|引擎类型|MyISAM|InnoDB|性能相差 -------|-----|----|----|---| 循环插入1万记录|324.83178091049【√】|712.46580886841|1倍 事务插入1万记录|313.85579895973|1.7757570743561【√】|300倍 主键更新100次|2.9796991348267【√】|7.0310151576996|1倍 非主键更新100次|8.5254480838776|9.1009860038757|差不多 查询所有count100次|0.016912937164307【√】|0.25129389762878|20倍 where查询count100次|0.017408847808838|0.021618127822876|差不多 查询单条主键100次|0.018386125564575|0.018260955810547|差不多 查询单条非主键100次|0.27979707717896【√】|0.45667195320129|1倍 like查询100次|0.31684398651123【√】|0.49412107467651|0.5倍 删除单条主键100次|3.5270810127258【√】|7.0672898292542|1倍 删除单条非主键100次|4.6953358650208【√】|11.668270111084|2倍 删除所有|0.23814415931702【√】|0.81685304641724|3倍

use Zodream\Database\DB;
use Zodream\Debugger\Domain\Timer;

DB::getEngine();
$timer = new Timer();
// 循环插入 10 万 记录
for ($i = 0; $i < 10000; $i ++) {...

剩余内容已隐藏

查看完整文章以阅读更多