MySQL 你可能忽视的选择问题( 二 )

  • 数据库所在主机如果宕机,MyISAM 的数据文件容易损坏,而且难以恢复 。
  • 增删改查性能方面:SELECT 性能较高,适用于查询较多的情况
  • InnoDB自从 MySQL 5.1 之后,默认的存储引擎变成了 InnoDB 存储引擎,相对于 MyISAM,InnoDB 存储引擎有了较大的改变,它的主要特点是
    • 支持事务操作,具有事务 ACID 隔离特性,默认的隔离级别是可重复读(repetable-read)、通过MVCC(并发版本控制)来实现的 。能够解决脏读和不可重复读的问题 。
    • InnoDB 支持外键操作 。
    • InnoDB 默认的锁粒度行级锁,并发性能比较好,会发生死锁的情况 。
    • 和 MyISAM 一样的是,InnoDB 存储引擎也有 .frm文件存储表结构 定义,但是不同的是,InnoDB 的表数据与索引数据是存储在一起的,都位于 B+ 数的叶子节点上,而 MyISAM 的表数据和索引数据是分开的 。
    • InnoDB 有安全的日志文件,这个日志文件用于恢复因数据库崩溃或其他情况导致的数据丢失问题,保证数据的一致性 。
    • InnoDB 和 MyISAM 支持的索引类型相同,但具体实现因为文件结构的不同有很大差异 。
    • 增删改查性能方面,果执行大量的增删改操作,推荐使用 InnoDB 存储引擎,它在删除操作时是对行删除,不会重建表 。
    MEMORYMEMORY 存储引擎使用存在内存中的内容来创建表 。每个 MEMORY 表实际只对应一个磁盘文件,格式是 .frm 。MEMORY 类型的表访问速度很快,因为其数据是存放在内存中 。默认使用 HASH 索引 。
    MERGEMERGE 存储引擎是一组 MyISAM 表的组合,MERGE 表本身没有数据,对 MERGE 类型的表进行查询、更新、删除的操作,实际上是对内部的 MyISAM 表进行的 。MERGE 表在磁盘上保留两个文件,一个是 .frm 文件存储表定义、一个是 .MRG 文件存储 MERGE 表的组成等 。
    选择合适的存储引擎在实际开发过程中,我们往往会根据应用特点选择合适的存储引擎 。
    • MyISAM:如果应用程序通常以检索为主,只有少量的插入、更新和删除操作,并且对事物的完整性、并发程度不是很高的话,通常建议选择 MyISAM 存储引擎 。
    • InnoDB:如果使用到外键、需要并发程度较高,数据一致性要求较高,那么通常选择 InnoDB 引擎,一般互联网大厂对并发和数据完整性要求较高,所以一般都使用 InnoDB 存储引擎 。
    • MEMORY:MEMORY 存储引擎将所有数据保存在内存中,在需要快速定位下能够提供及其迅速的访问 。MEMORY 通常用于更新不太频繁的小表,用于快速访问取得结果 。
    • MERGE:MERGE 的内部是使用 MyISAM 表,MERGE 表的优点在于可以突破对单个 MyISAM 表大小的限制,并且通过将不同的表分布在多个磁盘上,可以有效地改善 MERGE 表的访问效率 。
    选择合适的数据类型我们会经常遇见的一个问题就是,在建表时如何选择合适的数据类型,通常选择合适的数据类型能够提高性能、减少不必要的麻烦,下面我们就来一起探讨一下,如何选择合适的数据类型 。
    CHAR 和 VARCHAR 的选择char 和 varchar 是我们经常要用到的两个存储字符串的数据类型,char 一般存储定长的字符串,它属于固定长度的字符类型,比如下面
    MySQL 你可能忽视的选择问题

    文章插图
     
    可以看到,不管你的值写的是什么,一旦指定了 char 字符的长度,如果你的字符串长度不够指定字符的长度的话,那么就用空格来填补,如果超过字符串长度的话,只存储指定字符长度的字符 。
    这里注意一点:如果 MySQL 使用了非 严格模式的话,上面表格最后一行是可以存储的 。如果 MySQL 使用了 严格模式 的话,那么表格上面最后一行存储会报错 。
    如果使用了 varchar 字符类型,我们来看一下例子
    MySQL 你可能忽视的选择问题

    文章插图
     
    可以看到,如果使用 varchar 的话,那么存储的字节将根据实际的值进行存储 。你可能会疑惑为什么 varchar 的长度是 5 ,但是却需要存储 3 个字节或者 6 个字节,这是因为使用 varchar 数据类型进行存储时,默认会在最后增加一个字符串长度,占用1个字节(如果列声明的长度超过255,则使用两个字节) 。varchar 不会填充空余的字符串 。
    一般使用 char 来存储定长的字符串,比如身份证号、手机号、邮箱等;使用 varchar 来存储不定长的字符串 。由于 char 长度是固定的,所以它的处理速度要比 VARCHAR 快很多,但是缺点是浪费存储空间,但是随着 MySQL 版本的不断演进,varchar 数据类型的性能也在不断改进和提高,所以在许多应用中,VARCHAR 类型更多的被使用 。


    推荐阅读