1000字范文,内容丰富有趣,学习的好帮手!
1000字范文 > mysql多变查询效率 mysql中的myisam和innodb的区别 – 数据库 – 前端 mysql索引创建和使用方法

mysql多变查询效率 mysql中的myisam和innodb的区别 – 数据库 – 前端 mysql索引创建和使用方法

时间:2021-06-20 02:04:37

相关推荐

mysql多变查询效率 mysql中的myisam和innodb的区别 – 数据库 – 前端 mysql索引创建和使用方法

01. 锁

MyISAM 只支持表级锁(table-level locking),也就是任何 CRUD 的操作都会给表加上锁,而 InnoDB 则支持表级锁和行级锁(row-level locking),默认是行级锁。

Innodb 的行级锁又分几种:共享锁(S),排它锁(X),意向共享锁(IS),意向排他锁(IX);如果 SQL 语句没有使用索引,并且又不能确定操作的行,这个时候就会锁表;即使在查询条件中使用了索引字段,但是如果 MySQL 认为全表扫描的效率更高,这时候也会使用表锁,所以还是要通过执行计划确认是否真正使用到了索引。

02. 事务

MyISAM 强调的是性能,但是不支持事务;

Innodb 是支持事务的,事务级别包括未提交读(Read uncommitted),已提交读(Read committed),可重复读(Repeatable read),可序列化(Serializable);

而不支持事务可能会导致:数据更新丢失、脏读、不可重复读等等;另外事务可以保障数据库崩溃后的安全恢复。

03. 外键

MyISAM 不支持外键,Innodb 支持外键。

04. 数据库文件

MyISAM 的数据库文件属于堆表,每个表在磁盘上都有三个文件,frm(存储表定义)、myd(存储表数据)、myi(存储表索引);

InnoDB 分为表空间数据文件和日志文件;其中数据文件用于保存数据和索引,它又有两种存储方式,共享表空间存储和多表空间存储;如果是共享表空间,那么所有表的数据文件和索引文件都保存在同一个表空间中,如果是多表空间,那么每个表都有一个表空间文件,用于存储数据和索引。

05. 索引

MyISAM 使用非聚集索引,也就是索引和数据分开存储,索引保存的是数据文件的指针;也就是说,主键索引和非主键索引的叶子节点都是数据文件的指针。

InnoDB 使用聚集索引,也就是索引和数据存在一个文件中;必须要有主键;不过如果使用非主键索引的话,需要两次查询,先查询到主键,然后再通过主键查询到数据;也就是说,主键索引的叶子节点是数据文件,非主键索引的叶子节点是主键的值。

另外着重指出,InnoDB 必须有主键,MyISAM 可以没有。

06. count()

MyISAM 保存有表的总行数,如果使用 select count(*) from table,直接取出该值,效率更高;

InnoDB 没有保存表的总行数,如果使用 select count(*) from table,需要遍历整个表;

当然如果是加了 where 条件的话,两种引擎都需要进行扫描。

偶将持续分享Java开发、架构设计、程序员职业发展等方面的见解,希望能得到你的关注。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。