下面是我的操作流程,TestInfo_0是新建的表,先采用InnoDB,插入100条记录,然后改为MyISAM,再改回InnoDB,发现InnoDB记录大小要大很多,这是什么原因呢?是不是因为BLOB数量多引起的?====================================mysql> use testDB;
Database changed
mysql> show tables;
+------------------+
| Tables_in_testDB |
+------------------+
| TestInfo_0 |
+------------------+
1 row in set (0.00 sec)mysql> select TABLE_NAME, ENGINE, AVG_ROW_LENGTH, TABLE_ROWS, DATA_LENGTH from information_schema.TABLES where TABLE_SCHEMA="testDB";
+------------+--------+----------------+------------+-------------+
| TABLE_NAME | ENGINE | AVG_ROW_LENGTH | TABLE_ROWS | DATA_LENGTH |
+------------+--------+----------------+------------+-------------+
| TestInfo_0 | InnoDB | 0 | 0 | 16384 |
+------------+--------+----------------+------------+-------------+
1 row in set (0.00 sec)-->插入100条记录mysql> select TABLE_NAME, ENGINE, AVG_ROW_LENGTH, TABLE_ROWS, DATA_LENGTH from information_schema.TABLES where TABLE_SCHEMA="testDB";
+------------+--------+----------------+------------+-------------+
| TABLE_NAME | ENGINE | AVG_ROW_LENGTH | TABLE_ROWS | DATA_LENGTH |
+------------+--------+----------------+------------+-------------+
| TestInfo_0 | InnoDB | 47349 | 100 | 4734976 |
+------------+--------+----------------+------------+-------------+
1 row in set (0.00 sec)mysql> alter table TestInfo_0 type=MyISAM;
Query OK, 100 rows affected, 1 warning (0.11 sec)
Records: 100 Duplicates: 0 Warnings: 0mysql> select TABLE_NAME, ENGINE, AVG_ROW_LENGTH, TABLE_ROWS, DATA_LENGTH from information_schema.TABLES where TABLE_SCHEMA="testDB";
+------------+--------+----------------+------------+-------------+
| TABLE_NAME | ENGINE | AVG_ROW_LENGTH | TABLE_ROWS | DATA_LENGTH |
+------------+--------+----------------+------------+-------------+
| TestInfo_0 | MyISAM | 11472 | 100 | 1147200 |
+------------+--------+----------------+------------+-------------+
1 row in set (0.00 sec)mysql> alter table TestInfo_0 type=InnoDB;
Query OK, 100 rows affected, 1 warning (0.12 sec)
Records: 100 Duplicates: 0 Warnings: 0mysql> select TABLE_NAME, ENGINE, AVG_ROW_LENGTH, TABLE_ROWS, DATA_LENGTH from information_schema.TABLES where TABLE_SCHEMA="testDB";
+------------+--------+----------------+------------+-------------+
| TABLE_NAME | ENGINE | AVG_ROW_LENGTH | TABLE_ROWS | DATA_LENGTH |
+------------+--------+----------------+------------+-------------+
| TestInfo_0 | InnoDB | 47349 | 100 | 4734976 |
+------------+--------+----------------+------------+-------------+
1 row in set (0.00 sec)
Database changed
mysql> show tables;
+------------------+
| Tables_in_testDB |
+------------------+
| TestInfo_0 |
+------------------+
1 row in set (0.00 sec)mysql> select TABLE_NAME, ENGINE, AVG_ROW_LENGTH, TABLE_ROWS, DATA_LENGTH from information_schema.TABLES where TABLE_SCHEMA="testDB";
+------------+--------+----------------+------------+-------------+
| TABLE_NAME | ENGINE | AVG_ROW_LENGTH | TABLE_ROWS | DATA_LENGTH |
+------------+--------+----------------+------------+-------------+
| TestInfo_0 | InnoDB | 0 | 0 | 16384 |
+------------+--------+----------------+------------+-------------+
1 row in set (0.00 sec)-->插入100条记录mysql> select TABLE_NAME, ENGINE, AVG_ROW_LENGTH, TABLE_ROWS, DATA_LENGTH from information_schema.TABLES where TABLE_SCHEMA="testDB";
+------------+--------+----------------+------------+-------------+
| TABLE_NAME | ENGINE | AVG_ROW_LENGTH | TABLE_ROWS | DATA_LENGTH |
+------------+--------+----------------+------------+-------------+
| TestInfo_0 | InnoDB | 47349 | 100 | 4734976 |
+------------+--------+----------------+------------+-------------+
1 row in set (0.00 sec)mysql> alter table TestInfo_0 type=MyISAM;
Query OK, 100 rows affected, 1 warning (0.11 sec)
Records: 100 Duplicates: 0 Warnings: 0mysql> select TABLE_NAME, ENGINE, AVG_ROW_LENGTH, TABLE_ROWS, DATA_LENGTH from information_schema.TABLES where TABLE_SCHEMA="testDB";
+------------+--------+----------------+------------+-------------+
| TABLE_NAME | ENGINE | AVG_ROW_LENGTH | TABLE_ROWS | DATA_LENGTH |
+------------+--------+----------------+------------+-------------+
| TestInfo_0 | MyISAM | 11472 | 100 | 1147200 |
+------------+--------+----------------+------------+-------------+
1 row in set (0.00 sec)mysql> alter table TestInfo_0 type=InnoDB;
Query OK, 100 rows affected, 1 warning (0.12 sec)
Records: 100 Duplicates: 0 Warnings: 0mysql> select TABLE_NAME, ENGINE, AVG_ROW_LENGTH, TABLE_ROWS, DATA_LENGTH from information_schema.TABLES where TABLE_SCHEMA="testDB";
+------------+--------+----------------+------------+-------------+
| TABLE_NAME | ENGINE | AVG_ROW_LENGTH | TABLE_ROWS | DATA_LENGTH |
+------------+--------+----------------+------------+-------------+
| TestInfo_0 | InnoDB | 47349 | 100 | 4734976 |
+------------+--------+----------------+------------+-------------+
1 row in set (0.00 sec)
解决方案 »
- 怎么能让database只读?
- mysql mmm mmmd_mon 一连接上mmmd_agent,mmmd_agent就断开链接
- linux环境mysql大小写出错
- 这怎的统计SQL怎么写
- mysql触发器语句
- 关于数据存储文件的问题
- 请教: MYSQL下如何使用类似于 id in (...) 这样的选择条件
- mysql为什么这三句的设置帐号密码的结果不一样?
- mysql4.1.3insert + mysql-connector-java-3.1.1-alpha-bin.jar出错
- MySQL开发团队如何实现测试
- mysqldump导出后,存储过程中的汉字乱码?
- PHP如何不指定数据库名连接postgres
MYISAM的读速度比INNODB的快!写比INNODB的慢!
--------
我在单线程批量插入大量数据的时候,MyISAM性能明显比InnoDB要强,InnoDB磁盘读写压力很大。所谓的
MYISAM的索引会采用前缀压缩,故索引比innodb要小得多(针对字符串列)。
-------------
| TestInfo_0 | CREATE TABLE `TestInfo_0` (
`GID` bigint(20) unsigned NOT NULL,
`Name` varchar(32) default NULL,
`CreateTime` datetime default NULL,
`BirthZone` tinyint(4) default NULL,
`LastLoginZone` tinyint(4) default '0',
`Gender` tinyint(4) default NULL,
`Prof` tinyint(4) default NULL,
`Level` smallint(6) default NULL,
`XP` int(11) default NULL,
`Bld` smallint(6) default NULL,
`Hab` smallint(6) default NULL,
`Str` smallint(6) default NULL,
`Int_` smallint(6) default NULL,
`LeftAP` smallint(6) default NULL,
`LeftSP` smallint(6) default NULL,
`CurHP` int(11) default NULL,
`CurMP` int(11) default NULL,
`CurEP` int(11) default NULL,
`Honor` int(11) default NULL,
`Charm` int(11) default NULL,
`PworldInstID` bigint(20) unsigned default NULL,
`EnterMapID` smallint(5) unsigned default NULL,
`EnterX` int(11) default NULL,
`EnterY` int(11) default NULL,
`LastEnterTime` int(11) default NULL,
`EnterLimit` smallint(5) unsigned default NULL,
`MapID` smallint(5) unsigned default NULL,
`X` int(11) default NULL,
`Y` int(11) default NULL,
`HairStyle` tinyint(4) default NULL,
`HeadImage` int(11) default NULL,
`RoleItemData` blob,
`RoleDealData` blob,
`RoleACData` tinyblob,
`RoleXP2` tinyblob,
`RoleAssisInfo` blob,
`UpdateTime` datetime default NULL,
`Res` tinyint(4) default NULL,
`Uin` int(10) unsigned default NULL,
`CurrentActivePet` tinyint(4) default NULL,
`TaskData` blob,
`TeamData` tinyblob,
`Skill` blob,
`Cooldown` tinyblob,
`SpecStat` blob,
`OnlineTime` int(11) default NULL,
`LoginCount` int(11) default NULL,
`PKValue` int(11) default NULL,
`RolePworldData` blob,
`GuildForRole` tinyblob,
`GMPower` tinyint(3) unsigned default NULL,
`IsDelete` tinyint(3) unsigned default NULL,
`DeleteTime` datetime default NULL,
`Reputation` blob,
`LastLogoutTime` datetime default '2009-04-18 00:00:00',
`BattlePower` int(11) default NULL,
`BlockCode` tinyint(3) unsigned default NULL,
`BlockEndTime` datetime default NULL,
`UseBuyInfo` blob,
`DailyCounter` blob,
`MailReadTime` blob,
PRIMARY KEY (`GID`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
这是我的建表语句,按理说索引占用空间很小。
--------
我在单线程批量插入大量数据的时候,MyISAM性能明显比InnoDB要强,InnoDB磁盘读写压力很大。打开事务没有?InnoDB支持事务
至于里面的原因,我猜可能是底层里面存储页填充的比例不一样的缘故吧至于索引呢,myisam会对索引采用前缀压缩的,所以,自然会比innodb的索引要小。
---- MyISAM 大小是从这里看的,正常
打开事务没有?InnoDB支持事务
---- 没有打开事务, InnoDB是不是缓写磁盘,在批量的时候缓冲区不够导致写磁盘压力大?
InnoDB是大型的,多cpu并行,有回滚事务安全,备份能和oracle一样,只锁定行。简单的说。如果你有个网游(如:传奇),你用myisam引擎,备份时,很可能所有人都会被踢出游戏。如果用INNODB备份就不会有这个问题。
InnoDB是大型的,多cpu并行,有回滚事务安全,备份能和oracle一样,只锁定行。 简单的说。如果你有个网游(如:传奇),你用myisam引擎,备份时,很可能所有人都会被踢出游戏。如果用INNODB备份就不会有这个问题。 ---------
InnoDB的优势在于事务和并发,这个我理解。只是占用的空间要大这么多出乎我的意料,按经验值应该是1.x : 1 这样的差距。
正常?
能贴出myisam下3个文件的大小吗?
正常?
能贴出myisam下3个文件的大小吗?---------------
我现在只有100条记录这个是InnoDB引擎是的状态
root@Tencent:/data/mysql/testDB# ll
总计 16
-rw-rw---- 1 mysql mysql 65 2009-10-14 16:37 db.opt
-rw-rw---- 1 mysql mysql 10974 2009-10-14 16:43 TestInfo_0.frm这个是MyISAM引擎是的状态,平均就是11k的样子
root@Tencent:/data/mysql/testDB# ll
总计 1148
-rw-rw---- 1 mysql mysql 65 2009-10-14 16:37 db.opt
-rw-rw---- 1 mysql mysql 10974 2009-10-14 18:07 TestInfo_0.frm
-rw-rw---- 1 mysql mysql 1147200 2009-10-14 18:07 TestInfo_0.MYD
-rw-rw---- 1 mysql mysql 4096 2009-10-14 18:07 TestInfo_0.MYI
root@Tencent:/data/mysql/testDB#
http://dev.mysql.com/doc/refman/5.1/zh/storage-engines.html我的估计理解是这样的。
myisam是可以压缩表的。因为他是基于通过磁盘io来存储的,瓶颈在磁盘IO上。所以传送的数据越小越好。
innodb是直接在内存中虚拟数据库的全表,然后统一缓存磁盘存储。对INNODB来说,瓶颈不再是磁盘io了,CPU为了更好的利用起来,也就不需要再去压缩数据,
建议你可以先看一下下面的官方文档说明。
15.2.1. InnoDB概述
http://dev.mysql.com/doc/refman/5.1/zh/storage-engines.html#innodb-overview
InnoDB存储它的表&索引在一个表空间中,表空间可以包含数个文件(或原始磁盘分区)。这与MyISAM表不同,比如在MyISAM表中每个表被存在分离的文件中。InnoDB 表可以是任何尺寸,即使在文件尺寸被限制为2GB的操作系统上。
15.2.3. InnoDB配置
InnoDB存储引擎是默认地被允许的。如果你不想用InnoDB表,你可以添加skip-innodb选项到MySQL选项文件。被InnoDB存储引擎管理的两个重要的基于磁盘的资源是InnoDB表空间数据文件和它的日志文件。如果你指定无InnoDB配置选项,MySQL将在MySQL数据目录下创建一个名为ibdata1的10MB大小的自动扩展数据文件,以及两个名为ib_logfile0和ib_logfile1的5MB大小的日志文件。http://dev.mysql.com/doc/refman/5.1/zh/storage-engines.html#myisam-storage-engine
15.1. MyISAM存储引擎
MyISAM是默认存储引擎。它基于更老的ISAM代码,但有很多有用的扩展。(注意MySQL 5.1不支持ISAM)。 每个MyISAM在磁盘上存储成三个文件。第一个文件的名字以表的名字开始,扩展名指出文件类型。.frm文件存储表定义。数据文件的扩展名为.MYD (MYData)。索引文件的扩展名是.MYI (MYIndex)。
------ InnoDB的数据并没有放在自己独立的目录下啊。
datadir = /data/mysql/
innodb_data_home_dir = /data/mysql/
innodb_data_file_path = ibdata1:10G;ibdata2:10G;ibdata3:10G;ibdata4:10G:autoextend
数据文件(由于之前连续插入了100万条记录,空间增长到40多G,所以ibdata4被扩展了。删除记录之后,数据文件并没有减小):
-rw-rw---- 1 mysql mysql 10737418240 2009-10-14 18:12 ibdata1
-rw-rw---- 1 mysql mysql 10737418240 2009-10-14 16:43 ibdata2
-rw-rw---- 1 mysql mysql 10737418240 2009-10-14 18:12 ibdata3
-rw-rw---- 1 mysql mysql 18035507200 2009-10-14 18:12 ibdata4
2. 停止 mysqld
3. 删除ibdata*, ib_logfile* 文件
4. 重新启动 mysqld(这时mysqld就会自动创建 idbdata*, ib_logfile* 文件)
5. 将到出来的数据导回去,体积才会减小。
1、集中式表空间(默认方式),所有的表和索引存储在一个文件里
2、每表表空间(innodb_per_table好象是这设置),每个表和索引单独一个文件请楼主将表空间形式改为第二种,再比较下
关键的是myisam是采用存储压缩的,这是最主要的区别地方
MySQL 5.4 changes to the InnoDB I/O subsystem enable more effective use of available I/O capacity. The changes also provide more control over configuration of the I/O subsystem. 从发展策略上看 mysql推崇 InnoDB,想必今后会在这种格式下大作文章,其它的格式可能会丢掉一些。