在查阅资料时,发现网络上很多文章当中对于innodb和myisam的讲解有些许冲突,导致了问题的产生。
- 创建表并添加数据
创建两张数据结构一样的表,同时向表中添加百万数据,执行增删改查操作,观察innodb与myisam的性能对比。
CREATE TABLE `innodb` ( `id` int(10) NOT NULL AUTO_INCREMENT, `name` varchar(10) COLLATE utf8_unicode_ci DEFAULT NULL, `lenth` varchar(10) COLLATE utf8_unicode_ci DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
CREATE TABLE `myisam` ( `id` int(10) NOT NULL AUTO_INCREMENT, `name` varchar(10) COLLATE utf8_unicode_ci DEFAULT NULL, `lenth` varchar(10) COLLATE utf8_unicode_ci DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
每张表手动创建两条数据然后使用蠕虫添加百万数据:
insert into innodb (id,name,lenth) VALUES (null,'innodb1','7'); insert into innodb (id,name,lenth) VALUES (null,'innodb2','7'); insert into `myisam` (id,name,lenth) VALUES (null,'myisam1','7'); insert into `myisam` (id,name,lenth) VALUES (null,'myisam2','7');
蠕虫添加百万数据:
insert into `innodb` select null,name,lenth from `innodb`; insert into `myisam` select null,name,lenth from `myisam`;
执行完之后,此时innodb与myisam的数据结构与数据是一模一样的:
- 性能对比(CURD)
-
- 添加:为了明显的效果,我们直接使用蠕虫同时向两张表中添加1048576条数据
-
- 查询
innodb查询百万数据2.221s
myisam查询百万数据0.510s
-
- 删除:为了更好的展示效果,我向两张表的末尾添加了(张三,2)这条数据
innodb删除一条非主建列的数据时间为1.721s(当前表)
myisam删除一条非主建列的数据时间为0.266s(当前表)
-
- 修改:修改时向表末尾添加(李四,2)
innodb表修改一条数据时间为2.362s
myisam表修改一条数据的时间为2.917s
-
- 总的来说在curd操作当中,除update操作之外,myisam的处理性能明显高于innodb。
- 如何选择存储引擎?
-
- InnoDB存储引擎:用于事务处理,支持外键,支持崩溃修复能力和并发控制。如果需要对事务的完整性要求比较高,如果需要频繁的进行更新、删除操作,那么就可以选择InnoDB存储引擎,因为该引擎可以实现事务的提交和回滚。
-
- MyISAM存储引擎:管理非事务表,高速的存储和检索,以及全文搜索的能力,MyISAM存储引擎插入数据快,空间和内存的使用比较低。如果表主要是用于读取数据,那么就可以选择MyISAM存储引擎。它可以实现处理的高效率。如果对应用的完整性和并发性要求低,也可以使用MyISAM存储引擎。
- 总结
虽然说MyISAM的性能明显高于InnoDB,但是它并不支持事务、外键等一系列操作,总的来说存储引擎都有各自的优势,不能说谁比谁很好,只有合适不合适。所以当我们选择存储引擎的时候我们应该选择最合适当前表的存储引擎,比如说如果执行大量的select,MyISAM是更好的选择,如果执行大量的insert、update和delete,为了数据的安全性,InnoDB才是最好的选择。