(5)mysql 经常使用存储引擎

概述

  mysql5.5以前默认存储引擎是MyISAM,5.5以后改成InnoDB。若要修改默认引擎,能够修改配置文件中的default-storage-engine。能够经过show engines来查看当前数据库支持的引擎。使用select engine from information_schema.engines where transactions = 'yes';来查看哪些引擎支持事务。在建立表到时候经过engine=...或type=...来指定所要使用到引擎。mysql

MyISAM

  1. 它不支持事务,也不支持外键,其优点是访问的速度快,对事务完整性没有要求的或者以select/insert为主的应用基本上可使用这个引擎来建立表。
  2. 每一个MyISAM在磁盘上都有3个文件,其文件名都与表名相同,但扩展名是:
    • .frm(表定义)
    • .MYD(MYDate:存储数据)
    • .MYI(MYIndex:存储索引)
  3. .MYD文件和.MYI文件能够放置在不一样的目录中,经过 data directory 和index directory语句指定。
  4. MyISAM类型的表可能会损坏,可使用CHECK TABLE语句来检查MyISAM表的健康,并用REPAIR TABLE语句修复一个损坏到MyISAM表。
  5. MyISAM支持3种不一样的存储格式:sql

    • 静态(固定长度)表
    • 动态表
    • 压缩表

      在静态表中,若是须要保存的内容后面原本就带有空格,那么在返回结果的时候会去掉公共的。数据库

      在动态表中,记录不固定,优势是占用空间相对比较少,缺点是频繁的更新和删除记录会产生碎片,须要按期执行optimize table 来改善性能。安全

      在压缩表中,由myisampack工具建立,占据很是小的磁盘空间。由于每一个记录都被单独压缩的。服务器

InnoDB

  1. InnoDB支持事务安全,对比MyISAM引擎,InnoDB写的效率差一些,而且会占据更多的磁盘空间。
  2. InnoDB自动增加列能够手工插入,可是插入的值是空或者0,则实际插入的将是自动增加后的值。可使用last_insert_id()查询当前线程最后插入记录使用的值。能够经过alert table *** auto_increment=n;语句强制设置自动增加值。
  3. 对于InnoDB表,自动增加列必须是索引。若是是组合索引,也必须是组合索引的第一列,可是对于MyISAM表,自动增加列能够是组合索引的其余列,这样插入记录后,自动增加列是按照组合索引到前面几列排序后递增的。
  4. MySQL支持外键的存储引擎只有InnoDB,在建立外键的时候,父表必须有对应的索引,子表在建立外键的时候也会自动建立对应的索引。在建立索引的时候,能够指定在删除、更新父表时,对子表进行的相应操做,包括restrict、cascade、set null和no action。其中restrict和no action相同,是指限制在子表有关联的状况下,父表不能更新;casecade表示父表在更新或删除时,更新或者删除子表对应的记录;set null 则表示父表在更新或者删除的时候,子表对应的字段被set null。当某个表被其它表建立了外键参照,那么该表对应的索引或主键被禁止删除。可使用set foreign_key_checks=0;临时关闭外键约束,set foreign_key_checks=1;打开约束。
  5. InnoDB存储表和索引有以下两种方式:
    • 使用共享表空间存储。
    • 使用多表空间存储。

MEMORY

  1. memory使用存在内存中的内容来建立表。每一个MEMORY表实际对应一个磁盘文件,格式是.frm。MEMORY类型的表访问很是快,由于它到数据是放在内存中的,而且默认使用HASH索引,可是一旦服务器关闭,表中的数据就会丢失,但表还会继续存在。
  2. 每一个MEMORY表中放置到数据量的大小,受到max_heap_table_size系统变量的约束,这个系统变量的初始值是16M,同时在建立MEMORY表时可使用MAX_ROWS子句来指定表中的最大行数。
  3. memory主要用于那些内容变化不频繁的代码表,或做为统计操做的中间结果表。

MERGE

  1. merge存储引擎是一组MyISAM表的组合,这些MyISAM表结构必须彻底相同,MERGE表中并无数据,对MERGE类型的表能够进行查询、更新、删除的操做,这些操做其实是对内部的MyISAM表进行操做。
  2. 对于对MERGE表进行的插入操做,是根据INSERT_METHOD子句定义的插入的表,能够有3个不一样的值,first和last值使得插入操做被相应的做用在第一个或最后一个表上,不定义这个子句或者为NO,表示不能对这个MERGE表进行插入操做。
  3. 能够对MERGE表进行drop操做,这个操做只是删除MERGE表的定义,对内部的表没有任何影响。
  4. MERGE在磁盘上保留2个以MERGE表名开头文件:.frm文件存储表的定义;.MRG文件包含组合表的信息,包括MERGE表由哪些表组成,插入数据时的依据。能够经过修改.MRG文件来修改MERGE表,可是修改后要经过flush table刷新。
  5. merge表与分区表的区别是:merge表不会智能的将记录写到对应的表中,而分区表能够的。

总结

仍一张表做为总结:
工具

mysql经常使用存储引擎
相关文章
相关标签/搜索