Myisam特征从磁盘上表现来说以三种形态进行存放,无论什么引擎的表都会有一个表结构文件,表结构文件里面保存了表是怎么定义的信息。.MYD,.MYI结尾的就是MYISAM具有代表性的另外两个文件,一个是存放数据文件的,所谓的数据文件就是保存了每一行的内容,另外一个是索引文件,目的是加快查询表里面的内容的。索引就像字典里面的目录,是先查阅字典里面的目录再定位某个字在第几页。通过索引的搜索对数据进行搜索会更加有效。
每次建立一个MYISAM引擎的表都会都会建立三个文件,.frm,.MYD,.MYI文件。索引文件.MYI是以二次方进行增长的。
mysql> create database myisam_test;
Query OK, 1 row affected (0.00 sec)
mysql> use myisam_test;
Database changed
mysql> create table test1(id int)engine=myisam;
Query OK, 0 rows affected (0.02 sec)
mysql> exit;
[root@localhost test]# ls -al /var/lib/mysql/myisam_test
total 24
drwx------. 2 mysql mysql 71 Oct 30 14:39 .
drwxr-xr-x. 6 mysql mysql 4096 Oct 30 14:39 ..
-rw-rw----. 1 mysql mysql 65 Oct 30 14:39 db.opt
-rw-rw----. 1 mysql mysql 8556 Oct 30 14:39 test1.frm 表结构文件,里面定义了表结构
-rw-rw----. 1 mysql mysql 0 Oct 30 14:39 test1.MYD 数据文件里面没有内容,0字节
-rw-rw----. 1 mysql mysql 1024 Oct 30 14:39 test1.MYI 1024个字节,以2的幂次方进行增长
可以看到创建一个myisam引擎的表就会创建三个文件。
这三个文件佷方便的可以进行打包和备份,如将这个三个文件删除就相当于将这个表删除了。可以将数据文件和索引文件放在不同的磁盘上面,可以将.MYD频繁写的数据文件放在较快的磁盘,而索引放在另外一个磁盘。将两个放在不同的地方以软链接的方式建立。
可以将两个MYISAM的表合存到MERGE引擎的表里面。
可以将MYISAM引擎的表进行压缩,转换为压缩的数据格式,但是只是只读的格式,可以节省磁盘空间。
MYISAM引擎在锁方面的表现的方式和其他数引擎是不一样的,主要是和innodb不一样。当用户去锁表的时候只能将整张表锁定,这个时候对于并发的效率就不高,在对表进行写操作,会产生排他锁,排除其他方式的锁,总是会优先写操作,此时其他人既不可以更新数据可不可以改写数据,这样性能大大下降。但是死锁现象不会发生,因为对数据的操作都是有序的,不会存在数据冲突。对于MYISAM引擎的表,写操作的优先级高于读操作。
Sammy的表格式是可以迁移的,可以将三个文件直接拷贝到另外一台机器上就可以使用了。如将test1.frm,test1.MYD,test1.MYI这三个文件移动另外一个数据库目录夹下面,再去查看该数据库里面表的时候就会多出test表。
[root@localhost mysql]# ls -a test
. .. binlog_test.frm binlog_test.ibd db.opt
[root@localhost mysql]# ls -a myisam_test
. .. db.opt test1.frm test1.MYD test1.MYI
[root@localhost mysql]# pwd
/var/lib/mysql
[root@localhost mysql]# cd myisam_test
[root@localhost myisam_test]# cp -p test1.frm test1.MYD test1.MYI ../test
[root@localhost myisam_test]# ls -a ../test
. .. binlog_test.frm binlog_test.ibd db.opt test1.frm test1.MYD test1.MYI
mysql> use test;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| binlog_test |
| test1 |
+----------------+
可以看到可以将Myisam的引擎的表的文件拷贝到其他目录下继续使用。这个相当于冷备份。
当装载数据到一个空的Myisam引擎表的时候,可以采用一种方式,就是可以将索引的更新先屏蔽,等所有的数据导入进去之后再将索引开启,这个方式影响大批量数据导入导出。
因为数据频繁插入更新会造成索引经常发生变化,每次插入几条数据,二叉树就需要重新平衡,这样非常影响性能。
在Myisam引擎的磁盘空间消耗完了,用户还是可以向里面持续写入数据而且不报错,如果在某些地方将空间释放出来了,之前驻留在内存没有写入的信息会被一次性写入磁盘。