Улучшение #45

Изменить структуру хранения данных о трафике в базе

Added by Serg79 - almost 2 years ago. Updated over 1 year ago.

Status:Закрыт Start date:2010-06-28
Priority:Нормальный Due date:2010-07-30
Assignee:Serg79 - % Done:

100%

Category:sql
Target version:0.1-beta

Description

Сейчас таблица хранящая данные о трафике в базе имеет следующий вид:

create table `traffic`
(
        `date` datetime not null,
        `srcIp` int unsigned not null,
        `dstIp` int unsigned not null,
        `srcPort` int not null,
        `dstPort` int not null,
        `pId` tinyint not null,
        `bytes` int unsigned not null,
        `psize` int unsigned not null
) engine = MyISAM;

Данные хранящиеся в ней имеют следующий вид:
mysql> select * from traffic limit 4;
+---------------------+------------+------------+---------+---------+-----+----------+----------+
| date                | srcIp      | dstIp      | srcPort | dstPort | pId | bytes    | psize    |
+---------------------+------------+------------+---------+---------+-----+----------+----------+
| 2007-02-01 01:01:00 | 3232269176 | 3232269311 |       0 |     694 |   2 | 16563929 | 19222333 |
| 2007-02-01 01:01:00 | 3232269325 | 3232269567 |       0 |     137 |   2 |  6186600 |  9651096 |
| 2007-02-01 01:01:00 | 3232240655 | 3232240874 |    5666 |       0 |   1 |  1661177 |  2122109 |
| 2007-02-01 01:01:00 | 3232240874 | 3232240655 |       0 |    5666 |   1 |  1404918 |  1901386 |
+---------------------+------------+------------+---------+---------+-----+----------+----------+
4 rows in set (0.01 sec)

И для того что бы получить информацию о входящем и исходящем трафике приходиться объединять вывод двух запросов:
select
  ifnull(out.psizeSum,0) as outTraf,
  ifnull(in.psizeSum,0) as inTraf
from
  (
    select sum(psize) as psizeSum
    from traffic
    where (srcPort = 0) &&
      (date >= "%BEGIN_DATE%" and date < "%END_DATE%")
  ) as `out` join
  (
    select sum(psize) as psizeSum
    from traffic
    where (dstPort = 0) &&
      (date >= "%BEGIN_DATE%" and date < "%END_DATE%")
  ) as `in`';

То есть данные о трафике одного клиента хранятся в двух строчках таблицы, одна строка содержит входящий трафик, другая исходящий.

Надо изменить структуру хранения данных о трафике на вид:

create table `traffic`
(
        `date` datetime not null,
        `srcIp` int unsigned not null,
        `dstIp` int unsigned not null,
        `dstPort` int not null,
        `pId` tinyint not null,
        `inbytes` int unsigned not null,
        `outbytes` int unsigned not null
) engine = MyISAM;

то есть в одной строчке будет храниться как информация о входящем так и о исходящем трафике клиента. Это позволит уменьшить количество строк в базе для одних и тех же данных в два раза, а так же упростит запросы на получение данных, что в свою очередь приведет к ускорению работы с базой.


Related issues

related to Ошибка #44: Необходимо уплотнять данные о трафике в базе Закрыт 2010-06-22 2010-09-06

History

Updated by Serg79 - almost 2 years ago

  • Assignee set to Serg79 -

Updated by Serg79 - almost 2 years ago

  • % Done changed from 0 to 100
  • Due date set to 2010-07-30
  • Status changed from Новый to Закрыт

Committed in r111.

Updated by Serg79 - over 1 year ago

Новая структура хранения данных в базе позволила существенно сократить размер хранимых данных. Так при старой структуре хранения данных, база за сутки сбора статистики имела следующие размеры (см. #44):

За сутки работы системы база весит 48 Мбайт.
Число строк в таблице 'traffic' равен 304448.
За день к внешним ресурсам обращалось порядка 60 пользователей.

Сейчас за 30 дней сбора статистики база имеет следующий размер:

база 167 метров, число строк 2906580

Also available in: Atom PDF