数据库的存储引擎

问题一:存储引擎是什么?

字面意义上来讲存储引擎也就是数据的存储机制(外存 or 内存)、索引机制(主键索引时聚集索引还是非聚集索引)、锁定机制(表级锁定还是行级锁定)、事务机制(有 or 无)的区别。

问题二:数据库有哪些存储引擎?

MySIAM、InnoDB、NDB、Memory等等。

问题三:不同的存储引擎有什么区别?

MySAIM特点:

  1. 不支持事务,所以当你的业务场景对事务有要求不能使用MyISAM。

  2. 表级锁定,降低了锁的复杂度,但是同时也降低了并发性能。

  3. 读写互相阻塞,写入阻塞读,读阻塞写入,允许多读。

  4. 主键索引时非聚集索引,也就是说索引的叶子节点不存储数据,存储了数据的地址。

MySIAM支持的场景:

  1. 不支持事务的场景

  2. 并发度相对低(因为锁定机制是表级锁定)

  3. 以读为主,写的比较少

MySIAM最佳实践:

  1. 尽量索引(缓存机制)

  2. 调整读写优先级,根据实际需求确保重要操作更优先

  3. 启用延迟插入改善大批量写入性能

  4. 尽量顺序操作让insert数据都写入到尾部,减少阻塞(因为表级锁定)

  5. 分解大的操作,降低单个操作的阻塞时间(因为表级锁定)

  6. 降低并发数,某些高并发场景通过应用来进行排队机制

  7. 对于相对静态的数据,充分利用Query Cache可以极大的提高访问效率

  8. MyISAM的Count只有在全表扫描的时候特别高效,带有其他条件的count都需要进行实际的数据访问

InnoDB特性:

  1. 支持事务,支持事务的四个隔离级别。

  2. 行级锁定,提高并发性能。

  3. 聚集索引,索引的叶子节点存储了数据。

  4. 读写阻塞与事务隔离级别相关

InnoDB支持的场景:

  1. 需要事务支持(具有较好的事务特性)

  2. 并发性能要求较高的场景,行级锁定对高并发有很好的适应能力

  3. 数据更新较为频繁的场景

  4. 数据一致性要求较高

  5. 硬件设备内存较大,可以利用InnoDB较好的缓存能力来提高内存利用率,尽可能减少磁盘 IO

InnoDB最佳实践

  1. 主键尽可能小,避免给Secondary index带来过大的空间负担

  2. 避免全表扫描,因为会使用表锁

  3. 尽可能缓存所有的索引和数据,提高响应速度

  4. 在大批量小插入的时候,尽量自己控制事务而不要使用autocommit自动提交

  5. 合理设置innodb_flush_log_at_trx_commit参数值,不要过度追求安全性

  6. 避免主键更新,因为这会带来大量的数据移动

NDBCluster特性:

  1. 分布式:分布式存储引擎,可以由多个NDBCluster存储引擎组成集群分别存放整体数据的一部分

  2. 支持事务:和Innodb一样,支持事务

  3. 可与mysqld不在一台主机:可以和mysqld分开存在于独立的主机上,然后通过网络和mysqld通信交互

  4. 内存需求量巨大:新版本索引以及被索引的数据必须存放在内存中,老版本所有数据和索引必须存在与内存中

NBD适用场景

  1. 具有非常高的并发需求

  2. 对单个请求的响应并不是非常的critical

  3. 查询简单,过滤条件较为固定,每次请求数据量较少,又不希望自己进行水平Sharding

NDB最佳实践

  1. 尽可能让查询简单,避免数据的跨节点传输

  2. 尽可能满足SQL节点的计算性能,大一点的集群SQL节点会明显多余Data节点

  3. 在各节点之间尽可能使用万兆网络环境互联,以减少数据在网络层传输过程中的延时

Memory(heap):这种类型的数据表只存在于内存中。它使用散列索引,所以数据的存取速度非常快。因为是存在于内存中,所以这种类型常应用于临时表中。


http://pangge.blog.51cto.com/6013757/1303893



你可能感兴趣的:(数据库的存储引擎)