0
点赞
收藏
分享

微信扫一扫

Mysql存储引擎MyISAM和Innodb的区别

DT_M 2022-02-15 阅读 160

1.MyISAM:

① 不支持事务,但是整个操作是支持原子性。

② 不支持行锁,只有表锁,每次锁住整张表。

MyISAM的表锁存在读锁和写锁,

表共享读锁和表独占写锁。在对MyISAM表进行读操作时,不会阻塞其他用户对同一张表的读请求,但是会阻塞其他用户对表的写请求;对其进行写操作时会阻塞对同一表读操作和写操作

MyISAM存储引擎的读锁和写锁是互斥的,读写操作是串行的。那么,一个进程请求某个MyISAM表的读锁,同时另一个进程也请求同一表的写锁,MySQL如何处理呢?答案是写进程先获得锁。不仅如此,即使读请求先到锁等待队列,写请求后到,写锁也会插到读锁请求之前!这是因为MySQL认为写请求一般比读请求要重要。这也正是MyISAM表不太适合于有大量更新操作和查询操作应用的原因,因为,大量的更新操作会造成查询操作很难获得读锁,从而可能永远阻塞。这种情况有时可能会变得非常糟糕

③会存储表的总行数

④存储文件:.frm 表结构文件 .MYD文件是数据文件 .MYI文件是索引文件

⑤采用非聚集索引,索引文件的数据域存储指向数据文件的指针。辅索引与主索引基本一致,但是辅索引不用保证唯一性。

⑥对于AUTO_INCREMENT类型的字段,在MyISAM表中,可以和其他字段一起建立联合索引。

2.Innodb:

①支持事务,支持事务安全(transaction-safe (ACID compliant), 原子性,一致性,隔离性,持久性

②支持行锁,和外键约束,因此可以支持写并发。 行锁是根据索引来支持的,如果查询sql时,sql语句没有走索引的话,则是全表检索。则不会加行锁,走的还是表锁。 所以建议Innodb存储引擎是,sql查询时能走索引就走索引。

③不存储总行数;也就是说,执行select count(*) from table时,InnoDB要扫描一遍整个表来计算有多少行。注意的是,当count(*)语句包含 where条件时,两种表的操作是一样的。

④将表单独存放到一个独立的ibd文件中

⑤主键索引采用聚集索引(索引的数据域存储数据文件本身),辅索引的数据域存储主键的值;因此从辅索引查找数据,需要先通过辅索引找到主键值,再访问主键索引;最好使用自增主键,防止插入数据时,为维持B+树结构,文件的大调整。

⑥对于AUTO_INCREMENT类型的字段,InnoDB中必须包含只有该字段的索引

目前所学了解的是上面的这些,后面学习后再补充

举报

相关推荐

0 条评论