myisam引擎的一个实例

每个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)

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值