主页 > MySQL教程 > 正文

MyISAM 和 innodb 比较

MyISAM 是MySQL中默许的存储引擎,一般来说不是有太多人关怀这个东西。决议


运用什么样的存储引擎是一个很tricky的工作,可是仍是值咱们去研究一下,这


里的文章只考虑 MyISAM 和InnoDB这两个,因为这两个是最常见的。   

  

下面先让咱们答复一些问题:   

◆你的数据库有外键吗?   

◆你需求业务支撑吗?   

◆你需求全文索引吗?   

◆你常常运用什么样的查询方式?   

◆你的数据有多大?   

  

myisam只需索引缓存   

  

innodb不分索引文件数据文件 innodb buffer   

  

myisam只能办理索引,在索引数据大于分配的资源时,会由操作体系来cache;


数据文件依赖于操作体系的cache。innodb不管是索引仍是数据,都是自己来管


理   

  

考虑上面这些问题能够让你找到适合的方向,但那并不是肯定的。假如你需求事


务处理或是外键,那么InnoDB 或许是比较好的办法。假如你需求全文索引,那


么一般来说 MyISAM是好的挑选,因为这是体系内建的,可是,咱们其实并不会


常常地去测验两百万行记载。所以,就算是慢一点,咱们能够经过运用Sphinx从 


InnoDB中取得全文索引。   

  

数据的巨细,是一个影响你挑选什么样存储引擎的重要要素,大尺度的数据集趋


向于挑选InnoDB 办法,因为其支撑业务处理和毛病康复。数据库的在小决议了


毛病康复的时刻长短,InnoDB能够运用业务日志进行数据康复,这会比较快。而


MyISAM或许会需求几个小时乃至几天来干这些事,InnoDB只需求几分钟。   

  

您操作数据库表的习气或许也会是一个对功能影响很大的要素。比方: COUNT() 


在 MyISAM 表中会十分快,而在InnoDB 表下或许会很苦楚。而主键查询则在


InnoDB下会适当适当的快,但需求当心的是假如咱们的主键太长了也会导致功能


问题。大批的inserts 句子在 MyISAM下会快一些,可是updates 在InnoDB 下会


更快一些——尤其在并发量大的时分。   

  

所以,究竟你检运用哪一个呢?依据经历来看,假如是一些小型的运用或项目,


那么MyISAM 或许会更适合。当然,在大型的环境下运用 MyISAM 也会有很大成


功的时分,但却不总是这样的。假如你正在计划运用一个超大数据量的项目,而


且需求业务处理或外键支撑,那么你真的应该直接运用 InnoDB办法。但需求记


住InnoDB 的表需求更多的内存和存储,转化100GB 的MyISAM 表到InnoDB 表可


能会让你有十分坏的体会。   

  

===========================================================   

  

MyISAM: 这个是默许类型,它是根据传统的ISAM类型,ISAM是 Indexed 


Sequential Access Method (有索引的次序拜访办法) 的缩写,它是存储记载和


文件的规范办法.与其他存储引擎比较,MyISAM具有查看和修正表格的大多数东西


. MyISAM表格能够被紧缩,并且它们支撑全文查找.它们不是业务安全的,并且也


不支撑外键。假如事物回滚将构成不完全回滚,不具有原子性。假如履行很多的


SELECT,MyISAM是更好的挑选。   

  

InnoDB:这种类型是业务安全的.它与BDB类型具有相同的特性,它们还支撑外


键.InnoDB表格速度很快.具有比BDB还丰厚的特性,因而假如需求一个业务安全的


存储引擎,主张运用它.假如你的数据履行很多的INSERT或 UPDATE,出于功能方面


的考虑,应该运用InnoDB表,   

  

关于支撑事物的InnoDB类型的标,影响速度的首要原因是 AUTOCOMMIT默许设置


是翻开的,并且程序没有显式调用BEGIN 开端业务,导致每刺进一条都主动


Commit,严重影响了速度。能够在履行sql前调用begin,多条sql构成一个事物


(即便autocommit翻开也能够),将大大提高功能。   

  

===============================================================   

  

InnoDB和MyISAM是在运用MySQL最常用的两个表类型,各有优缺点,视详细运用


而定。下面是已知的两者之间的不同,仅供参考。   

  

innodb   

InnoDB 给 MySQL 供给了具有业务(commit)、回滚(rollback)和溃散修正才干 


(crash recovery capabilities)的业务安全(transaction-safe (ACID 


compliant))型表。 InnoDB 供给了行锁(locking on row level),供给与 


Oracle 类型共同的不加锁读取(non- locking read in SELECTs)。这些特性均


提高了多用户并发操作的功能体现。在InnoDB表中不需求扩展确认 (lock 


escalation),因为 InnoDB 的列确认(row level locks)适合十分小的空间。 


InnoDB 是 MySQL 上第一个供给外键束缚(FOREIGN KEY constraints)的表引擎


。   

  

InnoDB 的规划方针是处理大容量数据库体系,它的 CPU 运用率是其它根据磁盘


的联络数据库引擎所不能比的。在技能上,InnoDB 是一套放在 MySQL 后台的完


整数据库体系,InnoDB 在主内存中树立其专用的缓冲池用于高速缓冲数据和索


引。 InnoDB 把数据和索引寄存在表空间里,或许包含多个文件,这与其它的不


