[数据库萌新入门] 第一章 数据库基础入门(第2节 MyISAM 和 InnoDB对比)

2022-07-31,,,,

MyISAMInnoDB表引擎的区别:

1)事务支持

    MyISAM不支持事务,而InnoDB支持。

        事务:访问并更新数据库中数据的执行单元。(其实就是一组操作的原子性。)

2)存储结构

MyISAM:每个MyISAM表在磁盘上存储成三个文件。

  1.     .frm     存储表结构
  2.     .MYD  存储数据
  3.     .MYI    存储索引

InnoDB:主要分为两种文件进行存储

  1.     .frm    存储表结构
  2.     .idb    存储数据和索引(也可能是多个.idb文件,或者是独立的表空间文件)

3)表锁差异

MyISAM:只支持表级锁。用户在操作myisam表时,select,update,delete,insert语句都会自动给表加锁,如果加锁以后的表满足insert并发的情况下,可以在表的尾部插入新的数据。

InnoDB:支持事务和行级锁,是innodb的最大特色。行锁大幅度提高了多用户并发操作的性能。但是InnoDB的行锁是基于索引建立,如果索引失效或者没有使用索引,那么会由行锁升级为表锁。

4)表主键

MyISAM:允许没有任何索引和主键的表存在,索引都是保存行的地址。

InnoDB:如果没有设定主键或者非空唯一索引(没有主键则默认把这个当主键),就会自动生成一个6字节的主键(用户不可见),数据是主索引的一部分,附加索引保存的是主索引的值。InnoDB的主键范围更大,最大是MyISAM的2倍。

5)表的具体行数

MyISAM:保存有表的总行数,select count() from table;可以直接取出。

InnoDB:没有保存表的总行数(只能遍历)。

6)CURD操作

MyISAM:如果执行大量的select,MyISAM是更好的选择。(但实际上,一般我们都用InnoDB)

InnoDB:如果你的数据执行大量的INSERT或UPDATE,出于性能考虑,应该使用InnoDB表。DELETE从性能上,InnoDB更优,但DELETE FROM table时,InnoDB不会重新建立表,而是一行一行地删除,在innodb上如果要清空保存有大量数据的表,最好使用 truncate table 这个命令。

7)外键

MyISAM:不支持

InnoDB:支持

8)查询效率

MyISAM相对简单,所以在效率上要优于InnoDB,小型应用可以考虑使用MyISAM.

推荐考虑使用InnoDB来替代MyISAM引擎,原因是InnoDB自身很多良好的特点,比如事务支持、存储过程、视图、行级锁定等等,在并发很多的情况下,相信innoDB的表现肯定要比MyISAM强很多。

另外,任何一种表都不是万能的,只用恰当的针对业务类型来选择合适的表类型,才能最大的发挥MySQL的性能优势。如果不是很复杂的Web应用,非关键应用,还是可以继续考虑MyISAM的,这个具体情况可以自己斟酌。

9)MyISAM和InnoDB两者的应用场景

MyISAM管理非事务表。它提供高速存储和检索,以及全文搜索能力。如果应用中需要执行大量的SELECT查询,那么MylSAM是更好的选择。

InnoDB用于事务处理应用程序,具有众多特性,包括ACID事务支持。如果应用中需要执行大量的INSERT或UPDATE操作,则应该使用InnoDB,这样可以提高多用户并发操作的性能。现在默认使用InnoDB.

MySQL中的utf8和utf8mb4:

        utf8字符集表示一个字符需要使用1-4个字节,但是我们常用的一些字符使用1~3个字节就可以表示了。而在MysaL中字符集表示一个字符所用最大字节长度在某些方面会影响系统的存储和性能,所以设计MysQL的大叔偷偷的定义了两个概念:

        utf8mb3 :阉割过的utf8字符集,只使用1~3个字节表示字符。

        utf8mb4 :正宗的utf8字符集,使用1-4个字节表示字符。

        有一点需要大家十分的注意,在MysQL中utf8是utf8mb3的别名,所以之后在MySQL中提到utf8就意味着使用1-3个字节来表示一个字符,如果大家有使用4字节编码一个字符的情况,比如存储一些emoj表情啥的,那请使用utf8mb4

字符集的查看

MysQL支持好多好多种字符集,查看当前MySQL中支持的字符集可以用下边这个语句:

show charset;

数据类型:

 

decimal(5,2) 表示数值一共5位,其中2位是小数位。

MySQL中没有专门存储货币的数据类型,一般情况下使用DECIMAL(8,2)

默认情况下是有符号数,如果不需要负数,可以使用UNSIGNED关键字

 

datetime 8字节 1000-01-01 00:00:00 ~ 9999-12-31 23:59:59

通常情况下不会使用二进制数据类型进行多媒体数据的存储。

本文地址:https://blog.csdn.net/predawnlove/article/details/107662414

《[数据库萌新入门] 第一章 数据库基础入门(第2节 MyISAM 和 InnoDB对比).doc》

下载本文的Word格式文档,以方便收藏与打印。