Проблемы производительности MySQL с большим количеством данных

У меня есть программный проект, на котором я работаю на работе, которая сводит меня с ума. Вот наша проблема: у нас есть контакты серии данных, которые необходимо войти в систему каждую секунду. Он должен включать время, подшипник (массив 360-1080 байтов), диапазон и несколько других полей. Наша система также нужна возможность хранить эти данные до 30 дней. На практике могут быть до 100 различных контактов, поэтому, по максимальному максимуму, может быть где-либо около 150 000 000 баллов до около 1 000 000 000 разных точек за 30 дней.

Я пытаюсь придумать лучший метод для хранения всех этих данных и извлекать позже. Моя первая мысль должна была использовать некоторые RDBMS, как MySQL. Будучи встроенным программистом C / C ++, у меня очень мало опыта работы с MySQL с такими большим набором данных. Я устал с ним на небольших наборах наборах, но ничего чуть не так велико. Я генерировал схему ниже для двух таблиц, которые будут хранить некоторые данные:

CREATE TABLE IF NOT EXISTS `HEADER_TABLE` (
  `header_id` tinyint(3) unsigned NOT NULL auto_increment,
  `sensor` varchar(10) NOT NULL,
  `bytes` smallint(5) unsigned NOT NULL,
  PRIMARY KEY  (`header_id`),
  UNIQUE KEY `header_id_UNIQUE` (`header_id`),
  UNIQUE KEY `sensor_UNIQUE` (`sensor`)
) ENGINE=MyISAM AUTO_INCREMENT=0 DEFAULT CHARSET=latin1;

CREATE TABLE IF NOT EXISTS `RAW_DATA_TABLE` (
  `internal_id` bigint(20) NOT NULL auto_increment,
  `time_sec` bigint(20) unsigned NOT NULL,
  `time_nsec` bigint(20) unsigned NOT NULL,
  `transverse` bit(1) NOT NULL default b'0',
  `data` varbinary(1080) NOT NULL,
  PRIMARY KEY  (`internal_id`,`time_sec`,`time_nsec`),
  UNIQUE KEY `internal_id_UNIQUE` (`internal_id`),
  KEY `time` (`time_sec`)
  KEY `internal_id` (`internal_id`)
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=latin1;

CREATE TABLE IF NOT EXISTS `rel_RASTER_TABLE` (
  `internal_id` bigint(20) NOT NULL auto_increment,
  `raster_id` int(10) unsigned NOT NULL,
  `time_sec` bigint(20) unsigned NOT NULL,
  `time_nsec` bigint(20) unsigned NOT NULL,
  `header_id` tinyint(3) unsigned NOT NULL,
  `data_id` bigint(20) unsigned NOT NULL,
  PRIMARY KEY  (`internal_id`, `raster_id`,`time_sec`,`time_nsec`),
  KEY `raster_id` (`raster_id`),
  KEY `time` (`time_sec`),
  KEY `data` (`data_id`)
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=latin1;

Таблица заголовка содержит только 10 строк и является статикой. Это просто говорит о том, от чего пришли датчик необработанные данные, и количество выводов байтов по этому типу датчика. RAW_DATA_TABLE По существу хранит несущиеся данные (массив байтов 360-1080, он представляет собой до трех образцов в течение степени). Rel_Raster_Table удерживает метадали для RAW_DATA_TABLE, могут быть несколько контактов, которые относятся к той же строке необработанных данных. data_id data_id Найдено в точках Rel_Raster_table к Внутренний ряд некоторых строк в RAW_DATA_TABLE, я сделал это, чтобы уменьшить необходимую сумму пишета.

Очевидно, что, как вы можете сказать, у меня есть проблемы с производительностью при чтении и удалении из этой базы данных. Оператор к нашему программному обеспечению может видеть данные в реальном времени, поскольку она встречается, а также переходит в режим реконструкции и накладывает диапазон данных из прошлого, в прошлом неделе. Наш сервер журнала Backend захватывает строки истории и отправляет их на дисплей через интерфейс CORBA. Хотя все это происходит, у меня есть рабочая нить, которая удаляет 1000 строк одновременно для данных более 30 дней. Это в случае, если сеанс проходит дольше 30 дней, что может произойти.

Система, которую мы в настоящее время внедрили, хорошо работает для небольших наборов данных, но не для больших наборов. Наш выбор и удаление утверждений могут занять более 2 минут для возврата результатов. Это полностью убивает производительность нашей реальной потребительской нити. Я подозреваю, что мы неправильно разработали наши схемы, выбирая неправильные ключевые ключи, не правильно оптимизируя наши SQL-запросы или некоторое подмножество каждого. Наши пишеты не видят, чтобы быть затронуты, если только другие операции не будут слишком долго бегать.

Вот пример запроса SQL, который мы используем для получения данных истории:

SELECT 
  rel_RASTER_TABLE.time_sec, 
  rel_RASTER_TABLE.time_nsec, 
  RAW_DATA_TABLE.transverse, 
  HEADER_TABLE.bytes, 
  RAW_DATA_TABLE.data 
FROM 
  RASTER_DB.HEADER_TABLE, 
  RASTER_DB.RAW_DATA_TABLE, 
  RASTER_DB.rel_RASTER_TABLE 
WHERE 
  rel_RASTER_TABLE.raster_id = 2952704 AND 
  rel_RASTER_TABLE.time_sec >= 1315849228 AND 
  rel_RASTER_TABLE.time_sec <= 1315935628 AND 
  rel_RASTER_TABLE.data_id = RAW_DATA_TABLE.internal_id AND 
  rel_RASTER_TABLE.header_id = HEADER_TABLE.header_id;

Заранее прошу прощения, чтобы это был такой длительный вопрос, но я провел другие ресурсы, и это мой последний курорт. Я полагаю, что постараюсь быть как можно более описательным, вы, ребята, вы можете видеть, как я могу улучшить наш дизайн на первый взгляд? Или в любом случае мы можем оптимизировать наш выбор и удаление операторов для таких больших наборов данных? В настоящее время мы работаем RHEL как ОС и, к сожалению, не можем изменить нашу конфигурацию оборудования на сервере (4 ГБ ОЗУ, Quad Core). Мы используем C / C ++ и API MySQL. Любые улучшения скорости были бы чрезвычайно полезными. Если вам нужно, чтобы я уточнил что-нибудь, пожалуйста, дайте мне знать. Спасибо!

Редактировать: кстати, если вы не можете предоставить конкретную справку, возможно, вы можете связать меня с некоторыми превосходными уроками, которые вы столкнулись с оптимизацией SQL-запросов, дизайна схемы или настройки MySQL?

-121--1365754-

Chrome / Firefox Альтернативы TwebBrowser Control У меня есть приложение Delphi, которое показывает группу веб-страниц в управлении TwebBrowser. Это приложение типа киоска, поэтому пользователь касается кнопки на стороне, и она показывает определенную веб-страницу на вкладке. У меня есть некоторые ...

У меня есть приложение Delphi, которое показывает группу веб-страниц в управлении TwebBrowser. Это приложение типа киоска, поэтому пользователь касается кнопки на стороне, и она показывает определенную веб-страницу на вкладке. У меня проблемы с определенными сайтами и получаем ошибки IE Javscript.

Я хотел бы знать, есть ли способ, которым я могу встроить браузер Chrome или Firefox на вкладке или в форме из Delphi?

Это вопрос , похоже, отвечает на проблему, с которой я имел Получение ошибок JavaScript.

10
задан Community 23 May 2017 в 12:08
поделиться