热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

mysql优化:Key_buffer_size

在mysql数据库中,mysqlkey_buffer_size是对MyISAM表性能影响最大的一个参数(注意该参数对其他类型的表设置无效),下面就将对mysqlKey_buffer_size参数的设置进行详细介绍
在mysql数据库中,mysql key_buffer_size是对MyISAM表性能影响最大的一个参数(注意该参数对其他类型的表设置无效),下面就将对mysql Key_buffer_size参数的设置进行详细介绍。

下面为一台以MyISAM为主要存储引擎服务器的配置:

mysql> show variables like 'key_buffer_size';
+-----------------+----------+
| Variable_name   | Value    |
+-----------------+----------+
| key_buffer_size | 72454144 |
+-----------------+----------+
1 row in set (0.25 sec)
分配了约70MB内存给mysql key_buffer_size,我们再看一下key_buffer_size的使用情况:


mysql> show global status like 'key_read%';
+-------------------+----------+
| Variable_name     | Value    |
+-------------------+----------+
| Key_read_requests | 39393115 |
| Key_reads         | 174565   |
+-------------------+----------+
2 rows in set (0.23 sec)
上面有2个结果值,这里解释一下它们各代表什么意思:


Key_read_requests:表示从缓存读取索引的请求次数

Key_reads:从磁盘读取索引的请求次数
知道了这2个参数各代表什么意思了,我们可以看到:一共有39393115个请求从缓存读取索引,174565个请求从磁盘读取索引。


让我们来计算一下索引未命中缓存的概率:

key_cache_miss_rate = Key_reads / Key_read_requests * 100%
通过上面的公式我们计算上面数据索引为命中缓存的概率值为:0.4431%,约250个索引读取请求就有一个直接读硬盘,这个值好像不是很理想。key_cache_miss_rate在0.1%以下都很好(每1000个请求有一个直接读硬盘),所以理论来上来说,这个比值越小越好,但过小的话,难免造成内存浪费。


key_cache_miss_rate 的值固然能一部分的说明key_buffer_size是否合理,但仅仅以此就说明该值设置的合理的话,就过于片面了。因为这里忽略了两个问题:

1、比例并不显示数量的绝对值大小

2、计数器并没有考虑时间因素

虽说Key_read_requests大比小好,但是对于系统调优而言,更有意义的应该是单位时间内的Key_reads,即:

Key_reads / Uptime
具体查看方法:


[root@li411-195 ~]# /usr/local/mysql/bin/mysqladmin ext -uroot -p -ri10 | grep Key_reads
Enter password: 
| Key_reads                      | 174983       |
| Key_reads                      | 10           |
| Key_reads                      | 0            |
| Key_reads                      | 4            |
| Key_reads                      | 0            |
| Key_reads                      | 0            |
| Key_reads                      | 0            |
| Key_reads                      | 0            |
| Key_reads                      | 0            |
| Key_reads                      | 0            |
| Key_reads                      | 0            |
| Key_reads                      | 21           |
| Key_reads                      | 0            |
| Key_reads                      | 0            |
注:命令里的mysqladmin ext其实就是mysqladmin extended-status,你甚至可以简写成mysqladmin e。


其中第一行表示的是汇总数值,所以这里不必考虑,下面的每行数值都表示10秒内的数据变化。

为啥数据按10秒取样,而不是直接按1秒取样?由于时间段过小,数据变化比较剧烈,不容易直观估计大小,所以通常数据按照10秒或者60秒之类的时间段来取样是更好的。

对于我这个小站来说,流量小,这个数据结果值并不能说明什么问题。

除些之外,我们还可以参考下key_blocks_*参数:

mysql> show global status like 'key_blocks_u%';
+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| Key_blocks_unused | 28271 |
| Key_blocks_used   | 34395 |
+-------------------+-------+
Key_blocks_unused表示未使用的缓存簇(blocks)数,Key_blocks_used表示曾经用到的最大的blocks数。从上面的数据可以看到Key_blocks_unused 并没有被完全使用,如果Key_blocks_unused 值为0,说明缓存都被使用了,要么增加key_buffer_size,要么就是过渡索引了,把缓存占满了。比较理想的设置:


