1 什么是存储引擎?
MySQL中的数据用各种不同的技术存储在文件(或者内存)中。这些技术中的每一种技术都使用不同的存储机制、索引技巧、锁定水平并且最终提供广泛的不同的功能和能力。通过选择不同的技术,你能够获得额外的速度或者功能,从而改善你的应用的整体功能。 例如,如果你在研究大量的临时数据,你也许需要使用内存MySQL存储引擎。内存存储引擎能够在内存中存储所有的表格数据。又或者,你也许需要一个支持事务处理的数据库(以确保事务处理不成功时数据的回退能力)。这些不同的技术以及配套的相关功能在 MySQL中被称作存储引擎(也称作表类型)。 MySQL默认配置了许多不同的存储引擎,可以预先设置或者在MySQL服务器中启用。你可以选择适用于服务器、数据库和表格的存储引擎,以便在选择如何存储你的信息、如何检索这些信息以及你需要你的数据结合什么性能和功能的时候为你提供最大的灵活性。
2 几种常用引擎
2.1 MyISAM
优点:
写入和查询访问速度快
支持不同的存储方式:静态表、动态表、压缩表
静态表:表中的字段都是非变长字段的时候会采用静态表方式存储数据,优点存储非常迅速,容易缓存,出现故障容易恢复。缺点是占用空间固定,而且一般比较多
动态表:表中字段有变长时采用,优点是灵活,存储空间小。缺点是频繁的更新、删除数据容易产生碎片,需要定期执行OPTIMIZE TABLE来改善性能
压缩表:通过工具压缩表内容,因为每个记录是被单独压缩的,所以只有非常小的访问开支
非聚集索引,数据文件是分离的,索引保存的是数据文件的指针。主键索引和辅助索引是独立的
用一个变量保存了整个表的行数,执行select count(*) from table时只需要读出该变量即可,速度很快
缺点:
不支持事务
不支持外键
系统崩溃时,MyISAM恢复起来更困难,能否接受
2.2 InnoDB
优点:
支持进行事务处理。对于InnoDB每一条SQL语言都默认封装成事务,自动提交,这样会影响速度,所以最好把多条SQL语言放在begin和commit之间,组成一个事务
支持外键,如果把一张有外键的InnoDB表转换为MyISAM类型会失败
聚集索引,数据文件是和索引绑在一起的,必须要有主键,通过主键索引效率很高。但是辅助索引需要两次查询,先查询到主键,然后再通过主键查询到数据
支持自动增长列
一般情况下现在的MySQL的
缺点:
相比较MyISAM而言写操作效率差一些
会占用更多的磁盘空间以保留数据和索引
InnoDB不保存表的具体行数,执行select count(*) from table时需要全表扫描。
2.3 MEMORY
优点:
使用存在于内存中的内容来创建表,速度非常快
默认使用HASH索引
可以选择B-TREE或者HASH中的一种索引方法
缺点:
一旦服务关闭,表中的数据就会丢失掉
因为采用HASH索引,所以不支持like等范围查找
3 索引
索引是关系型数据库中给数据库表中一列或多列的值排序后的存储结构,根据索引来查询数据可以极大的加速查询的速度。索引分为多种,主要的有聚集索引、非聚集索引等。
一个没加主键没有索引的表,它的数据无序的放置在磁盘存储器上,一行一行的排列的很整齐。如果给表上了索引,那么表在磁盘上的存储结构就由整齐排列的结构转变成了抽象的树状结构,根据索引来进行排列。这种索引就叫做聚集索引。聚集索引是指在物理地址中的数据排列方式和索引值相同的索引。每次对表进行更新,都会按照聚集索引进行重新排序。一张表只能有一个聚集索引,主键是具有唯一性的聚集索引。
以表中其他字段为标准可以创建索引,这样的索引是非聚集索引。非聚集索引的出现是为了让某些非主键的查询也能变快。如果对一个字段创建非聚集索引,那么会在表中单独存放一张索引查找的表,结构一般应该也是B-TREE,这张非聚集索引表根据设置的字段进行排序,查询的结果指向聚集索引。再到聚集索引中查询数据。
在创建表的时候往往会看到下面的语句:
PRIMARY KEY (`ID`),
UNIQUE KEY `UK_OrderItemID_VoucherType_ProductType` (`OrderItemID`,`VoucherType`,`ProductType`),
KEY `IX_UpdateTime` (`UpdateTime`),
这里的PRIMARY KEY是主键,是约束唯一性的聚集索引;UNIQUE KEY是唯一性键,是拥有唯一性的非聚集索引;KEY是键,是非聚集索引。