存储引擎
MySQL中的数据用各种不同的技术存储在文件(或者内存)中,每一种技术都使用不同的存储机制、索引技巧、锁定水平并且最终提供广泛的不同的功能和能力。选择合适的存储引擎往往能够有效的提高数据库的性能和数据的访问效率,一个数据库中的多个表可以使用不同引擎的组合以满足各种性能和实际需求。
常用存储引擎
- MyISAM
- InnoDB
MyISAM特点
每个MyISAM在磁盘上存储成3个文件,其中文件名和表名都相同,但是扩展名不同,分别为:
.frm(存储表结构信息)
MYD(MYData,存储数据)
MYI(MYIndex,存储索引)
8.0以后.frm 调整为了 .sdi
frm和MYI可以存放在不同的目录下,为非聚集索引。MYI文件用来存储索引,但仅保存记录所在页的磁盘文件指针地址,索引的结构是B+树结构。
这个存储引擎通过MYI的B+树结构来查找记录页,再根据记录页查找记录。并且支持全文索引、B树索引和数据压缩。
MyISAM基于ISAM存储引擎,并对其进行扩展。它是在Web、数据仓储和其他应用环境下最常使用的存储引擎之一。MyISAM拥有较高的插入、查询速度,但不支持事务。它是表级锁(插入修改锁表),因此当INSERT或UPDATE数据时即写操作需要锁定整个表,效率便会低一些。
不过和Innodb不同,MyIASM中存储了表的行数,于是SELECT COUNT(*) FROM TABLE时只需要直接读取已经保存好的值而不需要进行全表扫描。
如果表的读操作远远多于写操作且不需要数据库事务的支持,那么MyIASM也是很好的选择。
Innodb特点
每个InnoDB在磁盘上存储成2个文件
.frm(存储表定义)
ibd(数据和索引文件)
8以后.frm已经移除
InnoDB的数据文件本身就是索引文件。MyISAM索引文件和数据文件是分离的,索引文件仅保存数据记录的地址。而在InnoDB中,表数据文件本身就是按B+Tree组织的一个索引结构,这棵树的叶节点data域保存了完整的数据记录。这个索引的key是数据表的主键,因此InnoDB表数据文件本身就是主索引.
图是InnoDB主索引(同时也是数据文件)的示意图,可以看到叶节点包含了完整的数据记录。这种索引叫做聚集索引。因为InnoDB的数据文件本身要按主键聚集,所以InnoDB要求表必须有主键(MyISAM可以没有),如果没有显式指定,则MySQL系统会自动选择一个可以唯一标识数据记录的列作为主键,如果不存在这种列,则MySQL自动为InnoDB表生成一个隐含字段作为主键,这个字段长度为6个字节,类型为长整形。
与MyISAM索引的不同是InnoDB的辅助索引data域存储相应记录主键的值而不是地址。换句话说,InnoDB的所有辅助索引都引用主键作为data域。
聚集索引这种实现方式使得按主键的搜索十分高效,但是辅助索引搜索需要检索两遍索引:先检索辅助索引获得主键,然后用主键到主索引中检索获得记录。
针对事务的支持,事务(ACID),行级锁,外键;使用MVCC多版本控制器来控制事务。
为什么不建议使用过长的字段作为主键
辅助索引数据域存储的也是相应记录主键的值而不是地址,所有辅助索引都引用主索引,过长的主索引会令辅助索引变得过大。
为什么建议主键使用自增有序的主键作为主索引
因为InnoDB数据文件本身是一颗B+Tree,非递增的主键会造成在插入新记录时数据文件为了维持B+Tree的特性而频繁的分裂调整,十分低效。
MyISAM 和InnoDB 区别
1.myisam不支持事务;innodb支持事务。
2.myisam不支持外键;Innodb支持外键。
3.myisam支持表级锁(不支持高并发,以读为主);innodb支持行锁(共享锁,排它锁,意向锁),粒度更小,但是在执行不能确定扫描范围的sql语句时,innodb同样会锁全表。
4.执行大量select,myisam是最好的选择;执行大量的update和insert最好用innodb。
5.myisam在磁盘上存储上有三个文件.frm(存储表定义) .myd(存储表数据) .myi(存储表索引);innodb磁盘上存储的是表空间数据文件和日志文件,innodb表大小只受限于操作系统大小。
6.myisam使用非聚集索引,索引和数据分开,只缓存索引;innodb使用聚集索引,索引和数据存在一个文件。
7.myisam保存表具体行数;innodb不保存。
8.delete from table时,innodb不会重新简历表,而会一行一行的删除。