美文网首页MySQL
MySQL 存储引擎——MyISAM

MySQL 存储引擎——MyISAM

作者: lframe | 来源:发表于2020-06-25 10:50 被阅读0次

    MySQL 大部分系统表、临时表都是使用的 MyISAM 存储引擎,临时表不是通过 create temporary 语句创建的,通过 create temporary 创建临时表,我们是可以通过使用各种存储引擎实现的,这里的临时表是指在排序、分组等操作中,当数量超过一定大小之后,由查询优化器所建立的磁盘临时表

    MySQL 存储引擎之 MyISAM

    MyISAM 表结构文件及数据文件【MySQL 8.0版本】

    表结构文件

    1. 首先我们创建一个新表myisam,存储引擎使用MyISAM
      image.png
    2. 找到MySQL 的data目录,进入我们的该表相对应的数据库[我这里是test数据库]目录下
      image.png
      可以看到以我们的表 myisam 开头的三个文件 MYDMYIsdi,其中MYD 用来存储数据,MYI 用来存储索引,sdi用来存储文件结构。
      这里的 sdi 是MySQL 8.0以后才有的,最主要的是它是可读的,在 MySQL 8.0之前存储表结构文件是 .frm文件,带着好奇心我们看一下这个sdi文件,可以看出这个文件是可读的
      image.png
      我们格式化一下,可以方便看出数据库名、表名、以及各个字段
    {
      "mysqld_version_id": 80016,
      "dd_version": 80016,
      "sdi_version": 80016,
      "dd_object_type": "Table",
      "dd_object": {
        "name": "myisam",
        "mysql_version_id": 80016,
        "created": 20200625011523,
        "last_altered": 20200625011523,
        "hidden": 1,
        "options": "avg_row_length=0;key_block_size=0;keys_disabled=0;pack_record=1;stats_auto_recalc=0;stats_sample_pages=0;",
        "columns": [
          {
            "name": "id",
            "type": 4,
            "is_nullable": true,
            "is_zerofill": false,
            "is_unsigned": false,
            "is_auto_increment": false,
            "is_virtual": false,
            "hidden": 1,
            "ordinal_position": 1,
            "char_length": 11,
            "numeric_precision": 10,
            "numeric_scale": 0,
            "numeric_scale_null": false,
            "datetime_precision": 0,
            "datetime_precision_null": 1,
            "has_no_default": false,
            "default_value_null": true,
            "srs_id_null": true,
            "srs_id": 0,
            "default_value": "",
            "default_value_utf8_null": true,
            "default_value_utf8": "",
            "default_option": "",
            "update_option": "",
            "comment": "",
            "generation_expression": "",
            "generation_expression_utf8": "",
            "options": "interval_count=0;",
            "se_private_data": "",
            "column_key": 1,
            "column_type_utf8": "int(11)",
            "elements": [],
            "collation_id": 255,
            "is_explicit_collation": false
          },
          {
            "name": "c1",
            "type": 16,
            "is_nullable": true,
            "is_zerofill": false,
            "is_unsigned": false,
            "is_auto_increment": false,
            "is_virtual": false,
            "hidden": 1,
            "ordinal_position": 2,
            "char_length": 1020,
            "numeric_precision": 0,
            "numeric_scale": 0,
            "numeric_scale_null": true,
            "datetime_precision": 0,
            "datetime_precision_null": 1,
            "has_no_default": false,
            "default_value_null": true,
            "srs_id_null": true,
            "srs_id": 0,
            "default_value": "",
            "default_value_utf8_null": true,
            "default_value_utf8": "",
            "default_option": "",
            "update_option": "",
            "comment": "",
            "generation_expression": "",
            "generation_expression_utf8": "",
            "options": "interval_count=0;",
            "se_private_data": "",
            "column_key": 1,
            "column_type_utf8": "varchar(255)",
            "elements": [],
            "collation_id": 255,
            "is_explicit_collation": false
          }
        ],
        "schema_ref": "test",
        "se_private_id": 18446744073709551615,
        "e
        "myisam_542.sdi" [
      noeol
    ] 1L, 2249C
    

    MyISAM的特性

    1.并发性和锁级别

    对 表中数据进行修改操作时,会被加锁,读取操作时,会对表加共享锁【但是共享锁不会阻塞共享锁】

    2.表损坏修复

    MyISAM支持对由于任意意外关闭而损坏的MyISAM表进行检查和修复操作,这里所说的并不是事务恢复,因为MyISAM并不是一种事务性的存储引擎,所以他也不能进行事务恢复所需要的相关日志,所以,要注意对MyISAM表进行恢复,会造成数据的丢失
    我们可以通过 check table tablename 对表进行检查,对于发现问题的表使用repair table tablename对其进行恢复。

    3.支持的索引

    支持全文索引,很大的只读表时,表创建完,导入数据后,就不会对表进行任何修改操作了,我们就可以对表进行压缩操作,可以减少磁盘I/O

    4.支持数据压缩

    很大的只读表时,表创建完,导入数据后,就不会对表进行任何修改操作了,我们就可以对表进行压缩操作,可以减少磁盘I/O,使用myisampack命令进行压缩,对于压缩后的表,不能进行写操作,只能进行读操作

    适用场景

    1.非事务场景
    2.只读应用
    3.空间类应用【gps数据】

    相关文章

      网友评论

        本文标题:MySQL 存储引擎——MyISAM

        本文链接:https://www.haomeiwen.com/subject/rxcsfktx.html