相同,举例来说,在 MyISAM 中,表被寄存在独自的文件中。InnoDB 表的巨细


只受限于操作体系的文件巨细,一般为 2 GB。   

InnoDB一切的表都保存在同一个数据文件 ibdata1 中(也或许是多个文件,或


者是独立的表空间文件),相对来说比较欠好备份,免费的计划能够是复制数据


文件、备份 binlog,或许用 mysqldump。   

  

  

MyISAM   

MyISAM 是MySQL缺省存贮引擎 .   

  

每张MyISAM 表被寄存在三个文件 。frm 文件寄存表格界说。 数据文件是MYD 


(MYData) 。 索引文件是 MYI (MYIndex) 引伸。   

  

因为MyISAM相对简略所以在功率上要优于InnoDB..小型运用运用MyISAM是不错的


挑选.   

  

MyISAM表是保存成文件的方式,在跨渠道的数据搬运中运用MyISAM存储会省去不


少的费事   

  

以下是一些细节和详细完成的不同:   

  

1.InnoDB不支撑FULLTEXT类型的索引。   

2.InnoDB 中不保存表的详细行数,也就是说,履行select count(*) from 


table时,InnoDB要扫描一遍整个表来核算有多少行,可是MyISAM只需简略的读


出保存好的行数即可。留意的是,当count(*)句子包含 where条件时,两种表的


操作是相同的。   

3.关于AUTO_INCREMENT类型的字段,InnoDB中有必要包含只需该字段的索引,可是


在MyISAM表中,能够和其他字段一同树立联合索引。   

4.DELETE FROM table时,InnoDB不会从头树立表,而是一行一行的删去。   

5.LOAD TABLE FROM MASTER操刁难InnoDB是不起作用的,解决办法是首先把


InnoDB表改成MyISAM表,导入数据后再改成InnoDB表,可是关于运用的额定的


InnoDB特性(例如外键)的表不适用。   

  

别的,InnoDB表的行锁也不是肯定的,假如在履行一个SQL句子时MySQL不能确认


要扫描的规模,InnoDB表同样会锁全表,例如 update table set num=1 where 


name like “%aaa%”   

  

任何一种表都不是全能的,只用恰当的针对业务类型来挑选适合的表类型,才干


最大的发挥MySQL的功能优势。   

  

===============================================================   

  

  

以下是InnoDB和MyISAM的一些联络和差异!   

  

1. 4.0以上mysqld都支撑业务,包含非max版别。3.23的需求max版别mysqld才干


支撑业务。   

  

2. 创立表时假如不指定type则默许为myisam,不支撑业务。   

能够用 show create table tablename 指令看表的类型。   

  

2.1 对不支撑业务的表做start/commit操作没有任何作用,在履行commit前现已


提交,测验:   

履行一个msyql:   

use test;   

drop table if exists tn;   

create table tn (a varchar(10)) type=myisam;   

drop table if exists ty;   

create table ty (a varchar(10)) type=innodb;   

  

begin;   

insert into tn values(‘a’);   

insert into ty values(‘a’);   

select * from tn;   

select * from ty;   

都能看到一条记载   

  

履行另一个mysql:   

use test;   

select * from tn;   

select * from ty;   

只需tn能看到一条记载   

然后在另一边   

commit;   

才都能看到记载。   

  

3. 能够履行以下指令来切换非业务表到业务(数据不会丢掉),innodb表比


myisam表更安全:   

   alter table tablename type=innodb;   

  

3.1 innodb表不能用repair table指令和myisamchk -r table_name   

但能够用check table,以及mysqlcheck [OPTIONS] database [tables]   

  

==============================================================   

  

mysql中运用select for update的有必要针对InnoDb,并且是在一个业务中,才干


起作用。   

  

select的条件不相同,选用的是行级锁仍是表级锁也不相同。   

转http://www.neo.com.tw/archives/900 的阐明   

  

因为InnoDB 预设是Row-Level Lock,所以只需「清晰」的指定主键,MySQL 才


会履行Row lock (只锁住被选取的材料例) ,不然MySQL 将会履行Table Lock (


将整个材料表单给锁住)。   

  

  

举个比如:   

  

假设有个表单products ,里边有id 跟name 二个栏位,id 是主键。   

  

例1: (清晰指定主键,并且有此笔材料,row lock)   

  

SELECT * FROM products WHERE id=’3′ FOR UPDATE;   

  

例2: (清晰指定主键,若查无此笔材料,无lock)   

  

SELECT * FROM products WHERE id=’-1′ FOR UPDATE;   

  

例2: (无主键,table lock)   

  

SELECT * FROM products WHERE name=’Mouse’ FOR UPDATE;   

  

例3: (主键不清晰,table lock)   

  

SELECT * FROM products WHERE id<>’3′ FOR UPDATE;   

  

例4: (主键不清晰,table lock)   

  

SELECT * FROM products WHERE id LIKE ’3′ FOR UPDATE;   

  

注1:   

FOR UPDATE 仅适用于InnoDB,且有必要在买卖区块(BEGIN/COMMIT)中才干收效

 


上一篇:第一页
下一篇:mysql 中数据类型tinyint(2)括号中的数字意思

PythonTab微信大众号:

Python技能交流合作群 ( 请勿加多个群 ):

群1: 87464755

群2: 333646237

群3: 318130924

群4: 385100854