php - MySQL 高 CPU 使用率会降低服务器速度,如何优化我的查询?
问题描述
当我每秒从 MySQL 数据库中读取多个客户端的数据时遇到问题,MySQL CPU 使用率上升到 26-27%,之后我的其他测量实时数据并将其记录到数据库中的服务变慢/崩溃。
所以我在同一台服务器上运行两个不同的 Web 应用程序:
应用程序 1 是一个网页,它每秒循环地将数据插入数据库。当只有这个服务运行 MySQL CPU 使用率大约是 1,8-2,0% 并且内存使用率大约是 275 MB 并且一切都运行顺利并且数据被记录在数据库中。所以我认为日志记录部分不是问题。
应用程序 2 也是一个网页,它周期性地从数据库中读取数据并将其显示给用户(从数据中呈现图形),并且它也每秒执行一次(因此该服务向用户显示由应用程序 1 存储在数据库中的实时数据) . 当打开页面时,JavaScript 调用带有 xmlhttprequests 的 php-page 和 php-page 从 MySQL 数据库中获取数据。当我的页面中有 6 个不同的图表时(每秒更新一次,因此一个客户端每秒执行 6 个查询(xmlhttprequest 到 php-page)) MySQL CPU 使用率提高到 11,0-12,0%,内存使用率保持在相同。所以现在我的两个应用程序都在运行,一切都照常进行:其他应用程序每秒将数据存储在 MySQL 中,其他应用程序每秒获取数据并将其显示给客户端。
但是,当另一个客户端出现时(例如在移动设备上使用浏览器打开应用程序 2 或仅在具有相同浏览器窗口的两个选项卡中打开应用程序 2)MySQL CPU 使用率上升到 24,0-26,0% 内存使用率与以前大致相同,并且我的应用程序 1 不再正常工作.. 它仍然每秒存储数据,这不是问题,但我要存储的数据是实时测量数据,并且由于 CPU 使用率高,这个测量部分超时,所以值是现在存储的不是正确的(上次测量值被一次又一次地存储)。
所以我想要实现的是降低来自应用程序 2 的 MySQL 查询导致的 CPU 使用率,以便即使应用程序 2 中有多个客户端,我的应用程序 1 仍然可以工作。
这是我每秒用 xmlhttprequests 调用的 php 代码,它从 MySQL 获取数据:
<?php
$link = mysqli_connect("localhost", "myuser", "mypassword", "mydatabase");
// Check connection
if($link === false){
die("ERROR: Could not connect. " . mysqli_connect_error());
}
$taulu = $_POST["taulu"];
$jaksominuuttia = $_POST["jaksominuuttia"];
$muuttujat = json_decode($_POST["muuttujat"]);
if(sizeof($muuttujat) == 1){
$result = mysqli_query($link, "SELECT $muuttujat[0], time FROM $taulu WHERE time >= NOW() - INTERVAL $jaksominuuttia MINUTE ORDER by time DESC");
}else if(sizeof($muuttujat) == 2){
$result = mysqli_query($link, "SELECT $muuttujat[0], $muuttujat[1], time FROM $taulu WHERE time >= NOW() - INTERVAL $jaksominuuttia MINUTE ORDER by time DESC");
}else if(sizeof($muuttujat) == 3){
$result = mysqli_query($link, "SELECT $muuttujat[0], $muuttujat[1], $muuttujat[2], time FROM $taulu WHERE time >= NOW() - INTERVAL $jaksominuuttia MINUTE ORDER by time DESC");
}else if(sizeof($muuttujat) == 4){
$result = mysqli_query($link, "SELECT $muuttujat[0], $muuttujat[1], $muuttujat[2], $muuttujat[3], time FROM $taulu WHERE time >= NOW() - INTERVAL $jaksominuuttia MINUTE ORDER by time DESC");
}else if(sizeof($muuttujat) == 5){
$result = mysqli_query($link, "SELECT $muuttujat[0], $muuttujat[1], $muuttujat[2], $muuttujat[3], $muuttujat[4], time FROM $taulu WHERE time >= NOW() - INTERVAL $jaksominuuttia MINUTE ORDER by time DESC");
}else if(sizeof($muuttujat) == 6){
$result = mysqli_query($link, "SELECT $muuttujat[0], $muuttujat[1], $muuttujat[2], $muuttujat[3], $muuttujat[4], $muuttujat[5], time FROM $taulu WHERE time >= NOW() - INTERVAL $jaksominuuttia MINUTE ORDER by time DESC");
} else if(sizeof($muuttujat) == 7){
$result = mysqli_query($link, "SELECT $muuttujat[0], $muuttujat[1], $muuttujat[2], $muuttujat[3], $muuttujat[4], $muuttujat[5], $muuttujat[6], time FROM $taulu WHERE time >= NOW() - INTERVAL $jaksominuuttia MINUTE ORDER by time DESC");
} else if(sizeof($muuttujat) == 8){
$result = mysqli_query($link, "SELECT $muuttujat[0], $muuttujat[1], $muuttujat[2], $muuttujat[3], $muuttujat[4], $muuttujat[5], $muuttujat[6], $muuttujat[7], time FROM $taulu WHERE time >= NOW() - INTERVAL $jaksominuuttia MINUTE ORDER by time DESC");
}
$json = mysqli_fetch_all ($result, MYSQLI_ASSOC);
echo json_encode($json );
// Close connection
mysqli_close($link);
?>
此代码中是否存在导致 MySQL 高 CPU 使用率的内容?
用作服务器的计算机具有 Intel i7-6820HQ 2.70GHz CPU 和 16,0 GB RAM。操作系统是 Windows 10 Pro,我正在使用它的 IIS。我的数据库是 MySQL Community Server v.8.0.11,我在我的表中使用 InnoDB 引擎。PHP 版本为 v7.2.2。
解决方案
推荐阅读
- python - 使用自动微分库计算任意张量的偏导数
- python - 为 Python/Twitter Api 脚本添加用户输入
- docusignapi - 如何使用 esign REST API 完全删除用户
- windows - Versionhelpers.h:没有这样的文件或目录
- forms - 在 Play 框架中重新填充表单字段
- python - 如何从一个句子中构建几个语法树?
- javascript - 从 textarea 复制到剪贴板问题 javascript
- google-apps-script - 如何将信息添加到已经包含一些单元格的行?
- javascript - 如何在反应导航中从抽屉堆栈导航到开关堆栈?
- apache - 需要 forward-dns somehost.com 返回 Unknown Authz 提供