首页 > 解决方案 > 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。

标签: phpmysqlinnodbsql-optimization

解决方案


推荐阅读