每个MyISAM在磁盘上存储成三个文件。第一个文件的名字以表的名字开始,扩展名指出文件类型。.frm文件存储表定义。数据文件的扩展名为.MYD (MYData)。索引文件的扩展名是.MYI (MYIndex)。
MyISAM引擎是大多数MySQL安装程序的默认引擎,起源于早期版本MySQL支持的ISAM引擎。这种引擎提供了最佳的性能和功能的组合,尽管它缺少事务处理功能(使用InnoDB或者BDB引擎)并且使用表级锁定。
但是执行一下查询发现,我在测试的时候使用的两个测试表在创建的时候没有指定引擎,但是发现这两个表的存储引擎都为InnoDB。(当然我们修改配职文件my.ini中的default-storage-engine=INNODB来修改)。
mysql> select table_name,engine from tables where table_name like 'test%';
+------------+--------+
| table_name | engine |
+------------+--------+
| test | InnoDB |
| test1 | InnoDB |
+------------+--------+
2 rows in set (0.08 sec)
找了一下MYSQL文档,发现如下解释:
第15章:存储引擎和表类型:当MySQL被用MySQL配置向导安装在Windows平台上,InnoDB存储引擎替代MyISAM存储引擎作为替代,请参阅2.3.5.1节,“介绍”。
为了测试MyISAM引擎表级锁定,我们是用MyISAM引擎创建测试表TEST_ISAM。
测试中打开两个数据库连接,一个连接执行call p_tst_isam();另外一个执行单条mysql> insert into test_isam(id,mc) values(1,'1');结果在第一个连接还没有执行完的时候,第二个就完毕,没有发现MyISAM引擎锁表,这个问题我们暂时不再继续测试下去。测试中发现一个问题,MyISAM引擎的表的INSERT速度远远大于InnoDB引擎:
mysql> CREATE TABLE TEST_ISAM(ID INTEGER,MC VARCHAR(60)) ENGINE=MyISAM;
Query OK, 0 rows affected (0.38 sec)
mysql> select table_name,engine from information_schema.tables where table_name like 'test%';
+------------+--------+
| table_name | engine |
+------------+--------+
| test | InnoDB |
| test1 | InnoDB |
| test_isam | MyISAM |
+------------+--------+
3 rows in set (0.00 sec)
创建存储过程p_test_isam
delimiter //
create procedure p_test_isam()
begin
declare counter int;
set counter = 1000000;
while counter >= 1 do
insert into test_isam(id,mc) values(counter,'test');
set counter = counter - 1;
end while;
end
//
delimiter ;
我们在以前的测试例子中: InnoDB引擎 INSERT 1000条数据花费34秒
mysql> call p_test();
Query OK, 1 row affected (34.48 sec)
MyISAM引擎INSERT 1000000条数据花费时间20多秒:
mysql> call p_test_isam();
Query OK, 1 row affected (22.95 sec)
所以我们如果在使用非事物处理的表(也就是一些只有单用户使用的表)的时候可以采用MyISAM引擎来提高速度,当然了INSERT的时候可以利用MYSQL的BULK INSERT功能来出也是能大大提高性能的,这些我们将在MYSQL数据库优化一章中详细说明。BULK INSERT的语法:
INSERT INTO TEST VALUES(VAL11,VAL12),(VAL21,VAL22)……
测试完毕,翻看一下MYSQL文档,的确有下面一段话,和我们的测试结果吻合:
MyISAM管理非事务表。它提供高速存储和检索,以及全文搜索能力。MyISAM在所有MySQL配置里被支持,它是默认的存储引擎,除非你配置MySQL默认使用另外一个引擎。
另外一个实例(在虚拟机上,速度是相当的慢):
1)创建表
mysql> CREATE TABLE TEST_ISAM(ID INTEGER,MC VARCHAR(60)) ENGINE=MyISAM;
Query OK, 0 rows affected (0.05 sec)
mysql> CREATE TABLE TEST_InnoDB(ID INTEGER,MC VARCHAR(60)) ENGINE=InnoDB;
Query OK, 0 rows affected (0.06 sec)
2)创建存储过程
create procedure p_test_isam()
begin
declare counter int;
set counter = 1000000;
while counter >= 1 do
insert into TEST_ISAM(id,mc) values(counter,'test');
set counter = counter - 1;
end while;
end
create procedure p_test()
begin
declare counter int;
set counter = 1000000;
while counter >= 1 do
insert into TEST_ISAM(id,mc) values(counter,'test');
set counter = counter - 1;
end while;
end
3)执行存储过程
mysql> call p_test_isam();
Query OK, 1 row affected (5 min 50.00 sec)
mysql> call p_test();
第二个已经超过1个小时,没加载完,就断开了
4)查看文件
[root@SR3 clas]# du -sh *
4.0K db.opt
12K TEST_InnoDB.frm
12K TEST_ISAM.frm
20M TEST_ISAM.MYD
4.0K TEST_ISAM.MYI
20K t.frm
8.0K t.MYD
4.0K t.MYI
[root@SR3 clas]#
5)查看InnoDB保存目录
mysql> show variables like 'innodb_data%';
+-----------------------+------------------------+
| Variable_name | Value |
+-----------------------+------------------------+
| innodb_data_file_path | ibdata1:10M:autoextend |
| innodb_data_home_dir | |
+-----------------------+------------------------+
2 rows in set (0.00 sec)