mysql的myisam居然比innodb慢?

MySql 码拜 8年前 (2016-02-20) 1395次浏览
查询了很多资料,都说myisam查询快。但通过试验,居然得出相反的结论,操作如下
1.建表tbl_idcard_myisam、tbl_idcard_innodb,两表字段相同,引擎不同,id_card有相同索引,同样的100W数据(数据也是一摸一样)

CREATE TABLE `tbl_idcard_myisam` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `create_time` datetime DEFAULT NULL,
  `id_card` varchar(255) DEFAULT NULL,
  `name` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `id` (`id`),
  KEY `index_tbl_idcard_myisam` (`id_card`)
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

2.根据id_card查询,id_card是身份证号,写个了随机函数,依次对两张表分别查询10W、100W次,结果如下

for (int i = 0; i < num; i++)
{
	testIdcardInnodbService.queryByIdcard(IdCardCreate.generate());
}
num=100000 , myisamSpendTime = 85790毫秒  -- 单独查询myisam
num=100000 , innodbSpendTime = 72805毫秒  -- 单独查询innodb
num=1000000 , myisamSpendTime = 844717毫秒 -- 单独查询myisam
num=1000000 , innodbSpendTime = 673824毫秒 -- 单独查询innodb

结论:Innodb查询更快!和相关资料相反,这是为什么?

解决方案

50

这个本人觉得还要看具体的设置。
例如 myisam引擎一个很重要的参数就是 key_buffer_size.
而 innodb引擎的一个重要参数就是 innodb_buffer_pool_size。
你看看这两个参数的设置。

25

LZ的测试仅是一种 select * from t where id=1 这类的情况。 而LZ的代码很有可能queryByIdcard每次都断开,打开了 connection,这样测试影响会很多。
建议可以直接在MYSQL中使用存储过程来测试这样可以避开程序中的connection.open, 等的影响,而直接判断MYSQL本身的性能。

10

建议LZ看下《高性能MySQL》,里面对innodb的读写性能有很大篇幅的解释,虽然说5.1之前myisam的读比innodb快很多,但是在5.1之后,默认引擎变为innodb,innodb的读写有很大的提高,并且在数据量很大的情况下,innodb有时比myisam快,并且myisam存在数据恢复时间长,无事务等问题或短板,官方建议将myisam都换为innodb。

5

楼上说的都对

10

假如你有兴趣的话,可以深入研究。谁快谁慢,都不可能是绝对的,不同的适应场景、不同的配置等都会影响查询的结果,所以像这种比较,都是不断去试验的。

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明mysql的myisam居然比innodb慢?
喜欢 (0)
[1034331897@qq.com]
分享 (0)