Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.08.2016, 20:53   #1
Illusiony
Форумчанин
 
Регистрация: 17.02.2014
Сообщений: 881
По умолчанию Какая структура будет меньше загружать сервер?

Сейчас работает так:
- есть 2 програмки и сервер
- первая программа посылает на сервер при каждом клике по окну пост запросом координаты х и y
- на сервере эти данные записываются insert Mysql memory в два поля SMALLINT + autoincrement
- вторая програмка с частотой около 1 раз в секунду читает эту таблиц и после этого очищает ее полностью TRUNCATE TABLE

Так как от первой программы могут приходить частые запросы, порой более 1го в секунду, хочу сделать отправку данных 1 раз в секунду, если конечно данные будут.
Я хочу отсылать данные в виде строки, например такой: [101]{100}[102]{200}[103]{0}[100]{100}[100]{100}
и в таблице будет только 1 поле varchar(120)

Тогда алгоритм может быть такой:
- первая программа с частотой до 1 раза в секунду отправляет строку на сервер такого вида: [101]{100}[102]{200}
- на сервере читаем табличку select
- добаляем к уже имеющимся данным( если они есть) эту сторочку и делаем update ( добавилось update вместо insert)

- вторая программа читает эту строчку и делает TRUNCATE TABLE

Таких таблиц и программ может быть множество десятки, а может быть и 1-2 сотни
Вопрос в том как организовать эту структуру, чтобы нагрузка на сервер была меньшей из всех вариантов.
Illusiony вне форума Ответить с цитированием
Старый 07.08.2016, 22:26   #2
come-on
Участник клуба
 
Регистрация: 21.10.2015
Сообщений: 1,361
По умолчанию

сделай то не знаю что
come-on вне форума Ответить с цитированием
Старый 08.08.2016, 00:15   #3
predefined
Форумчанин
 
Регистрация: 01.08.2016
Сообщений: 182
По умолчанию

Программа 1 и программа 2 обмениваются данными через таблицу MySQL на сервере?
Если таких программ и таблиц могут быть сотни - как они узнают где чья таблица/данные?

Возможно, проще писать всё в одну таблицу и добавить туда поле id_programm чтобы идентифицировать программы.

И не забывайте, что MySQL на таблицах типа MyISAM не даст одновременно читать и писать - он блокирует таблицу на время чтения/записи. То есть, тут могут быть тормоза, если неправильно организовать структуру.
predefined вне форума Ответить с цитированием
Старый 08.08.2016, 06:27   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

А зачем вообще SQL здесь? По сути - одна прога пишет в конец очереди, другая забирает из начала
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 08.08.2016, 18:21   #5
Illusiony
Форумчанин
 
Регистрация: 17.02.2014
Сообщений: 881
По умолчанию

Цитата:
Сообщение от predefined Посмотреть сообщение
Программа 1 и программа 2 обмениваются данными через таблицу MySQL на сервере?
Если таких программ и таблиц могут быть сотни - как они узнают где чья таблица/данные?

Возможно, проще писать всё в одну таблицу и добавить туда поле id_programm чтобы идентифицировать программы.

И не забывайте, что MySQL на таблицах типа MyISAM не даст одновременно читать и писать - он блокирует таблицу на время чтения/записи. То есть, тут могут быть тормоза, если неправильно организовать структуру.
Я написал что таблица Memory. В курсе, что она тожа будет блокировать всю таблицу, но таблица из 1 строки так что без разницы.

Да удобнее для человека чтобы эти таблицы были все в одной, но если использовать myisam или memory для большого списка таких работающих программ- много строк будет полная блокировка таблицы. Если использовать innodb, то потеряю в скорости обращения диск- память.
Таблицы будут называться уникально для каждой связки программ.

Аватар, да вы правы. Но мне так удобнее чем что то придумывать на файлах и тому подобное. К тому же это лишь первые варианты структуры, могут быть координальные изменения и усложнения в дальнейшем. И кроме, того что я описал, будут еще некоторое количество проверок через Mysql других данных ( это я к вопросу о SQL, просто Mysql так и так уже задействована).

