Mysql之MyISAM存储引擎


    MyISAM是Mysql的默认存储引擎,它在磁盘上存储为三个文件, .MYD是数据文件  .MYI是索引文件  .frm是存储表定义。我们可以考虑把数据文件和索引文件分别存到不同的磁盘,实现IO平均分布。 

    如果对事务完整性没有要求,或者以select 、insert 为主的操作,可以选择该存储引擎。
     1、MyISAM只会对索引进行缓存,而数据文件则是使用操作系统缓存,当索引数据大于key buffer的时候,也会使用操作系统缓存。

     2、使用count(*)的时候很快,因为行数是单独保存的。

     3、不支持事务,不支持外键,访问快。

     4、使用表级锁定。

     5、每张表一个数据文件,备份的时候可以直接复制,恢复的时候也可以直接覆盖,操作方便。

     6、可以使用myisamchk进行故障恢复。


    MyISAM表的存储格式:静态表(固定长度)【默认格式】、动态表、压缩表

    1、固定格式的特点:快速、容易缓存、崩溃后容易恢复、比动态表占用更大空间。但是静态表里面的字段是固定长度的,如果存储的数据长度不够,那么其他位就是用空格填充,在使用的时候,会由系统去掉空格。所以这个地方引入一个问题,如果我们的数据里面尾部本来就含有空格,那么在使用数据的时候,空格会被去掉, 关于这一点我们需要非常小心。

    2、动态表格式的特点:除了长度小于4的列,其他字符型的列长度是可变的;比静态固定格式使用较少空间;如果一行变得很大的时候,会进行分片,所以会造成碎片化,可以使用optimize table或者myisamchk -r来改善性能,使用myisamchk -ei获取表的统计信息;如果崩溃了,比静态格式表的恢复困难。

    效果截图——–

root->/tmp# myisamchk -r /var/lib/mysql/test/test_table.MYI
– recovering (with keycache) MyISAM-table '/var/lib/mysql/test/test_table.MYI'
Data records: 23068672

root->/tmp# myisamchk -ei /var/lib/mysql/test/test_table.MYI
Checking MyISAM file: /var/lib/mysql/test/test_table.MYI
Data records: 23068672   Deleted blocks:       0
– check file-size
– check record delete-chain
– check key delete-chain
– check index reference
– check records and index references
Records:          23068672    M.recordlength:        7   Packed:           -40%
Recordspace used:      100%   Empty space:           0%  Blocks/Record:   1.00
Record blocks:    23068672    Delete blocks:         0
Record data:     161480704    Deleted data:          0
Lost space:              0    Linkdata:              0

User time 1.25, System time 0.12
Maximum resident set size 1684, Integral resident set size 0
Non-physical pagefaults 516, Physical pagefaults 0, Swaps 0
Blocks in 0 out 0, Messages in 0 out 0, Signals 0
Voluntary context switches 25, Involuntary context switches 2746
root->/tmp#

    3、压缩表的特点:占用非常少的磁盘空间;

    root->/var/lib/mysql/test# ls -lh
total 155M
-rw-rw—- 1 mysql mysql 8.5K Sep 29 14:05 err_table.frm
-rw-rw—- 1 mysql mysql  612 Sep 29 14:05 err_table.MYD
-rw-rw—- 1 mysql mysql 1.0K Nov 26 16:16 err_table.MYI
-rw-rw—- 1 mysql mysql 8.4K Jan 19 23:34 test_table.frm
-rw-rw—- 1 mysql mysql 154M Jan 22 11:19 test_table.MYD
-rw-rw—- 1 mysql mysql 1.0K Jan 22 11:19 test_table.MYI
root->/var/lib/mysql/test# myisampack test_table.MYI
Compressing test_table.MYD: (23068672 records)
– Calculating statistics
– Compressing file
71.43%    
root->/var/lib/mysql/test# ls -lh
total 45M
-rw-rw—- 1 mysql mysql 8.5K Sep 29 14:05 err_table.frm
-rw-rw—- 1 mysql mysql  612 Sep 29 14:05 err_table.MYD
-rw-rw—- 1 mysql mysql 1.0K Nov 26 16:16 err_table.MYI
-rw-rw—- 1 mysql mysql 8.4K Jan 19 23:34 test_table.frm
-rw-rw—- 1 mysql mysql  45M Jan 22 11:19 test_table.MYD
-rw-rw—- 1 mysql mysql 1.0K Jan 22 11:24 test_table.MYI    

      

测试MyISAM的事务性  

———————-

mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)

mysql> insert into err_table(errsql) values('ppyy');
Query OK, 1 row affected (0.03 sec)

mysql> select * from err_table;
+———+——–+——–+
| errcode | errsql | retime |
+———+——–+——–+
| NULL    | ppyy   | NULL   |
+———+——–+——–+
1 row in set (0.00 sec)

mysql> rollback;
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> select * from err_table;
+———+——–+——–+
| errcode | errsql | retime |
+———+——–+——–+
| NULL    | ppyy   | NULL   |
+———+——–+——–+
1 row in set (0.00 sec)

mysql> commit;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from err_table;
+———+——–+——–+
| errcode | errsql | retime |
+———+——–+——–+
| NULL    | ppyy   | NULL   |
+———+——–+——–+
1 row in set (0.00 sec)

mysql> alter table err_table engine=innodb;
Query OK, 1 row affected (0.19 sec)
Records: 1  Duplicates: 0  Warnings: 0

mysql> start transaction;                          
Query OK, 0 rows affected (0.00 sec)

mysql> insert into err_table(errsql) values('zzqqq');
Query OK, 1 row affected (0.00 sec)

mysql> select * from err_table;                     
+———+——–+——–+
| errcode | errsql | retime |
+———+——–+——–+
| NULL    | ppyy   | NULL   |
| NULL    | zzqqq  | NULL   |
+———+——–+——–+
2 rows in set (0.00 sec)

mysql> rollback;
Query OK, 0 rows affected (0.05 sec)

mysql> select * from err_table;
+———+——–+——–+
| errcode | errsql | retime |
+———+——–+——–+
| NULL    | ppyy   | NULL   |
+———+——–+——–+
1 row in set (0.00 sec)

mysql> commit;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from err_table;
+———+——–+——–+
| errcode | errsql | retime |
+———+——–+——–+
| NULL    | ppyy   | NULL   |
+———+——–+——–+
1 row in set (0.00 sec)

———————-


查看表状体

———————-

mysql> show table status like 'test_table'G;
*************************** 1. row ***************************
           Name: test_table
         Engine: MyISAM
        Version: 10
     Row_format: Fixed
           Rows: 46137344
 Avg_row_length: 7
    Data_length: 322961408
Max_data_length: 1970324836974591
   Index_length: 1024
      Data_free: 0
 Auto_increment: NULL
    Create_time: 2015-01-19 23:34:54
    Update_time: 2015-01-22 11:19:17
     Check_time: 2015-01-22 11:19:17
      Collation: utf8_general_ci
       Checksum: NULL
 Create_options:
        Comment:
1 row in set (0.00 sec)

ERROR:
No query specified

———————-

        MyISAM表常见损坏情况:

        1、在写过程中Mysql的进程被杀掉;

        2、主机宕机(例如硬件故障)

              

转载于:https://blog.51cto.com/woodywoodpecker/1606984

Published by

风君子

独自遨游何稽首 揭天掀地慰生平