MySQL высокая загрузка ЦП замедляет работу сервера, как оптимизировать мой запрос?

У меня есть проблема, когда я читаю данные из базы данных MySQL каждую секунду с несколькими клиентами. Загрузка ЦП MySQL увеличивается до 26-27%, и после этого мой другой сервис, который измеряет и записывает данные в реальном времени в базу данных, замедляется / падает.

Итак, я запускаю два разных веб-приложения на одном сервере:

Приложение 1 — это веб-страница, которая циклически вставляет данные в базу данных каждую секунду. Когда работает только эта служба, загрузка ЦП MySQL составляет примерно 1,8-2,0%, а использование памяти — около 275 МБ, и все работает гладко, а данные регистрируются в базе данных, как и должно быть каждую секунду. Так что я думаю, что регистрация не является проблемой.

Приложение 2 также является веб-страницей, которая циклически считывает данные из базы данных и показывает их пользователю (отображает графики из данных), а также делает это каждую секунду (поэтому этот сервис показывает живые данные пользователю, которые сохраняются в базе данных приложением 1). , При открытии страницы JavaScript вызывает php-страницу с xmlhttprequests и php-page выбирает данные из базы данных MySQL. Когда у меня на странице 6 разных графиков (обновляемых каждую секунду, так что один клиент выполняет 6 запросов (xmlhttprequest to php-page) в секунду) Загрузка ЦП MySQL увеличивается до 11,0-12,0%, а использование памяти остается на уровне тот же самый. Итак, теперь у меня запущены оба моих приложения, и все по-прежнему работает так, как должно: другое приложение сохраняет данные в MySQL каждую секунду, а другое приложение извлекает данные каждую секунду и показывает их клиенту.

Однако, когда появляется другой клиент (например, открытие приложения 2 с помощью браузера на мобильном устройстве или просто открытие приложения 2 на двух вкладках с тем же окном браузера), загрузка ЦП MySQL увеличивается до 24,0-26,0%, а использование памяти остается примерно таким же, как и раньше, и мое приложение 1 больше не работает должным образом. Оно по-прежнему сохраняет данные каждую секунду, что не является проблемой, но данные, которые я хочу сохранить, являются данными измерений в режиме реального времени, и эта часть измерения имеет тайм-аут из-за высокой загрузки ЦП, поэтому значения, которые теперь сохраненные значения не являются правильными (последнее измеренное значение сохраняется снова и снова).

Поэтому я хочу добиться того, чтобы снизить нагрузку на процессор, вызванную запросами MySQL из приложения 2, чтобы мое приложение 1 продолжало работать, даже если в приложении 2 есть несколько клиентов.

Вот мой php-код, который вызывается с xmlhttprequests каждую секунду, который получает данные из 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?

Компьютер, который работает как сервер, имеет процессор Intel i7-6820HQ 2,70 ГГц и 16,0 ГБ оперативной памяти. Операционная система — Windows 10 Pro, и я использую ее IIS. Моя база данных — MySQL Community Server v.8.0.11, и я использую движок InnoDB в своих таблицах. Версия PHP v7.2.2.

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]