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

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

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

query_cache_size/query_cache_type (global)
    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)来缓存了。

  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 中,这时候你就知道该调整这个参数大小了。

本文来自投稿,不代表重蔚自留地立场,如若转载,请注明出处https://www.cwhello.com/4172.html

如有侵犯您的合法权益请发邮件951076433@qq.com联系删除

(0)
重蔚的头像重蔚管理团队
上一篇 2017年12月22日 00:00
下一篇 2017年12月29日 14:22

相关推荐

  • 我来说说ubuntu如何查询mongodb数据库存放路径。

    在Ubuntu系统中,可以通过以下命令查询MongoDB数据库存放路径:sudo find / -name 'mongod.lock' 2>/dev/null。 在Ubuntu系统中,我们可以通过以下步骤来查询MongoDB数据库的存放路径。 1、打开终端 我们需要打…

    2024年7月12日
    01
  • 小编分享免费网站空间申请怎么配置。

    在申请免费网站空间后,首先需要配置域名,可以在http://nic.eu.org申请一个永久免费的二级域名,或者申请freenom的一年免费域名。可以选择不同的平台进行网站空间的配置,如可乐博客推荐的profreehost和Z7的小站推…

    2024年7月10日
    03
  • PHP与数据库优化建议的集成。

    如今,在互联网领域,PHP和数据库已经成为开发者常用的技术。PHP与数据库的提高不仅仅意味着性能上的提高,即使在数据安全性和数据可靠性方面也将大大提高。因此,本文将探讨一些PHP和数据库方面的优化建议,以帮助…

    2023年5月21日
    04
  • PHP与数据库队列的集成。

    随着现代Web应用的发展,越来越多的需要将任务异步处理,以提高网站的性能和用户体验。其中一种常见的方式是使用队列系统,将需要处理的任务排队,然后由后台进程异步处理。而PHP和数据库都是Web开发中广泛使用的工…

    2023年5月21日
    07
  • MySQL的基本语法

    注释: 单行注释: #注释内容 单行注释: -- 注释内容(注意,两个“--”之后有一个空格) 多行注释: /*注释内容*/ 语句行: 一条语句也称为一条命令,通常用一个分号(;)结束;也可以通过"delimiter 新结束符" 命令…

    2017年11月21日
    0242
  • 说说html如何获取数据库的信息。

    HTML本身并不能直接获取数据库的信息,需要通过服务器端的编程语言(如PHP、Python、Java等)来连接数据库并获取数据,然后将数据传递给HTML页面进行展示,以下是使用PHP和MySQL数据库的示例: (图片来源网络,侵…

    2024年6月26日
    01
  • 关于oracle 导出指定表数据。

    Oracle导出指定表数据,可以使用expdp命令行工具。 Oracle数据库是一种广泛使用的企业级关系型数据库管理系统,它提供了丰富的功能和灵活的操作方式,在日常工作中,我们可能需要将数据库中的数据导出到其他格式,…

    2024年7月13日
    01
  • 聊聊MySQL个人信息表代码分享。

    在数据库设计中,个人信息表是最常见的一种数据表,它通常包含用户的基本信息,如姓名、性别、年龄、联系方式等,在MySQL中,我们可以通过SQL语句来创建和操作这种数据表,下面,我将详细介绍如何在MySQL中创建和使…

    2024年6月20日
    03

联系我们

QQ:951076433

在线咨询:点击这里给我发消息邮件:951076433@qq.com工作时间:周一至周五,9:30-18:30,节假日休息