硬件对数据库性能优化带来的影响

  • 2019 年 11 月 6 日
  • 笔记

硬件对数据库性能优化带来的影响

数据库性能优化不是一个简单的任务,不仅仅是SQL层面的优化,它的关键在于对innodb存储引擎的了解,当然,好的存储引擎性能离不开好的硬件系统的支撑,这里我们从cpu,内存,磁盘等方面展开讨论

当前的数据库应用类型一般分为两个大类,分别是OLTP(online Transaction Process,在线事务处理)和OLAP(Online Analytical Processing,在线分析处理)两大类,这是两种截然不同的数据库应用,OLAP多用在数据仓库中,一般需要执行复杂的SQL语句来进行查询,OLTP多用在日常的事务处理中,例如银行交易、在线商品交易、blog、网游等等。相对于OLAP,OLTP的数据量一般比较小,下面我们看看不同的硬件对于这两种应用类型的影响。

CPU层面:

Innodb存储引擎一般都应用与OLTP的数据库应用,这种应用的特点如下:

用户的操作并发量大;

事务处理的时间一般比较短;

查询的语句较为简单,一般都走索引;

可以看出,OLTP的应用本身对CPU的要求并不高,因为复杂的查询可能需要执行比较、排序、连接查询等非常消耗CPU的操作,而这些操作在OLTP的数据库应用中较少发生。因此,我们把OLAP的应用称之为CPU密集型,而OLTP的应用称之为IO密集型,建议在OLTP应用的服务器配置上,将更多的之以礼放在提高IO的配置上,换句话说,在OLTP应用中,磁盘IO交互速度的重要性大于CPU核数。当然,如果可以,还是应该尽可能的配置好的CPU,我们知道,InnoDB的存储引擎主要的后台都是通过后台的线程来进行相关操作的,Innodb1.2版本之后,purge线程已经可以支持多个,如果采用多核心的CPU,可以通过修改MySQL中的参数Innodb_read_io_threads和innodb_write_io_threads来增大IO的线程,从而提高数据库的性能。OLTP的数据库应用操作一般比较简单,但是在高并发的场景下,多个CPU或者多核心的CPU更加合适。

内存方面:

内存的大小最能直接反应数据库的性能。一旦内存不够用,将会出现肉眼可见的性能问题,我们知道innodb存储引擎既缓存数据,也缓存索引,并且将它们都缓存在一个很大的缓冲池中,也就是常说的Innodb Buffer Pool,Percona公司已经实验证明了,随着缓存池的增大,数据库的TPS会直线增加,直到缓存池的大小已经大于数据文件本身的大小,所有对数据文件的操作都可以在内存中进行,这个时候的数据库性能是最优的,再持续增加缓存池并没有显著的提高。

当然,这里需要注意一点,缓冲池的大小大于数据文件的大小时,并不意味着当前数据库已经没有磁盘操作了,所有的数据都在内存中进行交互。数据库的缓冲池只是用来存放热点数据的区域,后台的线程还负责将脏页异步的刷新到磁盘中,此外,每次事务提交的时候,还需要和磁盘交互将redo log写入redo log 文件。

磁盘方面:

当前大多数数据库都采用的是SAS或者SATA接口的硬盘,传统的机械硬盘有两个重要的指标,一个是寻道时间,一个是转速,当前,机械硬盘的寻道时间已经可以做到3ms,转速为15000转没费中,然而,传统机械硬盘最大的问题在于读写磁头,读写磁头的设计使得硬盘可以不再像磁带一样,只能顺序访问,而是可以随机访问,但是随机访问的速度很慢,要话费大量的时间来进行磁头旋转和定位。

固态硬盘解决了传统硬盘的瓶颈,固态硬盘没有传统机械硬盘的读写磁头,内部由闪存组成,它具有低延迟,低功耗的优点,可以提供一致的随机访问时间。现在企业内一般使用并联多块闪存来进一步提高数据传输的吞吐量。当然,固态硬盘也不是没有缺点,固态硬盘中的闪存数据不可以更新,只能进行擦除操作,而这个擦书比较耗时,而且有次数限制。因此,在使用固态硬盘的时候,应该好好利用它的存储性能,避免过多的写入操作。