Улучшение #45
Изменить структуру хранения данных о трафике в базе
| Status: | Закрыт | Start date: | 2010-06-28 | |
|---|---|---|---|---|
| Priority: | Нормальный | Due date: | 2010-07-30 | |
| Assignee: | % 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