come-on, в большинстве согласен, описываю я плохо то что хочу услышать(

Последний раз редактировалось Illusiony; 08.08.2016 в 18:23.
Illusiony вне форума Ответить с цитированием
Старый 09.08.2016, 13:01   #6
predefined
Форумчанин
 
Регистрация: 01.08.2016
Сообщений: 182
По умолчанию

Цитата:
Сообщение от Illusiony Посмотреть сообщение
Я написал что таблица Memory. ...
Если использовать innodb, то потеряю в скорости обращения диск- память.
Вы тут сами себе противоречите, но, ладно.

Вот хабровский пример Highload работы с MySQL на PHP, похоже, как раз то, что надо. И с исходником.

Если нагрузка от запросов ваших приложений будет, всё-таки, большой, придётся смотреть в сторону многопроцессовых демонов на PHP.

Последний раз редактировалось predefined; 09.08.2016 в 13:03.
predefined вне форума Ответить с цитированием
Старый 09.08.2016, 22:13   #7
Illusiony
Форумчанин
 
Регистрация: 17.02.2014
Сообщений: 881
По умолчанию

Цитата:
Сообщение от predefined Посмотреть сообщение
Вы тут сами себе противоречите, но, ладно.

Вот хабровский пример Highload работы с MySQL на PHP, похоже, как раз то, что надо. И с исходником.

Если нагрузка от запросов ваших приложений будет, всё-таки, большой, придётся смотреть в сторону многопроцессовых демонов на PHP.
Что именно я тут противоречу? Я использую Memory таблицу,а innodb и Myisam не использую потому что это в основном на диск.

Ну тут Highload работы с MySQL на PHP описано как использовать мемори таблицы. Я не понял ваших выводов. Вопрос заключается как именно организовать структуру memory таблицы и способов работы с нею для моего случая для минимизации серверной нагрузки.

Последний раз редактировалось Illusiony; 09.08.2016 в 22:18.
Illusiony вне форума Ответить с цитированием
Старый 10.08.2016, 13:39   #8
predefined
Форумчанин
 
Регистрация: 01.08.2016
Сообщений: 182
По умолчанию

Цитата:
Сообщение от Illusiony Посмотреть сообщение
Что именно я тут противоречу? Я использую Memory таблицу,а innodb и Myisam не использую потому что это в основном на диск.
Погорячился.

Цитата:
Сообщение от Illusiony Посмотреть сообщение
Ну тут [URL="https://habrahabr.ru/post/108457/"]Вопрос заключается как именно организовать структуру memory таблицы и способов работы с нею для моего случая для минимизации серверной нагрузки.
Если у вас в таблице всего 1 запись, пусть даже и VARCHAR, разницы в скорости UPDATE/SELECT вы не заметите. Можно (и нужно) провести тесты - создать таблицу и сделать, например, PHP-скриптом 10000 записей/выборок из неё.

Имхо, главная проблема у вас будет не со скоростью, а с thread safe. Если данные от программ вы принимаете не демоном, а скриптом(например, PHP), то на каждый запрос запускается отдельная копия скрипта. Она работает по квотам времени, поэтому периодически прерывается, чтобы дать время другим скриптам.

То есть, скрипт может успеть сделать SELECT и приостановиться, а вторая копия скрипта в это время - допишет данные в эту же запись.

Скорее всего вам придётся работать с атомарными(непрерывающимися) операциями. То есть, так делать неправильно:
Цитата:
- на сервере читаем табличку select
- добавляем к уже имеющимся данным( если они есть) эту сторочку и делаем update ( добавилось update вместо insert)
Надо всё делать ОДНИМ запросом, типа:
INSERT INTO `table` SET fld=fld+'что_прислано'

или использовать хитрые конструкции типа 'ON DUPLICATE KEY'
predefined вне форума Ответить с цитированием
Старый 10.08.2016, 21:38   #9
Illusiony
Форумчанин
 
Регистрация: 17.02.2014
Сообщений: 881
По умолчанию

predefined, Вы имеете ввиду, что возможно ситуация между 2мя отдельными запросами к mysql в скрипте может произойти дрой запрос из другого скрипта и тем самым испортить логику? Если так, то да я об этом подумывал. Думал может тогда сделать принудительный лок таблицы пока скрипт не выполнит оба запроса.( правда никогда такого не делал).
На счет все в одном запросе, я весьма мало знаком с Mysql.
1) Возможно одним запросом прочесть данные, добавить к ним еще данных и перезаписать?
2) Возможно одним запросом прочесть (и записать эти данные в переменную php) и после этого сделать TRUNCATE TABLE или Update?

Последний раз редактировалось Illusiony; 10.08.2016 в 23:19.
Illusiony вне форума Ответить с цитированием
Старый 13.08.2016, 15:18   #10
Illusiony
Форумчанин
 
Регистрация: 17.02.2014
Сообщений: 881
По умолчанию

Немножко пояснений:
- предполагается порядка 100-200 таблиц
- в каждой таблице всего по 1 записи
- одновременно может работать связок
первая программа-> таблица mysql( одна запись)<- вторая программ
до примерно 100 штук
- частота запросов от программы №1 до 1 запроса в 1-2 секунды. От второй программы аналогично.

Последний раз редактировалось Illusiony; 13.08.2016 в 16:32.
Illusiony вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Написать программу, с помощью которой изображение будет разбиваться по пикселям и будет создаваться матрица andrey4515 Помощь студентам 2 08.01.2014 18:44
Будет ли сервер idTCP работать без веделенного внешнего ip (Delphi Indy) _PROGRAMM_ Помощь студентам 1 29.11.2010 13:52
какая структура *.icns?? Ntlegend Общие вопросы Delphi 3 02.09.2009 01:24
Учет оплаты. Какая формула будет если..? Anton_audit Microsoft Office Excel 5 12.08.2009 17:40
посчитать какая доставка для клинта 10-я? Delphi (Клиент-Сервер) Vindigo Помощь студентам 6 27.01.2008 15:28