Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: MySQL
Форумы портала PHP.SU » PHP » SQL и Архитектура БД » MySQL

Страниц (1): [1]
 

1. Klinch - 23 Июня, 2014 - 19:54:38 - перейти к сообщению
Здравствуйте!

Могут ли в БД MySQL удаляться строки как-то еще, кроме как по запросу DELETE FROM?
2. Мелкий - 23 Июня, 2014 - 20:18:53 - перейти к сообщению
replace, truncate, скрытый delete (из триггера, например), по внешнему ключу.
3. EuGen - 23 Июня, 2014 - 21:29:40 - перейти к сообщению
DROP+CREATE (то же самое, что TRUNCATE по сути), частичное восстановление из бэкапа (операции с самой БД) - всё это также может быть причиной.
4. Klinch - 24 Июня, 2014 - 20:23:05 - перейти к сообщению
Почему-то вроде как стали удаляться записи из таблицы юзеров. Как говорят - просто так. На сайте просетенькие запросы вида SELETC `id` FROM `accounts` WHERE `lol`='1', INSERT INTO `tabliza` WHERE `lolol`='1' AND `lol`='2' и т.п.

Есть еще UPDATE в таком-же виде.

Ничего не пойму...
Возможно ли как-то поставить запрет в БД на удаление записей в таблице? Через phpmyadmin.

Спасибо!
5. LIME - 24 Июня, 2014 - 21:45:25 - перейти к сообщению
можно запретить пользователю запросы DELETE
в правах пользователя
но это запретит любые удаления
еще есть вариант включить логи MySQL
и потом поискать удаления
(Добавление)
еще можно создать триггер на удаление для таблицы
и там отменить его
и в таблицу логов поместить запрос
я бы так и сделал
6. Klinch - 25 Июня, 2014 - 09:19:36 - перейти к сообщению
LIME

Спасибо! Возьму на заметку, на будущее.

Проблему нашел... там в одном скрипте по запарке вместо удаления записи из таблицы логов, написали удаление записи из таблицы аккаунтов WHERE id лога. Разнесу! Получай молотком
7. Klinch - 25 Июня, 2014 - 16:07:59 - перейти к сообщению
Еще один вопрос.

Скрипт построен на PHP. Приведу пример:

PHP:
скопировать код в буфер обмена
  1.  
  2. $res=mysql_query("SELECT `id` FROM `accounts`");
  3. while($row=mysql_fetch_array($res))
  4. {
  5.         mysql_query("UPDATE `accounts` SET `days`=`days`+'5' WHERE `id`='".$row['id']."'");
  6. }
  7.  


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

Так вот, в однопоточном режиме скрипт обрабатывает примерно 5-10 пользователей в секунду. Этого мало, т.к. юзеров около 20000, а это целый час обработки.

Возможно ли выполнять всё это многопоточно? И как?
Или это уже лучше в другой раздел?
Спасибо!
8. LIME - 25 Июня, 2014 - 18:14:48 - перейти к сообщению
а эти вычисления точно нельзя на сторону бд перенести?
(Добавление)
многопоточности в php нет
кроме всяких её эмуляций
9. Klinch - 25 Июня, 2014 - 19:59:44 - перейти к сообщению
LIME
А случаем не планируется многопоточность? В каком-нибудь PHP 6? Я просто в новости не вникаю)

Я постараюсь перенести на сторону БД. Знаю, что это всё говнокод. При обработке 20к юзеров в общей сложности выполняется около 70-80к запрсов в БД (около 20 запросов в секунду на протяжении часа). Я еще далеко не мастер SQL Улыбка

Подскажите, пожалуйста, а есть ли в MySQL функция, типа как в PHP round()? Для работы с дробными числами, чтобы после точки было не более 2 значений, т.е.:

round(20.55555555555555, 2); выдаст 20.55

Вот, чтобы если в БД заносится число 20.55555555555555, БД оставляла только 2 числа после точки, т.е. БД занесёт число 20.55?
(Добавление)
На сторону БД перенес 1 запрос. Получилось так:

PHP:
скопировать код в буфер обмена
  1. mysql_query("UPDATE `accounts` SET `credits`=round(`credits`+(`credits`/'100'*'$procent'),2),`lastpay`=round(`credits`/'100'*'$procent',2) WHERE `banned`='0'")


Но есть еще 1 "но". Дело в том, что для каждого пользователя помимо этого запроса в БД на обновление, выполняется запрос на вставку записи в таблицу логов, вот так:

PHP:
скопировать код в буфер обмена
  1.  
  2. mysql_query("INSERT INTO `accr-logs` (`user`,`credits`,`date`) VALUES ('ИД ЮЗЕРА','$lastpay','$date')");
  3.  


$lastpay - это `lastpay` из первого запроса

т.е. нужно, чтобы после выполнения 1 запроса, выполнился запрос INSERT, который возьмет `lastpay` каждого пользователя из таблицы `accounts` и вставит запись для каждого юзера в таблицу `accr-logs`, где `user` будет `id` пользователя из таблицы `accounts`, `lastpay` будет `lastpay` юзера из таблицы `accounts` и `date` будет '$date'.
10. LIME - 25 Июня, 2014 - 21:16:25 - перейти к сообщению
Klinch пишет:
А случаем не планируется многопоточность?
нет не планируется
php не для подобных задач
решением может быть использование менеджера процессов
например Gearman
Klinch пишет:
чтобы после точки было не более 2 значений
тип поля decimal
можно указать колво знаков после зпт
Klinch пишет:
т.е. нужно, чтобы после выполнения 1 запроса, выполнился запрос INSERT
нет не нужно
весь текст запроса можно заключить в транзакцию
использовать mysqli::multi_query (либо PDO...по вкусу)
и в конце использовать множественный INSERT(копить в строку)
тоесть много инсертов одним запросом
$a+($a/100*25) === $a * 1.25
...
короче тут надо оптимизировать запросы а не городить многопоточность
аминь
11. Klinch - 02 Июля, 2014 - 13:07:23 - перейти к сообщению
Вот и всё! Сделал я! Улыбка Помогли полезной ссылкой в "Напишите за меня, пожалуйста" - http://stackoverflow[dot]com/questio[dot][dot][dot]om-another-table
сразу всё стало ясно

CODE (SQL):
скопировать код в буфер обмена
  1. mysql_query("INSERT INTO `accr-logs` (`user`,`credits`,`date`) SELECT `id`, `lastpay`, '$date' FROM `accounts` WHERE lastpay>0;");
  2.  
  3. 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`");
  4.  
  5. mysql_query("UPDATE `accounts`, `referals` SET `accounts`.`credits`=`accounts`.`credits`+`referals`.`lastpay`, `accounts`.`ppay`=`accounts`.`ppay`+`referals`.`lastpay` WHERE `accounts`.`id`=`referals`.`partnerid`");


Спасибо всем!

 

Powered by ExBB FM 1.0 RC1