@AleksBak
программирую давно, веб-разработкой занят недавно

Как сделать чтобы минимально загружать работой MySQL и связанные с ним системы при работе сайта (и устройства)?

Здравствуйте! Привет всем!
Я вот совсем начинающий (во всех этих "тегах" что указал в вопросе). Спасибо, что ответите если. :) А нужно мне организовать сбор данных с удаленного устройства и показать графики работы его в Интернете. Частота прихода данных - 1 раз в секунду. Данных совсем немного - скажем 150 байт (если точно совсем нужно, то могу уточнить, но не более). И решил сделать немного хотя бы по уму. Чтобы минимально загружать излишними запросами своими. Сделал так - на один php скрипт приходят данные (я пока в качестве "данных" использую просто текстовые сообщения):
<?php
require './SharedMemory.php';
require './DataBase.php';

// получаем значение строки с текстом, присланного через AJAX запрос от
// веб-формы (из браузера) или же через сокет-соединение:
$comment = trim($_POST['comment']);

// сохраняем полученное в 'Shared' области памяти:
$stor = SharedMemory::getInstance();
$stor->set(0, $comment);

// также отправим полученное на БД:
$conn = DataBase::getInstance();
$conn->checkConnection();
$conn->addValue($comment);

// выдаем в ответе на этот запрос, все записанные значения из столбца БД:
echo json_encode($conn->getValue());

а через запросы к другому скрипту (из Браузера уже только) эти данные считываем:
<?php
require './SharedMemory.php';
require './DataBase.php';

// получаем значение строки с текстом, присланного через AJAX запрос:
$comment = trim($_POST['commentGett']);

// отправим полученное на БД:
if (!empty($comment))
{
	$conn = DataBase::getInstance();
	$conn->checkConnection();
	$conn->addValue($comment);
}

// выдаем в ответе все ранее полученное (в др. скрипте) из 'Shared' области памяти:
$stor = SharedMemory::getInstance();
echo $stor->get(0);


База данных так была создана:
create database comments;
use comments;
create table comments ( comment_id int primary key not null auto_increment, comment_text varchar(1000) );

(спасибо урокам с Инета и пр. - если кто признал эту БД оттуда :).
Таким образом у меня тут:
БД с varchar(1000), приходят простые текстовые сообщения через AJAX и с разных мест (разные скрипты работают в разное время и асинхронно) и используется shared memory как "хранительница" последних записей. Теперь встал вопрос перехода на бинарные данные (150 байт всего как писал ранее). После изучений/читаний - запутался с выбором типа данных: BLOB (а какой точно?), VARCHAR (?), CHAR и пр. пр. именно для размера приходящих данных всего 150 байт. Какой тут оптимальнее? Применять еще base64? А как насчет JSON? Может BSON тут? (не знаю пока что это и с чем его едят - может "оверхед" пойдет от него). А вдобавок ко всему, еще возник вопрос о целесообразности shared memory т.к. выяснилось (я новичок в этом деле), что есть такая вещь как "in-memory" БД. Тогда может ее тут использовать? Т.к. частота записей у меня раз в секунду и подумал (и так мне говорили), что слишком часто это. Как посоветуете тут и что можете предложить. А то немного неразбериха получилась тут и решил вот спросить. Спасибо (если нужны исходники классов "SharedMemory" и "DataBase", то могу привести их, но там ничего такого особенного нет и не привел их чтобы "перегружать" вопрос).
  • Вопрос задан
  • 142 просмотра
Пригласить эксперта
Ответы на вопрос 2
Много вопросов в одном.
Раз бинарные данные, то и храните в столбце BINARY или VARBINARY.

Как бы я выстраивал взаимодействие
  • Сервис №1 получает данные от наблюдаемых систем, проводит первичную обработку и отправляет в очередь (Пусть будет Redis, ну или RabbitMQ)
  • Сервис №2 разбирает очередь, собирая батчи данных и вставляет их в базу

Минусы - данные в БД поступают с задержкой.

Если у вас всего 1 устройство, то я бы вообще не заморачивался – 1 запрос в секунду на вставку – это очень мало
Ответ написан
Комментировать
@AleksBak Автор вопроса
программирую давно, веб-разработкой занят недавно
Извините, что много вопросов. Как бы просто посоветоваться пытался - поэтому и спросил тут. Я исхожу из того, что есть у хостера (а у него пока все просто - Apach, MySQL и все). А насчет "Redis, ну или RabbitMQ" даже не интересовался что это. Надо бы посмотреть.
Раз бинарные данные, то и храните в столбце BINARY или VARBINARY.
Т.е лучше все-таки они? А "оверхеда" не будет потом? Если в секунду 150 байт, то за сутки уже 12.7 МБайт просто данных. А как таблица при этом "распухнет" и на сколько?
Если у вас всего 1 устройство, то я бы вообще не заморачивался – 1 запрос в секунду на вставку – это очень мало
это я уже все больше и больше стал понимать в последнее время (даже спросил у поддержки где хост арендовал), но решил все-таки по уму все делать и нормально.
А как насчет формата ответа? BSON тут лучше? Понимаете, в чем еще проблема, удаленное устройство (там микроконтрллер и СУ с ним) работает через Инет. И главное тут еще и размер траффика при таких посылках. Устройство, то ведь удаленное все-таки... Поэтому и спросил про ключевые моменты тут у знающих людей и тут на любимом хабре. Как бы посоветоваться. Благодарен за ответ.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы