MySQL数据库性能优化之一(缓存参数优化)

       数据库属于 IO密集型的应用程序,其主要职责就是数据的管理及存储工做。而咱们知道,从内存中读取一个数据库的时间是微秒级别,而从一块普通硬盘上读取一个IO是在毫秒级别,两者相差3个数量级。因此,要优化数据库,首先第一步须要优化的就是 IO,尽量将磁盘IO转化为内存IO。本文先从 MySQL 数据库IO相关参数(缓存参数)的角度来看看能够经过哪些参数进行IO优化:算法

  query_cache_size/query_cache_type (global)sql

  Query cache 做用于整个 MySQL Instance,主要用来缓存 MySQL 中的 ResultSet,也就是一条SQL语句执行的结果集,因此仅仅只能针对select语句。当咱们打开了 Query Cache 功能,MySQL在接受到一条select语句的请求后,若是该语句知足Query Cache的要求(未显式说明不容许使用Query Cache,或者已经显式申明须要使用Query Cache),MySQL 会直接根据预先设定好的HASH算法将接受到的select语句以字符串方式进行hash,而后到Query Cache 中直接查找是否已经缓存。也就是说,若是已经在缓存中,该select请求就会直接将数据返回,从而省略了后面全部的步骤(如 SQL语句的解析,优化器优化以及向存储引擎请求数据等),极大的提升性能。数据库

  固然,Query Cache 也有一个致命的缺陷,那就是当某个表的数据有任何任何变化,都会致使全部引用了该表的select语句在Query Cache 中的缓存数据失效。因此,当咱们的数据变化很是频繁的状况下,使用Query Cache 可能会得不偿失。缓存

  Query Cache的使用须要多个参数配合,其中最为关键的是 query_cache_size 和 query_cache_type ,前者设置用于缓存 ResultSet 的内存大小,后者设置在何场景下使用 Query Cache。在以往的经验来看,若是不是用来缓存基本不变的数据的MySQL数据库,query_cache_size 通常 256MB 是一个比较合适的大小。固然,这能够经过计算Query Cache的命中率(Qcache_hits/(Qcache_hits+Qcache_inserts)*100))来进行调整。query_cache_type能够设置为0(OFF),1(ON)或者2(DEMOND),分别表示彻底不使用query cache,除显式要求不使用query cache(使用sql_no_cache)以外的全部的select都使用query cache,只有显示要求才使用query cache(使用sql_cache)。数据结构

  binlog_cache_size (global)性能

  Binlog Cache 用于在打开了二进制日志(binlog)记录功能的环境,是 MySQL 用来提升binlog的记录效率而设计的一个用于短期内临时缓存binlog数据的内存区域。优化

  通常来讲,若是咱们的数据库中没有什么大事务,写入也不是特别频繁,2MB~4MB是一个合适的选择。可是若是咱们的数据库大事务较多,写入量比较大,可与适当调高binlog_cache_size。同时,咱们能够经过binlog_cache_use 以及 binlog_cache_disk_use来分析设置的binlog_cache_size是否足够,是否有大量的binlog_cache因为内存大小不够而使用临时文件(binlog_cache_disk_use)来缓存了。spa

  key_buffer_size (global)设计

  Key Buffer 多是你们最为熟悉的一个 MySQL 缓存参数了,尤为是在 MySQL 没有更换默认存储引擎的时候,不少朋友可能会发现,默认的 MySQL 配置文件中设置最大的一个内存参数就是这个参数了。key_buffer_size 参数用来设置用于缓存 MyISAM存储引擎中索引文件的内存区域大小。若是咱们有足够的内存,这个缓存区域最好是可以存放下咱们全部的 MyISAM 引擎表的全部索引,以尽量提升性能。日志

  此外,当咱们在使用MyISAM 存储的时候有一个及其重要的点须要注意,因为 MyISAM 引擎的特性限制了他仅仅只会缓存索引块到内存中,而不会缓存表数据库块。因此,咱们的 SQL 必定要尽量让过滤条件都在索引中,以便让缓存帮助咱们提升查询效率。

  bulk_insert_buffer_size (thread)

  和key_buffer_size同样,这个参数一样也仅做用于使用 MyISAM存储引擎,用来缓存批量插入数据的时候临时缓存写入数据。当咱们使用以下几种数据写入语句的时候,会使用这个内存区域来缓存批量结构的数据以帮助批量写入数据文件:

  insert … select …


  insert … values (…) ,(…),(…)…


  load data infile… into… (非空表)

  innodb_buffer_pool_size(global)

  当咱们使用InnoDB存储引擎的时候,innodb_buffer_pool_size 参数多是影响咱们性能的最为关键的一个参数了,他用来设置用于缓存 InnoDB 索引及数据块的内存区域大小,相似于 MyISAM 存储引擎的 key_buffer_size 参数,固然,可能更像是 Oracle 的 db_cache_size。简单来讲,当咱们操做一个 InnoDB 表的时候,返回的全部数据或者去数据过程当中用到的任何一个索引块,都会在这个内存区域中走一遭。

  和key_buffer_size 对于 MyISAM 引擎同样,innodb_buffer_pool_size 设置了 InnoDB 存储引擎需求最大的一块内存区域的大小,直接关系到 InnoDB存储引擎的性能,因此若是咱们有足够的内存,尽可将该参数设置到足够打,将尽量多的 InnoDB 的索引及数据都放入到该缓存区域中,直至所有。

  咱们能够经过 (Innodb_buffer_pool_read_requests – Innodb_buffer_pool_reads) / Innodb_buffer_pool_read_requests * 100% 计算缓存命中率,并根据命中率来调整 innodb_buffer_pool_size 参数大小进行优化。

  innodb_additional_mem_pool_size(global)

  这个参数咱们平时调整的可能不是太多,不少人都使用了默认值,可能不少人都不是太熟悉这个参数的做用。innodb_additional_mem_pool_size 设置了InnoDB存储引擎用来存放数据字典信息以及一些内部数据结构的内存空间大小,因此当咱们一个MySQL Instance中的数据库对象很是多的时候,是须要适当调整该参数的大小以确保全部数据都能存放在内存中提升访问效率的。

  这个参数大小是否足够仍是比较容易知道的,由于当太小的时候,MySQL 会记录 Warning 信息到数据库的 error log 中,这时候你就知道该调整这个参数大小了。

             想必各位看了这篇文章以后必定会有所收货,若想了解更多相关知识请继续锁定希赛系统学院