Key_blocks_used / (Key_blocks_unused + Key_blocks_used) * 100% ≈ 80%
根据以上公式,上面数据的计算结果值大概为55%,说明这里设置也不是很合理。其实这里的值也存在一些问题,就是没有考虑到时间问题,这个数据可能是访问量少的时候获取的,如果访问量大的时候数据结果值可能就又不一样了,所以也不能仅凭这个结果值来判断key_buffer_size值设置是否合理。
推荐阅读
  • 2023年最佳PHP开发学习路径推荐
    本文详细探讨了针对不同背景的学习者如何选择最适合自己的PHP开发学习资源,包括书籍、在线课程及培训机构的推荐。 ... [详细]
  • 本文探讨了Web开发与游戏开发之间的主要区别,旨在帮助开发者更好地理解两种开发领域的特性和需求。文章基于作者的实际经验和网络资料整理而成。 ... [详细]
  • 在Linux系统上构建Web服务器的详细步骤
    本文详细介绍了如何在Linux系统上搭建Web服务器的过程,包括安装Apache、PHP和MySQL等关键组件,以及遇到的一些常见问题及其解决方案。 ... [详细]
  • 本文将详细介绍如何在ThinkPHP6框架中实现多数据库的部署,包括读写分离的策略,以及如何通过负载均衡和MySQL同步技术优化数据库性能。 ... [详细]
  • 初探Java编程:从入门到实践
    本文旨在为初学者提供Java编程的基础知识,涵盖程序、算法、流程图的概念,以及JDK环境的配置和Eclipse的使用方法。 ... [详细]
  • 本文探讨了大型服务端开发过程中常见的几个误区,包括异步任务处理不当、日志同步模式使用、网络操作未设置超时、缓存命中率及响应时间未统计、单一缓存模式、分布式缓存加锁不当以及团队管理上的误区,旨在帮助开发者避免这些常见错误。 ... [详细]
  • 本文介绍如何在Laravel框架中集成微信支付功能,包括如何配置微信支付环境、处理支付请求及接收支付回调等关键步骤。 ... [详细]
  • 推荐两款实用的网络诊断工具
    大家好,因为一些私事很久没有更新博客了。今天向大家介绍两款非常有用的网络诊断工具——Tracert和Telnet,帮助你更好地理解和解决网络问题。 ... [详细]
  • 在Java应用程序开发过程中,FTP协议被广泛用于文件的上传和下载操作。本文通过Jakarta Commons Net库中的FTPClient类,详细介绍如何实现文件的上传和下载功能。 ... [详细]
  • 三菱PLC SLMP协议报文详解
    本文详细解析了三菱PLC中使用的SLMP协议报文结构,包括其工作原理、通信流程及报文格式,旨在帮助工程师和技术人员更好地理解和运用这一协议。 ... [详细]
  • 使用C# .NET构建UDP点对点聊天应用
    本文详细介绍如何利用C# .NET框架开发一个基于UDP协议的点对点聊天程序,包括客户端与服务器之间的连接建立、数据传输等核心功能。 ... [详细]
  • 本指南详细介绍了如何在同一台计算机上配置多个GitHub账户,并使用不同的SSH密钥进行身份验证,确保每个账户的安全性和独立性。 ... [详细]
  • 微信小程序中实现位置获取的全面指南
    本文详细介绍了如何在微信小程序中实现地理位置的获取,包括通过微信官方API和腾讯地图API两种方式。文中不仅涵盖了必要的准备工作,如申请开发者密钥、下载并配置SDK等,还提供了处理用户授权及位置信息获取的具体代码示例。 ... [详细]
  • 本文探讨了如何通过WebBrowser控件在用户点击输入框时自动显示图片验证码。该过程可能涉及JavaScript事件的触发与响应。 ... [详细]
  • 使用LVS与ldirectord实现高可用负载均衡
    本文介绍了如何通过LVS(Linux Virtual Server)结合ldirectord工具来实现服务器的健康检查及负载均衡功能。环境设置包括一个LVS节点和两个真实服务器节点,通过配置ldirectord进行健康状态监测,确保系统的高可用性。 ... [详细]
author-avatar
布尔熊
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有