Покинул форум
Сообщений всего: 214
Дата рег-ции: Июль 2012
Помог: 0 раз(а)
Здравствуйте!
Могут ли в БД MySQL удаляться строки как-то еще, кроме как по запросу DELETE FROM?
Мелкий
Отправлено: 23 Июня, 2014 - 20:18:53
Активный участник
Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009 Откуда: Россия, Санкт-Петербург
Помог: 618 раз(а)
replace, truncate, скрытый delete (из триггера, например), по внешнему ключу.
----- PostgreSQL DBA
EuGen
Отправлено: 23 Июня, 2014 - 21:29:40
Профессионал
Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007 Откуда: Berlin
Помог: 707 раз(а)
DROP+CREATE (то же самое, что TRUNCATE по сути), частичное восстановление из бэкапа (операции с самой БД) - всё это также может быть причиной.
----- Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
Klinch
Отправлено: 24 Июня, 2014 - 20:23:05
Частый гость
Покинул форум
Сообщений всего: 214
Дата рег-ции: Июль 2012
Помог: 0 раз(а)
Почему-то вроде как стали удаляться записи из таблицы юзеров. Как говорят - просто так. На сайте просетенькие запросы вида SELETC `id` FROM `accounts` WHERE `lol`='1', INSERT INTO `tabliza` WHERE `lolol`='1' AND `lol`='2' и т.п.
Есть еще UPDATE в таком-же виде.
Ничего не пойму...
Возможно ли как-то поставить запрет в БД на удаление записей в таблице? Через phpmyadmin.
Спасибо!
LIME
Отправлено: 24 Июня, 2014 - 21:45:25
Активный участник
Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010
Помог: 322 раз(а)
можно запретить пользователю запросы DELETE
в правах пользователя
но это запретит любые удаления
еще есть вариант включить логи MySQL
и потом поискать удаления (Добавление)
еще можно создать триггер на удаление для таблицы
и там отменить его
и в таблицу логов поместить запрос
я бы так и сделал
mysql_query("UPDATE `accounts` SET `days`=`days`+'5' WHERE `id`='".$row['id']."'");
}
Помимо запроса на обновление, внутри while есть еще несколько функций, которые занимаются различными вычислениями. Для каждого юзера вычисления разные. Ну и в запросе на обновление потом эти вычисления применяются.
Так вот, в однопоточном режиме скрипт обрабатывает примерно 5-10 пользователей в секунду. Этого мало, т.к. юзеров около 20000, а это целый час обработки.
Возможно ли выполнять всё это многопоточно? И как?
Или это уже лучше в другой раздел?
Спасибо!
Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010
Помог: 322 раз(а)
а эти вычисления точно нельзя на сторону бд перенести? (Добавление)
многопоточности в php нет
кроме всяких её эмуляций
Klinch
Отправлено: 25 Июня, 2014 - 19:59:44
Частый гость
Покинул форум
Сообщений всего: 214
Дата рег-ции: Июль 2012
Помог: 0 раз(а)
LIME
А случаем не планируется многопоточность? В каком-нибудь PHP 6? Я просто в новости не вникаю)
Я постараюсь перенести на сторону БД. Знаю, что это всё говнокод. При обработке 20к юзеров в общей сложности выполняется около 70-80к запрсов в БД (около 20 запросов в секунду на протяжении часа). Я еще далеко не мастер SQL
Подскажите, пожалуйста, а есть ли в MySQL функция, типа как в PHP round()? Для работы с дробными числами, чтобы после точки было не более 2 значений, т.е.:
round(20.55555555555555, 2); выдаст 20.55
Вот, чтобы если в БД заносится число 20.55555555555555, БД оставляла только 2 числа после точки, т.е. БД занесёт число 20.55? (Добавление)
На сторону БД перенес 1 запрос. Получилось так:
mysql_query("UPDATE `accounts` SET `credits`=round(`credits`+(`credits`/'100'*'$procent'),2),`lastpay`=round(`credits`/'100'*'$procent',2) WHERE `banned`='0'")
Но есть еще 1 "но". Дело в том, что для каждого пользователя помимо этого запроса в БД на обновление, выполняется запрос на вставку записи в таблицу логов, вот так:
mysql_query("INSERT INTO `accr-logs` (`user`,`credits`,`date`) VALUES ('ИД ЮЗЕРА','$lastpay','$date')");
$lastpay - это `lastpay` из первого запроса
т.е. нужно, чтобы после выполнения 1 запроса, выполнился запрос INSERT, который возьмет `lastpay` каждого пользователя из таблицы `accounts` и вставит запись для каждого юзера в таблицу `accr-logs`, где `user` будет `id` пользователя из таблицы `accounts`, `lastpay` будет `lastpay` юзера из таблицы `accounts` и `date` будет '$date'.
Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010
Помог: 322 раз(а)
Klinch пишет:
А случаем не планируется многопоточность?
нет не планируется
php не для подобных задач
решением может быть использование менеджера процессов
например Gearman
Klinch пишет:
чтобы после точки было не более 2 значений
тип поля decimal
можно указать колво знаков после зпт
Klinch пишет:
т.е. нужно, чтобы после выполнения 1 запроса, выполнился запрос INSERT
нет не нужно
весь текст запроса можно заключить в транзакцию
использовать mysqli::multi_query (либо PDO...по вкусу)
и в конце использовать множественный INSERT(копить в строку)
тоесть много инсертов одним запросом
$a+($a/100*25) === $a * 1.25
...
короче тут надо оптимизировать запросы а не городить многопоточность
аминь
mysql_query("INSERT INTO `accr-logs` (`user`,`credits`,`date`) SELECT `id`, `lastpay`, '$date' FROM `accounts` WHERE lastpay>0;");
mysql_query("UPDATE `referals`, `accounts` SET `referals`.`payniki`=round(`referals`.`payniki`+(`accounts`.`lastpay`/'100'*'$procref'),2), `referals`.`lastpay`=round(`accounts`.`lastpay`/'100'*'$procref',2) WHERE `referals`.`referalid` = `accounts`.`id`");
mysql_query("UPDATE `accounts`, `referals` SET `accounts`.`credits`=`accounts`.`credits`+`referals`.`lastpay`, `accounts`.`ppay`=`accounts`.`ppay`+`referals`.`lastpay` WHERE `accounts`.`id`=`referals`.`partnerid`");
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.