-
目录
-
MYSQL 常用存储引擎之MyISAM
- frm 结构信息
- MYD 数据信息
- MYI索引信息
-
介绍
由于这个原因呢,现在还有大量的服务器在使用这种MyISAM的表,另外MyISAM表也是MYQL大部分系统表和临时表所使用的一种存储引擎。
这里所说的临时表,是指在排序分组等操作中,当数量超过一定的大小之后,由查询优化器所建立的磁盘临时表,MyISAM存储引擎,会将表存储在两个系统文件中,一个是数据文件,以MYD为扩展名,另一个是索引文件,以MYI为扩展名。
Linux命令执行
mysql> use test
-- 创建指定存储引擎:engine=myisam
mysql> create table myIsam(id int,c1 varchar(10))engine=myisam;
-- 查看数据库表文件存储位置,后面再加上test即可:/var/lib/mysql/
mysql> show global variables like "%datadir%";
+---------------+-----------------+
| Variable_name | Value |
+---------------+-----------------+
| datadir | /var/lib/mysql/ |
+---------------+-----------------+
1 row in set (0.00 sec)
-- 路径效果展示
[root@localhost ~]# cd /var/lib/mysql/
[root@localhost mysql]# ll
总用量 110604
-rw-rw----. 1 mysql mysql 56 2月 19 13:09 auto.cnf
-rw-rw----. 1 mysql mysql 12582912 2月 19 13:09 ibdata1
-rw-rw----. 1 mysql mysql 50331648 2月 19 13:09 ib_logfile0
-rw-rw----. 1 mysql mysql 50331648 2月 19 13:09 ib_logfile1
drwx------. 2 mysql mysql 4096 2月 19 13:09 mysql
srwxrwxrwx. 1 mysql mysql 0 2月 19 13:09 mysql.sock
drwx------. 2 mysql mysql 4096 2月 19 13:09 performance_schema
drwx------. 2 mysql mysql 74 2月 19 13:16 test
[root@localhost mysql]# cd test/
[root@localhost test]# pwd
/var/lib/mysql/test
如下图所示,定义了一张为myIsam表,并且这个表的存储引擎呢,我们使用了MyISAM存储引擎:
下图所示,就是一个文件系统中myIsam这张表的存储方式,在这里我们可以看到,有三个以myIsam开头的文件,除了上面提到过的MYD、MYI两个文件之外呢,还有一个以frm为扩展名的文件,这个文件的并不是MyISAM存储引擎所特有的一个文件,而对于mysql所有的存储引擎来说,都会有一个frm为扩展名的文件,这个文件是用于记录这个表的结构的,而MYD和MYI两个文件的是MyISAM存储引擎所特有的一个文件。
[root@localhost test]# ls -l myIsam*
-rw-rw----. 1 mysql mysql 8582 2月 19 13:16 myIsam.frm
-rw-rw----. 1 mysql mysql 0 2月 19 13:16 myIsam.MYD
-rw-rw----. 1 mysql mysql 1024 2月 19 13:16 myIsam.MYI
-
MyISAM表都有哪些特性
前言:
只有知道的这些特性,我们才能明白,在什么情况下,我们应该使用MyISAM作为存储引擎
特性:
- 并发性和所级别【MyISAM使用的是表级锁,而不是行级,也就意味着,给表中的数据进行修改时,需要对整个表,进行加锁,而在对表中的数据进行读取时,也需要就是对所以的表加共享锁,从这里我们可以看到,使用MyISAM搜索引擎的表读取和写入两种操作的是互斥的,当然在一些情况下呢,当我们对表格数据进行读取时,也可以在表的末尾插入数据,因此呢,从上面介绍可以看出,MyISAM对于读写混合操作的并发性并不太好,如果只是只读操作的话,就并发性而言,性能还是可以接受的,因为共享锁并不会阻塞共享锁】
- 表损坏修复【MyISAM对由于任意意外关闭而损坏的MyISAM表,进行检查和修复操作,这里所说的修复的并不是事物恢复,因为MyISAM并不是一种是事务型的存储引擎,所以他也不可能记录进行事务恢复所需要的相关日志,所以要注意对MyISAM表进行修复,可能会造成数据丢失】
- check table tablename【我们可以通过check table命令来对表进行检查】
mysql> check table myIsam; +-------------+-------+----------+----------+ | Table | Op | Msg_type | Msg_text | +-------------+-------+----------+----------+ | test.myIsam | check | status | OK | +-------------+-------+----------+----------+ 1 row in set (0.00 sec) --- Msg_text 为OK状态是没有任何问题的。
- repair table tablename【来对其进行恢复】
mysql> repair table myIsam; +-------------+--------+----------+----------+ | Table | Op | Msg_type | Msg_text | +-------------+--------+----------+----------+ | test.myIsam | repair | status | OK | +-------------+--------+----------+----------+ 1 row in set (0.00 sec) --- 因为没有损坏,Msg_text 为OK状态是没有任何问题的。 [root@localhost ~]# cd /var/lib/mysql/test [root@localhost test]# myisamchk --- 这个工具也可以对myIsam进行修复,前提Mysql服务停止。
-
MyISAM表其他特性
-
压缩命令执行
[root@localhost test]# myisampack -b -f myIsam.MYI
myIsam.MYI gave error 140 on open
# 遇见140原因:myisampack从5.6.38 / 5.7.20 一个Bug 去掉.MYI即可
[root@localhost test]# myisampack -b -f myIsam
Compressing myIsam.MYD: (0 records)
- Calculating statistics
- Compressing file
Empty file saved in compressed format
# (0 records) 空文件
# 查看文件大小,-f是强制压缩
# myIsam.OLD 压缩之前文件的备份
# 实际上压缩后(MYI)的文件比压缩前(OLD)的文件还要大
[root@localhost test]# ls -lh myIsam.*
-rw-rw----. 1 mysql mysql 8.4K 2月 19 13:16 myIsam.frm
-rw-rw----. 1 mysql mysql 50 2月 19 13:46 myIsam.MYD
-rw-rw----. 1 mysql mysql 1.0K 2月 19 14:13 myIsam.MYI
-rw-rw----. 1 mysql mysql 0 2月 19 13:46 myIsam.OLD
[root@localhost test]#
-
对压缩过的表进行读写操作
# 当前myIsam表已经进行压缩了,进行插入操作,结论【对于已经压缩的表是不能进行写操作的,只能读】 mysql> insert into myIsam values(1,'haha'); ERROR 1036 (HY000): Table 'myIsam' is read only
-
MyISAM存储引擎限制
-
MyISAM适用场景
比如数据仓库、报表大多数不涉及到财务的应用不需要数据的完整性;还可以对数据文件的压缩,只读类的并发性不错;存储空间类如GPS等,并且利用空间函数对所存储数据进行运算只能使用MyISAM存储引擎,大部分环境下都是使用InnoDB存储引擎进行存储: