问题一:存储引擎是什么?
字面意义上来讲存储引擎也就是数据的存储机制(外存 or 内存)、索引机制(主键索引时聚集索引还是非聚集索引)、锁定机制(表级锁定还是行级锁定)、事务机制(有 or 无)的区别。
问题二:数据库有哪些存储引擎?
MySIAM、InnoDB、NDB、Memory等等。
问题三:不同的存储引擎有什么区别?
MySAIM特点:
不支持事务,所以当你的业务场景对事务有要求不能使用MyISAM。
表级锁定,降低了锁的复杂度,但是同时也降低了并发性能。
读写互相阻塞,写入阻塞读,读阻塞写入,允许多读。
主键索引时非聚集索引,也就是说索引的叶子节点不存储数据,存储了数据的地址。
MySIAM支持的场景:
不支持事务的场景
并发度相对低(因为锁定机制是表级锁定)
以读为主,写的比较少
MySIAM最佳实践:
尽量索引(缓存机制)
调整读写优先级,根据实际需求确保重要操作更优先
启用延迟插入改善大批量写入性能
尽量顺序操作让insert数据都写入到尾部,减少阻塞(因为表级锁定)
分解大的操作,降低单个操作的阻塞时间(因为表级锁定)
降低并发数,某些高并发场景通过应用来进行排队机制
对于相对静态的数据,充分利用Query Cache可以极大的提高访问效率
MyISAM的Count只有在全表扫描的时候特别高效,带有其他条件的count都需要进行实际的数据访问
InnoDB特性:
支持事务,支持事务的四个隔离级别。
行级锁定,提高并发性能。
聚集索引,索引的叶子节点存储了数据。
读写阻塞与事务隔离级别相关
InnoDB支持的场景:
需要事务支持(具有较好的事务特性)
并发性能要求较高的场景,行级锁定对高并发有很好的适应能力
数据更新较为频繁的场景
数据一致性要求较高
硬件设备内存较大,可以利用InnoDB较好的缓存能力来提高内存利用率,尽可能减少磁盘 IO
InnoDB最佳实践
主键尽可能小,避免给Secondary index带来过大的空间负担
避免全表扫描,因为会使用表锁
尽可能缓存所有的索引和数据,提高响应速度
在大批量小插入的时候,尽量自己控制事务而不要使用autocommit自动提交
合理设置innodb_flush_log_at_trx_commit参数值,不要过度追求安全性
避免主键更新,因为这会带来大量的数据移动
NDBCluster特性:
分布式:分布式存储引擎,可以由多个NDBCluster存储引擎组成集群分别存放整体数据的一部分
支持事务:和Innodb一样,支持事务
可与mysqld不在一台主机:可以和mysqld分开存在于独立的主机上,然后通过网络和mysqld通信交互
内存需求量巨大:新版本索引以及被索引的数据必须存放在内存中,老版本所有数据和索引必须存在与内存中
NBD适用场景
具有非常高的并发需求
对单个请求的响应并不是非常的critical
查询简单,过滤条件较为固定,每次请求数据量较少,又不希望自己进行水平Sharding
NDB最佳实践
尽可能让查询简单,避免数据的跨节点传输
尽可能满足SQL节点的计算性能,大一点的集群SQL节点会明显多余Data节点
在各节点之间尽可能使用万兆网络环境互联,以减少数据在网络层传输过程中的延时
Memory(heap):这种类型的数据表只存在于内存中。它使用散列索引,所以数据的存取速度非常快。因为是存在于内存中,所以这种类型常应用于临时表中。