存储引擎

mysql 给我们提供了很多存储引擎,常用的基本就两种MyISAM和InnoDB
MyIsam和InnoDB数据存储的区别
建立了不同存储引擎的表,进入mysql数据目录下查看一下文件结构
表名:table_innodb 存储引擎:InnoDB
表名:table_myisam 存储引擎:MyISAM
目录结构如下:
root@c107f74b8bb7:/var/lib/mysql/xdd_test# ls
db.opt
table_innodb.frm
table_innodb.ibd
table_myisam.MYD
table_myisam.MYI
table_myisam.frm
InnoDB:文件只有两个,frm是表结构文件,而ibd是索引和数据的文件
MyISAM:文件为三个,frm是表结构文件,MYI是索引文件,MYD是数据文件
聚集索引(聚簇索引):InnoDB主键索引和数据是在一起的,InnoDB为存储引擎的表必要有且只有一个主键索引,如果不设置系统会自己隐式建立一个,称之为聚集索引,而MyISAM是索引和数据是分开的也称非聚集索引
索引的结构不同


MyISAM 的主键索引和辅助索引区别不大,基本上都是通过b+树查找对于的索引,索引对应的叶子节点记录的是文件磁盘的地址,即MYI索引文件中查找,然后获取文件磁盘地址,直接到MYD文件中获取


InnoDB 的主键索引是必备的,且和数据是存放在一个文件中的,称为聚集索引(聚簇索引),即B+树的对应主键索引的叶子节点中放的是对应的数据,辅助索引B+树中辅助索引对应的叶子节点放的是主键索引,然后通过主键索引的b+树然后找到实际数据,所以InnoDB的主键索引异常重要,所有的索引都要走主键索引,索引主键索引要设计的精简,一般自增即可.
总结:
InnoDB 在做SELECT的时候,要维护的东西比MYISAM引擎多很多;
1)InnoDB 要缓存数据和索引,MyISAM只缓存索引块,这中间还有换进换出的减少
2)InnoDB先找主键索引,然后定位到行,MyISAM记录的直接是文件的OFFSET,定位比INNODB要快
主要区别
MyISAM
不需要事务支持(不支持)
并发相对较低(锁定机制问题,只支持表锁)
数据修改相对较少(阻塞问题),以读为主
数据一致性要求不是非常高
尽量索引(缓存机制)
调整读写优先级,根据实际需求确保重要操作更优先
启用延迟插入改善大批量写入性能
尽量顺序操作让insert数据都写入到尾部,减少阻塞
分解大的操作,降低单个操作的阻塞时间
降低并发数,某些高并发场景通过应用来进行排队机制
对于相对静态的数据,充分利用Query Cache可以极大的提高访问效率
MyISAM的Count只有在全表扫描的时候特别高效,带有其他条件的count都需要进行实际的数据访问
InnoDB
需要事务支持(具有较好的事务特性)
行级锁定对高并发有很好的适应能力,但需要确保查询是通过索引完成
数据更新较为频繁的场景
数据一致性要求较高
硬件设备内存较大,可以利用InnoDB较好的缓存能力来提高内存利用率,尽可能减少磁盘 IO
主键尽可能小,避免给Secondary index带来过大的空间负担
避免全表扫描,因为会使用表锁
尽可能缓存所有的索引和数据,提高响应速度
在大批量小插入的时候,尽量自己控制事务而不要使用autocommit自动提交
合理设置innodb_flush_log_at_trx_commit参数值,不要过度追求安全性
避免主键更新,因为这会带来大量的数据移动
参考链接:
https://blog.csdn.net/qq_27607965/article/details/79925288
Mysql锁机制:https://blog.csdn.net/zxh2075/article/details/83503012
网友评论