您当前的位置: 首页 >  sql

编程乐趣

暂无认证

  • 1浏览

    0关注

    117博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

MySQL中MyISAM为什么比InnoDB查询快

编程乐趣 发布时间:2021-05-28 08:15:28 ,浏览量:1

目录

1、前期准备

1.1、创建表并插入测试数据

1.2、测试环境

2、MyISAM与InnoDB性能对比

2.1 验证思路

2.2、验证测试

2.2.1、主键查询性能测试

2.2.2、非主键查询

2.3 验证结论

3、MyISAM与InnoDB区别

3.1、维护区别

3.2、索引区别

3.3、MVCC的维护

3.4、其他差别

4、MyISAM与InnoDB使用的选择

5、总结

MySQL进阶教程汇总(专栏文章汇总,欢迎订阅,持续更新…)MySQL进阶教程专栏专栏的文章都在这里啦。文章会持续更新,大家有想要了解的功能点或者话题,可以在评论区告诉我!喜欢本专栏的文章,可以支持一下,你的肯定是对我最大的支持!也可以。https://blog.csdn.net/daremeself/article/details/128124975MySQL的存储引擎,​MyISAM与InnoDB是我们最经常使用的存储引擎,我们一起来从性能、存储结构、索引、如何抉择的角度,一起来对比下两者之前的差别。

文中讲解的方法,都是MySQL本身支持的,只是涉及的代码,采用C#作为例子。

1、前期准备 1.1、创建表并插入测试数据

分别创建不同引擎的订单表:trade_myisam、trade_innodb,订单表包含id、订单编号两个字段。

创建InonoDB引擎的订单表SQL代码如下:

CREATE TABLE `trade_innodb` (
	`id` INT(11) NOT NULL,
	`trade_no` INT(11) NOT NULL,
	PRIMARY KEY `id` (`id`),
	INDEX `trade_no` (`trade_no`) USING BTREE
)
COMMENT='订单'
COLLATE='utf8_unicode_ci'
ENGINE=InnoDB
;

创建MyISAM引擎的订单表SQL代码如下:

CREATE TABLE `trade_myisam` (
	`id` INT(11) NOT NULL,
	`trade_no` INT(11) NOT NULL,
	PRIMARY KEY `id` (`id`),
	INDEX `trade_no` (`trade_no`) USING BTREE
)
COMMENT='订单'
COLLATE='utf8_unicode_ci'
ENGINE=MyISAM
;

分别插入10万条测试数据,结果如下:

这里所有的字段,采用的都是Int类型,是为了方便我们,下面使用区间查询,来验证查询速度。

1.2、测试环境

文中测试环境电脑配置如下:

操作系统:Window 10 专业版

CPU:Inter(R) Core(TM) i7-8650U CPU @1.90GHZ 2.11 GHZ

内存:16G

MySQL版本:5.7.26

2、MyISAM与InnoDB性能对比 2.1 验证思路

MyISAM在MySQL 5.5 及之前的版本,MyISAM是默认引擎;InnoDB是专门为处理巨大数据量时的最大性能设计的,现在为MySQL默认引擎。

在MySQL官方文档说明,MyISAM比InnoDB查询快,但很多人都不知道其中的原理。

在探索其中原理之前,我们先验证下查询速度,另外也验证下MyISAM是否真的比InnoDB查询性能好。

在Mysql中,索引分为主键索引和非主键索引,这两种索引都能起到,加快查询速度的作用,但在查询速度上是有区别的,主键索引要快于非主键索引,所以我们从以下两个方面去验证:

1、通过主键查询,MyISAM是否比InnoDB查询快?

2、通过非主键字段查询,MyISAM是否比InnoDB查询快?

具体验证方法为:

1、分别通过id、trade_no查询10000~20000区间的记录,并获得查询所花费时间。

2、循环查询100次,并取得查询耗费时间平均值。

3、通过对比查询耗费时间平均值,来判断性能。

2.2、验证测试 2.2.1、主键查询性能测试

查询主键id在10000~20000区间,查询100次,并统计耗费时间的平均值,C#实现代码如下:

using (var conn = new MySqlConnection(connsql))
{
    conn.Open();
    //查询次数
    var queryTime = 1000;
​
    //InnoDB数据引擎:主键查询
    //开始时间
    var startTime = DateTime.Now;
    for (var i = 0; i < queryTime; i++)
    {
        //插入
        var sql = "select * from trade_innodb where id>=10000 and id=10000 and id=10000 and trade_no=10000 and trade_no            
关注
打赏
1665230491
查看更多评论
0.0363s