LINUX.ORG.RU

MySQL 18000 записей и больше ...


0

1

Привет всем.
Посоветуйте, как решить задачу. В базу сливается ежечасно 178 строк в таблицу с такой структурой:

id-int(11)
email-varchar(255)
date_email-date
time_email-time
all_email-tinyint(10)
reject-tinyint(10)
inbox-tinyint(10)
send-tinyint(10)
spam-tinyint(10)


Данные это анализ логов почтового сервера по пользователям. На данный момент это уже 18 000 записей за пару деней. Данные и дальше будут увеличивается.
Потом эти данные надо выводить в нормальном виде. Например вывести сумму всех сообщений за месяц. Как понимаете это все долго суммируется. Как в таких случаях вообще решаются такие задачи, что бы ускорить выдачу результатов?


гиперкуб пополнять в базе которая умеет так делать. предусмотреть все измерения и агрегации которые могут понадобится сразу. Время на расчет статистики будет размазано по всему отчетному периоду.

psv1967 ★★★★★
()

Я не очень знаком с оптимизацией в MySQL.
Но с такой структурой несколько миллионов записей будут обрабатываться ИМХО быстро.

Самое простое можно сделать дату в виде трех полей - год, месяц, день и создать индекс (например god+month).

pi11 ★★★★★
()
Ответ на: комментарий от psv1967

вы както очень умно ответили. Я нечего не понял ;(

macik
() автор топика
Ответ на: комментарий от pi11

Вы так думаете?
У меня сейчас 18600 записей.
и вот такой запрос и сложение очень долго делается.


$sql = «SELECT * FROM `stat`»;
$result = @mysql_query($sql);
$col = @mysql_num_rows($result);
$x=0;
while($col>$x):
$all_email = @mysql_result($result, $x, 'all_email');
$reject = @mysql_result($result, $x, 'reject');
$inbox = @mysql_result($result, $x, 'inbox');
$send = @mysql_result($result, $x, 'send');
$spam = @mysql_result($result, $x, 'spam');

$a_email = $all_email+$a_email;
$r_email = $reject+$r_email;
$i_email = $inbox+$i_email;
$se_email = $send+$se_email;
$sp_email = $spam+$sp_email;
$x++;
endwhile;


Иля я просто неправильно PHP код делаю?

macik
() автор топика

Используй индексы, у меня есть таблицы почти на млн. записей, и ничего не тормозит

xorik ★★★★★
()

вынести логику из базы. там нечему долго выполняться.

chg ★★★★★
()
Ответ на: комментарий от xorik

Я незнал что можно средствами MySQL получить суму. Как вы написали нашел в инете sum(). Только пока незнаю как пользоваться ... Но сейчас найду.

Спасибо!

macik
() автор топика
Ответ на: комментарий от chg

Тормозит на сложении в PHP. 19 секунд ... Делает

macik
() автор топика
Ответ на: комментарий от macik

$sql = «SELECT * FROM `stat`»;

Жесткое решение =)

pi11 ★★★★★
()

Вам бы еще DATETIME вместо отдельно даты и времени, и битовые значение там, где tinyint избыточен Ну и индексы, конечно, для ускорения выборки. Индекс по дате-времени, конечно же, и наверное по email, по spam

azure ★★
()
Ответ на: комментарий от macik

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

azure ★★
()
Ответ на: комментарий от macik

Это фиксированная длина. Но по-моему это больше, чем вам необходимо.

azure ★★
()
Ответ на: комментарий от macik

tinyint(10) - это разве не фиксированная длина?

Это то, что приличным словом не называется, ибо в tinyint даже двоичных разрядов всего 8.

А вот это вот - email-varchar(255) - как раз поле не фиксированной длины.

p.s. тут вам правильно посоветовали нанять для проекта программиста.

r_asian ★☆☆
()
Ответ на: комментарий от urxvt

Это удобный инструмент для анализа почтового трафика. Он нужен только для меня.
нет смысла выделать деньги на то что нужно одному.

macik
() автор топика
Ответ на: комментарий от pi11

(например god+month)

god+month

god

:)

Да нет, думаю что не будет быстрее, но я так не делаю, может и зря. Я выбираю по дате.

sniper21 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.