1、什么是存储引擎sql
存储引擎说白了就是如何存储数据、如何为存储的数据创建索引和如何更新、查询数据等技术的实现方法。由于在关系数据库中数据的存储是以表的形式存储的,因此存储引擎也能够称为表类型(即存储和操做此表的类型)。
在Oracle 和SQL Server等数据库中只有一种存储引擎,全部数据存储管理机制都是同样的。而MySql数据库提供了多种存储引擎。用户能够根据不一样的需求为数据表选择不一样的存储引擎,用户也能够根据本身的须要编写本身的存储引擎。数据库
2、MyISAM缓存
它不支持事务,也不支持外键,尤为是访问速度快,对事务完整性没有要求或者以SELECT、INSERT为主的应用基本均可以使用这个引擎来建立表。每一个MyISAM在磁盘上存储成3个文件,其中文件名和表名都相同,可是扩展名分别为:安全
一、tb_Demo.frm(存储表定义)服务器
二、tb_Demo.MYD(MYData,存储数据)并发
三、Tb_Demo.MYI(MYIndex,存储索引)工具
数据文件和索引文件能够放置在不一样的目录,平均分配IO,获取更快的速度。要指定数据文件和索引文件的路径,须要在建立表的时候经过DATA DIRECTORY和INDEX DIRECTORY语句指定,文件路径须要使用绝对路径。
每一个MyISAM表都有一个标志,服务器或myisamchk程序在检查MyISAM数据表时会对这个标志进行设置。MyISAM表还有一个标志用来代表该数据表在上次使用后是否是被正常的关闭了。若是服务器觉得当机或崩溃,这个标志能够用来判断数据表是否须要检查和修复。若是想让这种检查自动进行,能够在启动服务器时使用--myisam-recover现象。这会让服务器在每次打开一个MyISAM数据表是自动检查数据表的标志并进行必要的修复处理。MyISAM类型的表可能会损坏,可使用CHECK TABLE语句来检查MyISAM表的健康,并用REPAIR TABLE语句修复一个损坏到MyISAM表。性能
MyISAM的表还支持3种不一样的存储格式:优化
其中静态表是默认的存储格式。静态表中的字段都是非变长字段,这样每一个记录都是固定长度的,这种存储方式的优势是存储很是迅速,容易缓存,出现故障容易恢复;缺点是占用的空间一般比动态表多。静态表在数据存储时会根据列定义的宽度定义补足空格,可是在访问的时候并不会获得这些空格,这些空格在返回给应用以前已经去掉。同时须要注意:在某些状况下可能须要返回字段后的空格,而使用这种格式时后面到空格会被自动处理掉。spa
动态表包含变长字段,记录不是固定长度的,这样存储的优势是占用空间较少,可是频繁到更新删除记录会产生碎片,须要按期执行OPTIMIZE TABLE语句或myisamchk -r命令来改善性能,而且出现故障的时候恢复相对比较困难。
压缩表由myisamchk工具建立,占据很是小的空间,由于每条记录都是被单独压缩的,因此只有很是小的访问开支。
静态MyISAM:若是数据表中的各数据列的长度都是预先固定好的,服务器将自动选择这种表类型。由于数据表中每一条记录所占用的空间都是同样的,因此这种表存取和更新的效率很是高。当数据受损时,恢复工做也比较容易作。
动态MyISAM:若是数据表中出现varchar、xxxtext或xxxBLOB字段时,服务器将自动选择这种表类型。相对于静态MyISAM,这种表存储空间比较小,但因为每条记录的长度不一,因此屡次修改数据后,数据表中的数据就可能离散的存储在内存中,进而致使执行效率降低。同时,内存中也可能会出现不少碎片。所以,这种类型的表要常常用optimize table 命令或优化工具来进行碎片整理。
压缩MyISAM:以上说到的两种类型的表均可以用myisamchk工具压缩。这种类型的表进一步减少了占用的存储,可是这种表压缩以后不能再被修改。另外,由于是压缩数据,因此这种表在读取的时候要先时行解压缩。
可是,无论是何种MyISAM表,目前它都不支持事务,行级锁和外键约束的功能。
3、InnoDB
InnoDB存储引擎提供了具备提交、回滚和崩溃恢复能力的事务安全。可是对比MyISAM的存储引擎,InnoDB写的处理效率差一些而且会占用更多的磁盘空间以保留数据和索引。
一、自动增加列:
InnoDB表的自动增加列能够手工插入,可是插入的若是是空或0,则实际插入到则是自动增加后到值。能够经过"ALTER TABLE...AUTO_INCREMENT=n;"语句强制设置自动增加值的起始值,默认为1,可是该强制到默认值是保存在内存中,数据库重启后该值将会丢失。可使用LAST_INSERT_ID()查询当前线程最后插入记录使用的值。若是一次插入多条记录,那么返回的是第一条记录使用的自动增加值。
对于InnoDB表,自动增加列必须是索引。若是是组合索引,也必须是组合索引的第一列,可是对于MyISAM表,自动增加列能够是组合索引的其余列,这样插入记录后,自动增加列是按照组合索引到前面几列排序后递增的。
二、外键约束:
MySQL支持外键的存储引擎只有InnoDB,在建立外键的时候,父表必须有对应的索引,子表在建立外键的时候也会自动建立对应的索引。
在建立索引的时候,能够指定在删除、更新父表时,对子表进行的相应操做,包括restrict、cascade、set null和no action。其中restrict和no action相同,是指限制在子表有关联的状况下,父表不能更新;casecade表示父表在更新或删除时,更新或者删除子表对应的记录;set null 则表示父表在更新或者删除的时候,子表对应的字段被set null。
当某个表被其它表建立了外键参照,那么该表对应的索引或主键被禁止删除。
可使用set foreign_key_checks=0;临时关闭外键约束,set foreign_key_checks=1;打开约束。
4、MyISAM 和 InnoDB 的区别
虽然MySQL里的存储引擎不仅是MyISAM与InnoDB这两个,但经常使用的就是两个。
两种存储引擎的大体区别表如今:
一、InnoDB支持事务,MyISAM不支持,这一点是很是之重要。事务是一种高级的处理方式,如在一些列增删改中只要哪一个出错还能够回滚还原,而MyISAM就不能够了。
二、MyISAM适合查询以及插入为主的应用,InnoDB适合频繁修改以及涉及到安全性较高的应用。
三、InnoDB支持外键,MyISAM不支持。
四、从MySQL5.5.5之后,InnoDB是默认引擎。
五、InnoDB不支持FULLTEXT类型的索引。
六、InnoDB中不保存表的行数,如select count(*) from table时,InnoDB须要扫描一遍整个表来计算有多少行,可是MyISAM只要简单的读出保存好的行数便可。注意的是,当count(*)语句包含where条件时MyISAM也须要扫描整个表。
七、对于自增加的字段,InnoDB中必须包含只有该字段的索引,可是在MyISAM表中能够和其余字段一块儿创建联合索引。
八、清空整个表时,InnoDB是一行一行的删除,效率很是慢。MyISAM则会重建表。
九、InnoDB支持行锁(某些状况下仍是锁整表,如 update table set a=1 where user like '%lee%')。
4、关于MyISAM与InnoDB选择使用:
MYISAM和INNODB是Mysql数据库提供的两种存储引擎。二者的优劣可谓是各有千秋。INNODB会支持一些关系数据库的高级功能,如事务功能和行级锁,MYISAM不支持。MYISAM的性能更优,占用的存储空间少。因此,选择何种存储引擎,视具体应用而定:
一、若是你的应用程序必定要使用事务,毫无疑问你要选择INNODB引擎。但要注意,INNODB的行级锁是有条件的。在where条件没有使用主键时,照样会锁全表。好比DELETE FROM mytable这样的删除语句。
二、若是你的应用程序对查询性能要求较高,就要使用MYISAM了。MYISAM索引和数据是分开的,并且其索引是压缩的,能够更好地利用内存。因此它的查询性能明显优于INNODB。压缩后的索引也能节约一些磁盘空间。MYISAM拥有全文索引的功能,这能够极大地优化LIKE查询的效率。
如今通常都是选用innodb了,主要是myisam的全表锁,读写串行问题,并发效率锁表,效率低myisam对于读写密集型应用通常是不会去选用的。
关于Mysql数据库默认的存储引擎:
MyISAM和InnoDB是MySQL的两种存储引擎。
若是是默认安装,那就应该是InnoDB,你能够在my.cnf文件中找到default-storage-engine=INNODB;
固然你能够在建表时指定相应的存储引擎。
经过show create table xx 能够看见相应信息。
Mysql中InnoDB和MyISAM的比较
一、MyISAM:
每一个MyISAM在磁盘上存储成三个文件。第一个文件的名字以表的名字开始,扩展名指出文件类型。.frm文件存储表定义。数据文件的扩展名为.MYD (MYData)。
MyISAM表格能够被压缩,并且它们支持全文搜索。不支持事务,并且也不支持外键。若是事物回滚将形成不彻底回滚,不具备原子性。在进行update时进行表锁,并发量相对较小。若是执行大量的SELECT,MyISAM是更好的选择。
MyISAM的索引和数据是分开的,而且索引是有压缩的,内存使用率就对应提升了很多。能加载更多索引,而Innodb是索引和数据是紧密捆绑的,没有使用压缩从而会形成Innodb比MyISAM体积庞大很多。
MyISAM缓存在内存的是索引,不是数据。而InnoDB缓存在内存的是数据,相对来讲,服务器内存越大,InnoDB发挥的优点越大。
优势:查询数据相对较快,适合大量的select,能够全文索引。
缺点:不支持事务,不支持外键,并发量较小,不适合大量update。
二、InnoDB:
这种类型是事务安全的。.它与BDB类型具备相同的特性,它们还支持外键。InnoDB表格速度很快。具备比BDB还丰富的特性,所以若是须要一个事务安全的存储引擎,建议使用它。在update时表进行行锁,并发量相对较大。若是你的数据执行大量的INSERT或UPDATE,出于性能方面的考虑,应该使用InnoDB表。
优势:支持事务,支持外键,并发量较大,适合大量update。
缺点:查询数据相对较快,不适合大量的select。
对于支持事物的InnoDB类型的表,影响速度的主要缘由是AUTOCOMMIT默认设置是打开的,并且程序没有显式调用BEGIN 开始事务,致使每插入一条都自动Commit,严重影响了速度。能够在执行sql前调用begin,多条sql造成一个事物(即便autocommit打开也能够),将大大提升性能。
基本的差异为:
MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持。
MyISAM类型的表强调的是性能,其执行数度比InnoDB类型更快,可是不提供事务支持,而InnoDB提供事务支持已经外部键等高级数据库功能。
主要区别:
应用场景: