[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Как составить запрос
123456
В общем есть таблица историй операций с аккаунтами. (вывод средств, пополнение баланса, изменение баланса по такой-то причине и т.д.)

id | id_user | date | type | rur
---------------------------

В базе собралось 15.000.000 записей. Записей более чем за год... Надо избавиться от старых записей...

Каким запросом можно почистить эту базу? Чтоб для каждого пользователя было МАКСИМУМ по 100 последних операций?

Т.е. оставляем для каждого id_user по 100 строк отсортировав по date. А остальное удаляем
AllesKlar
ну так, первое что в голову приходит: скрипт на пыхе и на ночь его в консоли

_____________
[продано копирайтерам]
sergeiss
Цитата (123456 @ 26.01.2015 - 14:44)
В базе собралось 15.000.000 записей.

Фигасе... Когда такие объемы, то лучше всего делать партиции. И удалять проще будет, и выборки будут шустрее.

Цитата (123456 @ 26.01.2015 - 14:44)
Каким запросом можно почистить эту базу? Чтоб для каждого пользователя было МАКСИМУМ по 100 последних операций?

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

И после этого сделай все-таки партиции!!!

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
123456
sergeiss скинул бд на денвер, чтоб не убивать сервак.

Надо отъехать... Накидал на быструю руку скрипт... Надеюсь за часик выполниться)

    $arr = null;
$ids = null;
$sql_delete = false;

$sql = $mysqli->q("SELECT `id`, `id_user` FROM `". $Conf->bd_pr ."mm` ORDER BY `date` ASC");

while ($bd = $sql->fetch_assoc())
{

if ($arr[$bd['id_user']] < 100)
{
$arr[$bd['id_user']]++;

$ids[] = $bd['id'];
}

}


foreach ($ids as $v)
$sql_delete = $sql_delete ? "AND `id` != ". $v : "`id` != ". $v;


echo $mysqli->q("DELETE FROM `". $Conf->bd_pr ."mm` WHERE ". $sql_delete) ? 'SUCCESS' : 'FAIL';
123456
Гляньте своим глазом, чтоб не было логических ошибок. А то как-то не хочется ждать в пустую....

И очень интересно, сколько это все займет времени

    $time = microtime(true);

$arr = null;
$ids = null;
$sql_delete = false;

$sql = $mysqli->q("SELECT `id`, `id_user` FROM `". $Conf->bd_pr ."mm` ORDER BY `date` ASC");

while ($bd = $sql->fetch_assoc())
{

if ($arr[$bd['id_user']] < 100)
{
$arr[$bd['id_user']]++;

$ids[] = $bd['id'];
}

}


printf('ЭТАП 1 выполнился за %.4F сек.', microtime(true) - $time);


foreach ($ids as $v)
$sql_delete = $sql_delete ? "AND `id` != ". $v : "`id` != ". $v;

printf('ЭТАП 2 выполнился за %.4F сек.', microtime(true) - $time);


echo $mysqli->q("DELETE FROM `". $Conf->bd_pr ."mm` WHERE ". $sql_delete) ? 'SUCCESS' : 'FAIL';

printf('ЭТАП 3 выполнился за %.4F сек.', microtime(true) - $time);
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.