MySQL最常见的引擎是MyISAM引擎和InnoDB引擎,那这两种引擎有什么区别呢?
MyISAM查找性能高,但不支持事务,而innodb最大的特点就是支持事务,并且支持行锁。Mysql在创建表的时候就可以指定引擎。那MYSQL引擎为什么查询性能更高呢。
比如下面的例子。

//创建表test1
CREATE TABLE `test1` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
//创建表2
CREATE TABLE `test2` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

执行以上两段命令后,对应的数据库文件夹下面会出现如下文件

MySQL读写速度 mysql myisam为什么读取速度快_MySQL读写速度


共有的文件:

db.opt

记录当前数据库的默认字符集及字符序等信息

MyISAM引擎 创建表后生成的文件有:
test2.frm:创建表的语句;
test2.MYD:表数据存储的文件;
test2.MYI:表索引存储的文件;

InnoDB引擎 创建表后生成的文件有:
test1.frm:创建表的语句;

那么innodb引擎表的数据和索引放哪里呢?

在mysql,data文件夹下有一个ibdata1文件,这个是InnoDB的共享空间文件,保存innodb表的数据和索引。

MySQL读写速度 mysql myisam为什么读取速度快_数据库_02


从文件来看,这两个引擎底层数据和索引的组织方式是不一样的,MyISAM 引擎把数据和索引分开了而InnoDB 引擎把数据和索引放在同一个文件里了。

分析
MyISAM数据和索引落在不同的两个文件上,在建表时以主键作为 KEY 来建立主索引 B+树,树的叶子节点存的是对应数据的物理地址。我们拿到这个物理地址后,就可以到 MyISAM 数据文件中直接定位到具体的数据记录了。
当我们为某个字段添加索引的时候,同样会生成对应的字段索引,该字段的索引树的叶子节点保存的也是物理地址,当我们下次查询的时候,我们可以直接根据物理地址去找到对应的数据。

InnoDB数据和索引文件是在同一个文件中,InnoDB表在建表的时候会自动的创建主键索引,索引的叶子节点保存的是对应主键的数据。
当我们为某个字段添加索引的时候,该索引的叶子节点保存的是对应主键的KEY,然后在根据主键的KEY去搜索对应的数据。

总结:MyISAM根据物理地址直接找到数据;InnoDB需要先找到KEY值,在找到后在根据KEY值去搜索对应的数据,需要执行两步,而MyISAM一步就可以搜索到对应的数据。所以MyISAM的查询性能更高哦。