• MySQL基础之 存储引擎


    MyISAM存储引擎

    缺点:不支持事务,不支持外键。只支持表级锁。

    优点:访问速度快,多用于select、insert语句的高负载操作。仅仅支持全文索引。

    MyISAM缓存在内存的是索引,不是数据。而InnoDB缓存在内存的是数据,相对来说,服务器内存越大,InnoDB发挥的优势越大

    Myisam的存储文件:

    每个MyISAM在磁盘上存储程3个文件,文件名和表名是相同的,仅仅扩展名不一样:

      1、filename.frm:存储表定义

      2、filename.MYD:mydata,即存储的数据

      3、filename.MYI:myindex,即存储的索引

    解说:数据文件和索引文件可以放在不同的目录下,需要在创建表的时候通过特定的语句DATA DIRECTORY和INDEX DIRECTORY来指定。

    MyISAM类型的表可能会损坏影响访问,我们需要MyISAM类型的表提供的修复工具来修复,

      1、CHECK TABLE 语句来检测表的健康状态

      2、REPAIR TABLE语句来修复一个损坏的MyISAM表。

    MyISAM类型的表支持的三种存储结构:

    1、静态型

      静态表是默认的存储格式,静态表中的字段都是非变长字段,例如CHAR等长度不可变的数据类型。

      优点:存储速度快,表的性能比较高,容易缓存,出现故障容易恢复。

      缺点:占用的空间比较大,因为在定义的时候是固定的,所以不管列中的值有多大,都会以最大值为准,占据了整个空间。

      我们之前学过VARCHAR和CHAR的区别,在存取尾部带有空格字符的字符串的时候,我们取数据时VARCHAR取出来的字符串尾部带有空格(保留空格),而CHAR类型取出来的字符串尾部的空格字符则会被去掉。同样在这里也是,因为我们MyISAM的表在创建的时候如果是静态表存储格式,那么我们也要注意:如果需要保存的内容后面本来就带有空格,那么在返回的结果也会被去掉。

      还要注意的是:静态表中的数据在存储时是按照列的宽度定义补足空格,但是在应用访问的时候并不会得到这些空格,这些空格在返回前已经被去掉了。此外静态表是MyISAM存储引擎默认的存储格式。

    2、动态型

      如果列(即使只有一列)定义为动态的数据类型,例如BLOB、TEXT、VARCHAR等变长数据类型。这时MyISAM就自动使用动态型表存储格式。

      优点:占用的空间相对较少。

      缺点:虽然动态型的表占用了比静态型表较少的空间,但带来了性能的降低,因为如果某个字段的内容发生改变则其位置很可能需要移动,这样就会导致碎片的产生。随着数据变化的怎多,碎片就会增加,数据访问性能就会相应的降低。

      对于因为碎片的原因而降低数据访问性,有两种解决方法:

        1、尽可能使用静态数据类型 

        2、定期执行OPTIMIZE TABLE语句或者myisamchk-r命令来改善性能。

    3、压缩表

      压缩表有myisampack工具创建,占据非常小的磁盘空间。

    InnoDB存储引擎

     优缺点

    优点:支持事务,具有提交、回滚、崩溃恢复能力等。支持主键外键约束。支持并发量大,适用于大量的UPDATE、INSERT操作。

    缺点:InnoDB写的处理效率差一点,并会占用更多的磁盘空间以保留数据和索引。不支持全文索引。大量的SELECT操作的查询速度不如MyISAM存储引擎。

    InnoDB存储引擎的表的特点:

    1、支持外键约束,详细参考之前的文章。

    2、支持AUTO_INCREMENT,详细参考之前的文章。

    存储方式

    InnoDB存储表和索引有两种方式

    1、使用共享表空间存储

    这种方式创建的表的表结构保存在.frm文件中。

    共享表空间存储 多表空间存储

    创建的表的表结构保存在.frm文件中。

    表存放在innodb_data_home_dir和innodb_data_file_path定义的表空间中。

    创建的表的表结构仍然保存在.frm文件中。但是每个表的数据和索引又单独保存在.ibd文件中。

    对于分区表,也有对应的.ibd文件,详细查阅资料。

     注意:要使用多表空间的存储方式,需要设置参数“innodb_file_per_tale”。(如下所示说明存储引擎使用了多表空间的存储方式。)。并且还要重新启动服务后才能生效。

               

    疑问处理:

    1、对于使用多表空间存储的参数对新建的表的什么时候才会生效问题。

      1、对于新建的表按照多表空间的方式创建,已有的表仍然使用共享表空间存储。

      2、如果将已有的多表空间方式修改回共享表空间的方式,则新建表会在共享表空间中创建,但是已有的多表空间的表仍然保存原来的访问方式。

      总结:多表空间的参数生效后,只对新建的表生效。

    2、看了上面的理论知识,有人认为是否可以把.frm和.ibd的文件复制一下直接到别的数据库恢复一下呢?

      不可以的,至于原因我们可以参考深入浅出mysql的第140页来查看。我们大多数情况下是将单表恢复到目标数据库,还是需要mysqldump和mysqlimport命令来实现。

    3、是否在多表空间的存储方式下,共享表空间就不需要了呢?

      不是的,即便在多表空间的存储方式下,共享表空间仍然是必须的。因为InnoDB要把内部数据词典和在线重做日志放在这个文件中。

    MySQL的数据存放的目录下,在创建的数据库名字下有个.opt文件,有什么作用呢?

      答:在某些库目录下有个db.opt文件,那这个文件是干什么用的呢?如果你用记事本txt等编辑器打开看的话,内容很简单,是用来记录该库的默认字符集编码和字符集排序规则用的。也就是说如果你创建数据库指定默认字符集和排序规则,那么后续创建的表如果没有指定字符集和排序规则,那么该新建的表将采用db.opt文件中指定的属性

  • 相关阅读:
    数据库mysql基础语言--各模式的含义
    Linux下判断磁盘是SSD还是HDD的几种方法
    linux解压大全
    RedHat Linux RHEL6配置本地YUM源
    利用ssh传输文件-服务器之间传输文件
    深入理解asp.net里的HttpModule机制
    WPF(一)
    JS中caller和callee
    Vue-Methods中使用Filter
    c#值类型与引用类型区别
  • 原文地址:https://www.cnblogs.com/FengGeBlog/p/9845402.html
Copyright © 2020-2023  润新知