mysql的myisam居然比innodb慢???

liangtu 2015-08-31 02:41:18
查询了很多资料,都说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查询更快!!!和相关资料相反,这是为什么?

...全文
425 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
LongRui888 2015-09-25
  • 打赏
  • 举报
回复
引用 5 楼 liangtu33 的回复:
[quote=引用 3 楼 Stubborn_Cow 的回复:] 建议楼主看下《高性能MySQL》,里面对innodb的读写性能有很大篇幅的解释,虽然说5.1之前myisam的读比innodb快很多,但是在5.1之后,默认引擎变为innodb,innodb的读写有很大的提高,并且在数据量很大的情况下,innodb有时比myisam快,并且myisam存在数据恢复时间长,无事务等问题或短板,官方建议将myisam都换为innodb。
修改key_buffer_size,改成innodb_buffer_pool_size相同,都是104MB,

num=10000 , myisamSpendTime = 4835毫秒
num=10000 , innodbSpendTime = 36497毫秒
num=10000 , myisamSpendTime = 2471毫秒
num=10000 , innodbSpendTime = 8876毫秒
num=10000 , myisamSpendTime = 2449毫秒
num=10000 , innodbSpendTime = 2936毫秒

num=10000 , innodbSpendTime = 2037毫秒
num=10000 , myisamSpendTime = 2420毫秒

num=10000 , innodbSpendTime = 1987毫秒
num=10000 , myisamSpendTime = 2410毫秒

num=100000 , myisamSpendTime = 23773毫秒
num=100000 , innodbSpendTime = 18708毫秒
问题:刚开始myisam快得多,为什么越到后面,Innodb越来越快,并且超过了myisam?[/quote] 我觉得这个差别,可能是缓存机制的差别,innodb的缓存机制更加有效,随着查询次数越来越多,可能innodb的缓存命中率更高,因为内存总是有限的,用有限的内存来提高效率。
南山行者 2015-09-04
  • 打赏
  • 举报
回复
如果你有兴趣的话,可以深入研究。谁快谁慢,都不可能是绝对的,不同的适应场景、不同的配置等都会影响查询的结果,所以像这种比较,都是不断去试验的。
rick-he 2015-09-01
  • 打赏
  • 举报
回复
楼上说的都对
南山行者 2015-09-01
  • 打赏
  • 举报
回复
建议楼主看下《高性能MySQL》,里面对innodb的读写性能有很大篇幅的解释,虽然说5.1之前myisam的读比innodb快很多,但是在5.1之后,默认引擎变为innodb,innodb的读写有很大的提高,并且在数据量很大的情况下,innodb有时比myisam快,并且myisam存在数据恢复时间长,无事务等问题或短板,官方建议将myisam都换为innodb。
liangtu 2015-09-01
  • 打赏
  • 举报
回复
引用 3 楼 Stubborn_Cow 的回复:
建议楼主看下《高性能MySQL》,里面对innodb的读写性能有很大篇幅的解释,虽然说5.1之前myisam的读比innodb快很多,但是在5.1之后,默认引擎变为innodb,innodb的读写有很大的提高,并且在数据量很大的情况下,innodb有时比myisam快,并且myisam存在数据恢复时间长,无事务等问题或短板,官方建议将myisam都换为innodb。
修改key_buffer_size,改成innodb_buffer_pool_size相同,都是104MB,

num=10000 , myisamSpendTime = 4835毫秒
num=10000 , innodbSpendTime = 36497毫秒
num=10000 , myisamSpendTime = 2471毫秒
num=10000 , innodbSpendTime = 8876毫秒
num=10000 , myisamSpendTime = 2449毫秒
num=10000 , innodbSpendTime = 2936毫秒

num=10000 , innodbSpendTime = 2037毫秒
num=10000 , myisamSpendTime = 2420毫秒

num=10000 , innodbSpendTime = 1987毫秒
num=10000 , myisamSpendTime = 2410毫秒

num=100000 , myisamSpendTime = 23773毫秒
num=100000 , innodbSpendTime = 18708毫秒
问题:刚开始myisam快得多,为什么越到后面,Innodb越来越快,并且超过了myisam?
ACMAIN_CHM 2015-08-31
  • 打赏
  • 举报
回复
楼主的测试仅是一种 select * from t where id=1 这类的情况。 而楼主的代码很有可能queryByIdcard每次都断开,打开了 connection,这样测试影响会很多。 建议可以直接在MYSQL中使用存储过程来测试这样可以避开程序中的connection.open, 等的影响,而直接判断MYSQL本身的性能。
LongRui888 2015-08-31
  • 打赏
  • 举报
回复
这个我觉得还要看具体的设置。 比如 myisam引擎一个很重要的参数就是 key_buffer_size. 而 innodb引擎的一个重要参数就是 innodb_buffer_pool_size。 你看看这两个参数的设置。

56,679

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