时间:2022-11-19 10:51:40 | 栏目:Mysql | 点击:次
(非聚集索引方式)与InnoDB底层存储(聚集索引方式)
Myisam 创建表后生成的文件有三个:
MYD:表里面的数据文件(myisam data)
MYI:表里面的索引文件(myisam index)
底层存储方式:
图片讲解得很清楚,大家可以结合图片看一下:
Innodb 创建表后生成的文件有两个:
底层存储方式:
图片讲解得很清楚,大家可以结合图片看一下:
Mysql 底层数据引擎以插件形式设计,最常见的是 Innodb 引擎和 Myisam 引擎,用户可以根据个人需求选择不同的引擎作为 Mysql 数据表的底层引擎。
MyISAM 存储引擎
不支持事务处理(transaction)
,不支持外键
。曾(MySQL 5.5及之前版本)是 MySQL 的默认存储引擎
。InnoDB 存储引擎
InnoDB
是为处理巨大数据量时的最大性能设计,支持ACID
事务,支持行级锁定。ACID:
MyISAM | InnoDB | |
---|---|---|
存储结构 | Myisam 创建表后生成的文件有三个,分别为: frm:创建表的语句 MYD:表里面的数据文件(myisam data) MYI:表里面的索引文件(myisam index) |
Innodb 创建表后生成的文件有两个,分别为: frm:创建表的语句 idb:表里面的数据+索引文件 |
存储空间 | MyISAM支持支持三种不同的存储格式:静态表(默认,但是注意数据末尾不能有空格,会被去掉)、动态表、压缩表。当表在创建之后并导入数据之后,不会再进行修改操作,可以使用压缩表,极大的减少磁盘的空间占用。 | 需要更多的内存和存储,它会在主内存中建立其专用的缓冲池用于高速缓冲数据和索引。 |
可移植性、备份及恢复 | 数据是以文件的形式存储,所以在跨平台的数据转移中会很方便。在备份和恢复时可单独针对某个表进行操作; MyISAM遇到错误,必须完整扫描后才能重建索引,或修正未写入硬盘的错误; MyISAM的修复时间,与数据量的多少成正比。 |
在数据量很大的时候就相对痛苦; InnoDB可借由事务记录档(Transaction Log)来恢复程序崩溃(crash),或非预期结束所造成的数据错误; InnoDB的修复时间,大略都是固定的。 |
索引 | 非聚集索引 ,MyISAM 是非聚集索引,数据文件是分离的,索引保存的是数据文件的指针。主键索引和辅助索引是独立的。 |
聚集索引 ,聚集索引的文件存放在主键索引的叶子节点上,因此 InnoDB 必须要有主键,通过主键索引效率很高。但是辅助索引需要两次查询,先查询到主键,然后再通过主键查询到数据。因此,主键不应该过大,因为主键太大,其他索引也都会很大。 |
事务支持 | 强调的是性能,每次查询具有原子性,其执行数度比InnoDB类型更快,但是不提供事务支持 。 |
提供事务支持 ,外部键等高级数据库功能。 具有事务(commit)、回滚(rollback)和崩溃修复能力(crash recovery capabilities)的事务安全(transaction-safe (ACID compliant))型表。 |
主键自增长 | 可以和其他字段一起建立联合索引。引擎的自动增长列必须是索引,如果是组合索引,自动增长可以不是第一列,他可以根据前面几列进行排序后递增。 | InnoDB中必须包含只有该字段的索引。引擎的自动增长列必须是索引,如果是组合索引也必须是组合索引的第一列。 |
锁的粒度 | 只支持表级锁 ,用户在操作myisam表时,select,update,delete,insert语句都会给表自动加锁,如果加锁以后的表满足insert并发的情况下,可以在表的尾部插入新的数据。 |
支持行级锁 。行锁大幅度提高了多用户并发操作的性能。但是InnoDB的行锁,只是在WHERE的主键是有效的,非主键的WHERE都会锁全表的。 |
全文索引 | 支持 FULLTEXT类型的全文索引 | 不支持FULLTEXT类型的全文索引,但是innodb可以使用sphinx插件支持全文索引,并且效果更好。 |
表主键 | 允许没有任何索引和主键的表存在,索引都是保存行的地址。 | 如果没有设定主键或者非空唯一索引,就会自动生成一个6字节的主键(用户不可见),数据是主索引的一部分,附加索引保存的是主索引的值。 |
存储表的具体行数 | 保存有表的总行数,如果select count() from table;会直接取出出该值。 | 没有保存表的总行数,如果使用select count(*) from table;就会遍历整个表,消耗相当大,但是在加了wehre条件后,myisam和innodb处理的方式都一样。 |
外键 | 不支持 | 支持,对一个包含外键的 InnoDB 表转为 MYISAM 会失败。 |
什么时候用MyISAM数据存储引擎?什么时候用InnoDB数据存储引擎?
《高性能MySQL》中写道:
总结: