MySQL

MySQL 存储引擎——MyISAM

2020-06-25  本文已影响0人  lframe

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数据】

上一篇 下一篇

猜你喜欢

热点阅读