0
点赞
收藏
分享

微信扫一扫

InnoDB和MySIAM的比较


目录

​​开篇​​

​​Mysql引擎​​

​​InnoDB和MySIAM的比较​​

​​插入数据性能比较​​

开篇

之前自己用docker部署了一个mysql,近期想重温一下mysql,做一些比较偏的研究。对于Java开发工程师来说,基本都了解mysql,都是配合JavaEE的持久层框架,如hibernate、mybatis或者最原生的JDBC。一般都是在Java代码层面上使用mysql,对于一些比较底层的用法,反而不是很熟悉。因此,近期我会分享一些比较偏一点的mysql知识,希望对大家有所帮助。

Mysql引擎

很多时候,我们都会比较少关注这部分,基本都是用默认的。我们以mysql社区版为例,我们可以在mysql控制台里进行查询。

 

mysql> show engines;
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| Engine | Support | Comment | Transactions | XA | Savepoints |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| FEDERATED | NO | Federated MySQL storage engine | NULL | NULL | NULL |
| MEMORY | YES | Hash based, stored in memory, useful for temporary tables | NO | NO | NO |
| InnoDB | DEFAULT | Supports transactions, row-level locking, and foreign keys | YES | YES | YES |
| PERFORMANCE_SCHEMA | YES | Performance Schema | NO | NO | NO |
| MyISAM | YES | MyISAM storage engine | NO | NO | NO |
| MRG_MYISAM | YES | Collection of identical MyISAM tables | NO | NO | NO |
| BLACKHOLE | YES | /dev/null storage engine (anything you write to it disappears) | NO | NO | NO |
| CSV | YES | CSV storage engine | NO | NO | NO |
| ARCHIVE | YES | Archive storage engine | NO | NO | NO |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
9 rows in set

 

InnoDB和MySIAM的比较_MySIAM

所以包含了:

  • InnoDB
  • MyISAM
  • Memory
  • Archive
  • CSV
  • FEDERATED
  • PERFORMANCE_SCHEMA
  • MRG_MYISAM
  • BLACKHOLE

默认是采用InnoDB。InnoDB是一个事务性的存储引擎,适合处理多重并发的更新请求,并支持外键约束。还有一个很重要的一点是,它可以从灾难中恢复数据,通过bin-log日志来实现。

除了InnoDB存储引擎,MysISAM存储引擎在我们实际应用中,相对其它存储引擎而言,用得也会比较多。下面我们就比较一下InnoDB和MySIAM存储引擎。

InnoDB和MySIAM的比较

插入数据性能比较

  • InnoDB和MySIAM为存储引擎,各创建一张表。

用户表,InnoDB格式创建。

 

CREATE TABLE user_InnoDB (
id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT COMMENT 'id',
num VARCHAR(25) NOT NULL COMMENT '编号'
) ENGINE=INNODB;

 

用户表,MYISAM格式创建。

 

CREATE TABLE user_MyISAM (
id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT COMMENT 'id',
num VARCHAR(25) NOT NULL COMMENT '编号'
) ENGINE=MYISAM;

 

  • 分别往上面两个表插入数据,尽量插入多一点,会显得效果比较明显。我们可以通过编码来执行,也可以用数据库的存储过程来实现。

如果存储过程不熟悉的朋友,就自行先了解一下吧。存储过程,在实际应用中还是用得比较广泛。

创建插入user_InnoDB表的存储过程(10万条数据)。

 

CREATE PROCEDURE insertData4InnoDB()
BEGIN
SET @i = 1;
WHILE @i <= 100000
DO
INSERT INTO user_InnoDB(num) VALUES(@i);
SET @i = @i + 1;
END WHILE;
END

 

创建插入user_MyISAM表的存储过程(10万条数据)。

 

CREATE PROCEDURE insertData4MyISAM()
BEGIN
SET @i = 1;
WHILE @i <= 100000
DO
INSERT INTO user_MyISAM(num) VALUES(@i);
SET @i = @i + 1;
END WHILE;
END

 

我们在mysql客户端看看是否创建成功。

InnoDB和MySIAM的比较_InnoDB_02

从上图可知,我们已经成功创建两张表和两个对应的存储过程。

接下来,我们就执行对应的存储过程。

 

CALL insertData4InnoDB;

[SQL]CALL insertData4InnoDB;
受影响的行: 0
时间: 9770.345s

 

InnoDB和MySIAM的比较_MySIAM_03

 

 

CALL insertData4MyISAM;

[SQL]CALL insertData4MyISAM;
受影响的行: 0
时间: 11109.895s

 

InnoDB和MySIAM的比较_MySIAM_04

小结:

InnoDB存储引擎的表,插入10万条数据要9770.345s。

MyISAM存储引擎的表,插入10万条数据要11109.895s。

从这结果来看,InnoDB好像快一些,但还是比较慢。

由于我们设置默认自动提交事务,所以性能会比较慢,我们可以先把自动提交事务关闭,然后执行存储过程,最后再提交事务。

 

[SQL]set autocommit =0;
受影响的行: 0
时间: 0.012s

[SQL]call insertData4InnoDB;
受影响的行: 0
时间: 10.709s

[SQL]set autocommit = 1;
受影响的行: 0
时间: 0.479s

 

如果采取上述方式,整个过程不用13秒。验证一下是否成功插入。

InnoDB和MySIAM的比较_存储过程_05

因此,在这次验证,我们可以发现,事务既有好处也有坏处。事务可以让我们保证数据的一致性,但确实会影响性能,特别像我们高频操作的时候,自动提交事务,大大降低了插入数据的速度。在我们实际应用中,我们一般会在数据迁移的时候会把自动提交事务关掉,但前提是不能有其它数据操作,否则容易出现数据问题。

下面我们对比一下查询性能,我自己实操了一下,区别不大,都在0.2秒内。可能是由于我的数据表不够大,所以效果不是很明显。从官方的介绍来说,MySIAM的查询性能会比InnoDB好一些。由于考虑的因素比较多,后续有时间,我自己再详细研究一下。

举报

相关推荐

0 条评论