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

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: MySQL

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Описание: Удаление строк в таблице
Klinch
Отправлено: 23 Июня, 2014 - 19:54:38
Post Id


Частый гость


Покинул форум
Сообщений всего: 214
Дата рег-ции: Июль 2012  


Помог: 0 раз(а)




Здравствуйте!

Могут ли в БД MySQL удаляться строки как-то еще, кроме как по запросу DELETE FROM?
 
 Top
Мелкий Супермодератор
Отправлено: 23 Июня, 2014 - 20:18:53
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




replace, truncate, скрытый delete (из триггера, например), по внешнему ключу.


-----
PostgreSQL DBA
 
 Top
EuGen Администратор
Отправлено: 23 Июня, 2014 - 21:29:40
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




DROP+CREATE (то же самое, что TRUNCATE по сути), частичное восстановление из бэкапа (операции с самой БД) - всё это также может быть причиной.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
Klinch
Отправлено: 24 Июня, 2014 - 20:23:05
Post Id


Частый гость


Покинул форум
Сообщений всего: 214
Дата рег-ции: Июль 2012  


Помог: 0 раз(а)




Почему-то вроде как стали удаляться записи из таблицы юзеров. Как говорят - просто так. На сайте просетенькие запросы вида SELETC `id` FROM `accounts` WHERE `lol`='1', INSERT INTO `tabliza` WHERE `lolol`='1' AND `lol`='2' и т.п.

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

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

Спасибо!
 
 Top
LIME
Отправлено: 24 Июня, 2014 - 21:45:25
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




можно запретить пользователю запросы DELETE
в правах пользователя
но это запретит любые удаления
еще есть вариант включить логи MySQL
и потом поискать удаления
(Добавление)
еще можно создать триггер на удаление для таблицы
и там отменить его
и в таблицу логов поместить запрос
я бы так и сделал

(Отредактировано автором: 24 Июня, 2014 - 21:46:11)

 
 Top
Klinch
Отправлено: 25 Июня, 2014 - 09:19:36
Post Id


Частый гость


Покинул форум
Сообщений всего: 214
Дата рег-ции: Июль 2012  


Помог: 0 раз(а)




LIME

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

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


Частый гость


Покинул форум
Сообщений всего: 214
Дата рег-ции: Июль 2012  


Помог: 0 раз(а)




Еще один вопрос.

Скрипт построен на 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, а это целый час обработки.

Возможно ли выполнять всё это многопоточно? И как?
Или это уже лучше в другой раздел?
Спасибо!

(Отредактировано автором: 25 Июня, 2014 - 16:19:39)

 
 Top
LIME
Отправлено: 25 Июня, 2014 - 18:14:48
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




а эти вычисления точно нельзя на сторону бд перенести?
(Добавление)
многопоточности в php нет
кроме всяких её эмуляций
 
 Top
Klinch
Отправлено: 25 Июня, 2014 - 19:59:44
Post Id


Частый гость


Покинул форум
Сообщений всего: 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 запрос. Получилось так:

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'.

(Отредактировано автором: 25 Июня, 2014 - 20:00:57)

 
 Top
LIME
Отправлено: 25 Июня, 2014 - 21:16:25
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




Klinch пишет:
А случаем не планируется многопоточность?
нет не планируется
php не для подобных задач
решением может быть использование менеджера процессов
например Gearman
Klinch пишет:
чтобы после точки было не более 2 значений
тип поля decimal
можно указать колво знаков после зпт
Klinch пишет:
т.е. нужно, чтобы после выполнения 1 запроса, выполнился запрос INSERT
нет не нужно
весь текст запроса можно заключить в транзакцию
использовать mysqli::multi_query (либо PDO...по вкусу)
и в конце использовать множественный INSERT(копить в строку)
тоесть много инсертов одним запросом
$a+($a/100*25) === $a * 1.25
...
короче тут надо оптимизировать запросы а не городить многопоточность
аминь

(Отредактировано автором: 25 Июня, 2014 - 23:32:06)

 
 Top
Klinch
Отправлено: 02 Июля, 2014 - 13:07:23
Post Id


Частый гость


Покинул форум
Сообщений всего: 214
Дата рег-ции: Июль 2012  


Помог: 0 раз(а)




Вот и всё! Сделал я! Улыбка Помогли полезной ссылкой в "Напишите за меня, пожалуйста" - 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`");


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

(Отредактировано автором: 02 Июля, 2014 - 13:08:31)

 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« SQL и Архитектура БД »


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



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB