MySQL 存储引擎——MyISAM
2020-06-25 本文已影响0人
lframe
MySQL 大部分系统表、临时表都是使用的 MyISAM 存储引擎,临时表不是通过 create temporary 语句创建的,通过 create temporary 创建临时表,我们是可以通过使用各种存储引擎实现的,这里的临时表是指在排序、分组等操作中,当数量超过一定大小之后,由查询优化器所建立的磁盘临时表
![](https://img.haomeiwen.com/i19018314/eff65e4075346a23.png)
MyISAM 表结构文件及数据文件【MySQL 8.0版本】
表结构文件
- 首先我们创建一个新表
myisam
,存储引擎使用MyISAM
image.png
- 找到MySQL 的data目录,进入我们的该表相对应的数据库[我这里是test数据库]目录下
image.png
可以看到以我们的表 myisam 开头的三个文件MYD
、MYI
、sdi
,其中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数据】