Heim  >  Artikel  >  Datenbank  >  InnoDB和MyISAM数据存储特性研究_MySQL

InnoDB和MyISAM数据存储特性研究_MySQL

WBOY
WBOYOriginal
2016-06-01 14:01:18986Durchsuche

InnoDB和MyISAM是MySQL最重要的两种数据存储引擎,两者都可用来存储表和索引,InnoDB的索引和表存储在同一个文件中,MyISAM的索引和表存储在不同文件,但即使多个索引,也共存于一个文件。
  网络上很多比较都是基于两者的事务性处理和锁处理机制等,似乎InnoDB比MyISAM没有缺点了。但研究发现,MyISAM在数据特别是索引存储方面具有突出的优势,下面就此开展讨论。

  1. 研究结论

  1)InnoDB占用磁盘空间比MyISAM大,MyISAM存储数据可节省空间12%,存储索引可节省95%;

  2)InnoDB对空闲存储空间的使用不优。

  研究发现,MyISAM可大量节省磁盘空间,特别是对索引的存储上,优势巨大,这对大型Mysql数据库的数据表和索引的物理设计,具
有较大的指导意义。

  2. 研究对象及获得的数据

  Mysql版本:5.1.26-rc-community

  研究对象为创建的一个表,mytable3,初始为InnoDB类型。有54万行非重复数据(用随机函数产生),两个索引。共进行两个实验,获得的实验数据如下。

表占用_MB

索引占用_MB

InnoDB文件占用_MB

MyISAM文件占用_MB

初始类型InnoDB

256

240

914

0

类型改为MyISAM

222

8

914

230

类型改回InnoDB

256

240

1034

0

  从实验数据可以看出,表类型alter为MyISAM后,所占磁盘空间仅8MB,为InnoDB的4%。而且随着表类型改回InnoDB,InnoDB表空间被迫扩充120MB,达到1034MB,以支持该表数据的回迁。

  3. 实验过程

  --实验用表:mytable3, InnoDB类型。

  表有三个列,52万行数据,后两个列用随机函数产生,重复行很少。都创建了索引。此时该表数据占用空间256MB,索引占用空间240MB,InnoDB表空间914MB。

mysql>descmytable3;<br>  +-------+-----------+------+-----+---------+-------+<br>  |Field|Type|Null|Key|Default|Extra|<br>  +-------+-----------+------+-----+---------+-------+<br>  |id|int(11)|YES||NULL||<br>  |name|char(100)|YES|MUL|NULL||<br>  |name2|char(120)|YES|MUL|NULL||<br>  +-------+-----------+------+-----+---------+-------+<br>  3rowsinset(0.00sec)<br>  mysql>selectcount(*)frommytable3;<br>  +----------+<br>  |count(*)|<br>  +----------+<br>  |524288|<br>  +----------+<br>  1rowinset(0.57sec)<br>  mysql>selecttable_name,table_schema,data_length,index_lengthfrominformation_schema.tableswheretable_<br>name='mytable3';<br>  +------------+--------------+-------------+--------------+<br>  |table_name|table_schema|data_length|index_length|<br>  +------------+--------------+-------------+--------------+<br>  |mytable3|testbk|269271040|252706816|<br>  +------------+--------------+-------------+--------------+<br>  1rowinset(0.00sec)<br>  [mysql@testlocaldata]$ls-ltr<br>  total947188<br>  drwxr-xr-x2mysqlmysql4096Aug1909:53test<br>  drwx--x--x2mysqlmysql4096Aug1909:53mysql<br>  -rw-rw----1mysqlmysql125Aug1910:43mysql-bin.000001<br>  -rw-rw----1mysqlmysql125Aug1910:43mysql-bin.000002<br>  -rw-rw----1mysqlmysql1086Aug1917:18mysql-bin.000003<br>  -rw-rw----1mysqlmysql693Aug1920:51mysql-bin.000004<br>  -rw-rw----1mysqlmysql125Aug1920:54mysql-bin.000005<br>  -rw-rw----1mysqlmysql125Aug1920:58mysql-bin.000006<br>  -rw-rw----1mysqlmysql6Aug1920:59testlocal.sohu.com.pid<br>  srwxrwxrwx1mysqlmysql0Aug1920:59mysql.sock<br>  -rw-rw----1mysqlmysql133Aug1920:59mysql-bin.index<br>  -rw-r-----1mysqlmysql12432Aug2111:20testlocal.sohu.com.err<br>  drwx------2mysqlmysql4096Aug2111:22testbk<br>  -rw-rw----1mysqlmysql5010Aug2111:22mysql-bin.000007<br>  -rw-r-----1mysqlmysql5242880Aug2111:22ib_logfile1<br>  -rw-r-----1mysqlmysql5242880Aug2111:22ib_logfile0<br>  -rw-r-----1mysqlmysql958398464Aug2111:22ibdata1

  --将该表改变类型为MyISAM

  发现InnoDB表空间未回缩,但MyISAM占用磁盘容量减少为仅约8MB。此时该表数据占用空间222MB,索引占用空间8MB,InnoDB表空间914MB。

mysql>altertablemytable3enginemyisam;<br>  QueryOK,524288rowsaffected(8.51sec)<br>  Records:524288Duplicates:0Warnings:0<br>  mysql>selecttable_name,table_schema,data_length,index_lengthfrominformation_schema.tableswheretable_<br>name='mytable3';<br>  +------------+--------------+-------------+--------------+<br>  |table_name|table_schema|data_length|index_length|<br>  +------------+--------------+-------------+--------------+<br>  |mytable3|testbk|233308160|8528896|<br>  +------------+--------------+-------------+--------------+<br>  1rowinset(0.00sec)<br>  [mysql@testlocaltestbk]$ls-ltr<br>  total236456<br>  -rw-rw-r--1mysqlmysql3307Aug1912:30bak_testbk<br>  -rw-rw----1mysqlmysql8556Aug1919:35mytable.frm<br>  -rw-rw----1mysqlmysql8556Aug1920:43mytable2.frm<br>  -rw-rw----1mysqlmysql8618Aug2111:32mytable3.frm<br>  -rw-rw----1mysqlmysql233308160Aug2111:32mytable3.MYD<br>  -rw-rw----1mysqlmysql8528896Aug2111:32mytable3.MYI

  --重新改回InnoDB

  发现InnoDB表空间又扩充了。此时该表数据占用空间256MB,索引占用空间240MB,InnoDB表空间1034MB

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn