Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: insert - сильно грузит
 
 автор: Diplex   (01.01.2010 в 04:52)   письмо автору
 
 

Всем привет, столкнулся с проблемой.
Решил вести статистику скачиваний, когда пользователь жмёт "скачать" ему выдаётся файл и записывается запись о файле в БД.

Вот она:

mysql_query("INSERT INTO `ip_tm_nm_ob` VALUES('".$ip."', NOW(), '".$name."', '".$sz."')");


Со временем сервер начинает тормозить, если запустить более обширную статистику (много запросов), то сервер чуть ли не виснет.
Самое смешное, что в минуту записывается примерно 10 записей.
Поля с типом varchar с нужным количеством допустимых символов.

Как поступить в данном случае? В каких местах подредактировать mysql? Может есть какие оптимальные методы кеширования, самостоятельной очистки памяти mysql (помимо mysql_close)?

p.s. Надеюсь похмелье никого мучить не будет, и сможете дать рациональные советы не в 10тых числах января))))

  Ответить  
 
 автор: cheops   (01.01.2010 в 11:56)   письмо автору
 
   для: Diplex   (01.01.2010 в 04:52)
 

1) mysql_close() когда применяется? До того, как начинает скачиваться файл?
2) В таблице ip_tm_nm_ob имеются ключи?

  Ответить  
 
 автор: Diplex   (02.01.2010 в 01:38)   письмо автору
 
   для: cheops   (01.01.2010 в 11:56)
 

1) mysql_close() применяется сразу после записи в БД. Файл отдаётся файлом, после того, как отдался весь файл, идёт запись в БД.
2) Нет, никаких ключей и индексов нет...

  Ответить  
 
 автор: easywind   (08.01.2010 в 12:31)   письмо автору
 
   для: Diplex   (02.01.2010 в 01:38)
 

Привет.
Вот из-за второго она и тормозит :) Мне приносили базу на 800 тыс записей тормозила ужасно.
Я потом читал, что база не имеющая первичного ключа, при любом запросе сначала его высчитывает. У меня раньше был вопрос зачем они вообще первичные ключи нужны, после общения с той базой вопрос больше не возникает . :)

  Ответить  
 
 автор: cheops   (09.01.2010 в 14:34)   письмо автору
 
   для: easywind   (08.01.2010 в 12:31)
 

При вставке данных при помощи INSERT индексы наоборот мешают и замедляют работу, так как их необходимо пересчитывать.

  Ответить  
 
 автор: Diplex   (09.01.2010 в 14:48)   письмо автору
 
   для: cheops   (09.01.2010 в 14:34)
 

Да, я тоже про это читал :)

  Ответить  
 
 автор: Boeing   (09.01.2010 в 15:26)   письмо автору
 
   для: cheops   (09.01.2010 в 14:34)
 

Компромисс есть? Очень интересно=)

  Ответить  
 
 автор: Trianon   (09.01.2010 в 15:31)   письмо автору
 
   для: Boeing   (09.01.2010 в 15:26)
 

Чтобы услышать что-то определенное, нужно хотя бы дамп структуры таблицы показать.

  Ответить  
 
 автор: Diplex   (10.01.2010 в 02:55)   письмо автору
 
   для: Trianon   (09.01.2010 в 15:31)
 

Вот дамп:


CREATE TABLE `ip_tm_nm_ob` (
  `ip` varchar(15) default NULL,
  `tm` datetime default NULL,
  `nm` varchar(100) default NULL,
  `ob` varchar(6) default NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

  Ответить  
 
 автор: Trianon   (10.01.2010 в 10:01)   письмо автору
 
   для: Diplex   (10.01.2010 в 02:55)
 

Но здесь нет ни одного индекса, даже первичного. А значит серверу придется просканировать всё табличное пространство, чтобы добраться до хвоста.

IP, меж тем, в 4 байта влезает.
Когда будете создавать, подумайте, что проще проиндексировать - 4 байта или 15.

  Ответить  
 
 автор: Diplex   (10.01.2010 в 15:59)   письмо автору
 
   для: Trianon   (10.01.2010 в 10:01)
 

Можете показать, как переделать дамп, чтобы было правильно?

  Ответить  
 
 автор: Trianon   (10.01.2010 в 22:52)   письмо автору
 
   для: Diplex   (10.01.2010 в 15:59)
 

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

  Ответить  
 
 автор: Diplex   (11.01.2010 в 00:10)   письмо автору
 
   для: Trianon   (10.01.2010 в 22:52)
 

Ну я конечно имел ввиду не дамп, а структуру... Какое поле лучше сделать первичным? Или добавить поле id и сделать его первичным, но оно мне не понадобится... как поступить?

  Ответить  
 
 автор: Trianon   (11.01.2010 в 03:17)   письмо автору
 
   для: Diplex   (11.01.2010 в 00:10)
 

Как я могу советовать?
Я же не знаю, какую сущность эта таблица описывает.
Естественный уникальный ключ обычно является хорошим претендентом на роль первичного.
Если это слишком громоздкое для практического доступа поле (или набор полей) - тогда имеет смысл ввести суррогатный.

  Ответить  
 
 автор: kosta_in_net   (12.01.2010 в 03:20)   письмо автору
 
   для: Trianon   (11.01.2010 в 03:17)
 

кстати, а как хранить ip в 4-байтном варианте? Так:
$ip = "93.158.128.0";
$arr = explode(".", $ip);
$data=chr($arr[0]).chr($arr[1]).chr($arr[2]).chr($arr[3]);
? 4 символа получается. Или есть варианты разумней?

  Ответить  
 
 автор: Loki   (12.01.2010 в 10:04)   письмо автору
 
   для: kosta_in_net   (12.01.2010 в 03:20)
 

Преобразовать в число. Те же 4 байта, но их уже можно будет использовать в выражениях.

  Ответить  
 
 автор: Trianon   (12.01.2010 в 10:14)   письмо автору
 
   для: kosta_in_net   (12.01.2010 в 03:20)
 

>кстати, а как хранить ip в 4-байтном варианте?
Как хранить? В типе int.
Тип int - это как раз 4-байовое целое.
Или как преобразовывать?

Так:
>$ip = "93.158.128.0";
>$arr = explode(".", $ip);
>$data=chr($arr[0]).chr($arr[1]).chr($arr[2]).chr($arr[3]);
>? 4 символа получается. Или есть варианты разумней?

Это у Вас получилась строка из 4 символов, байты которых равны исх. числам.
Дальше нужна перепаковка (pack/unpack)
По-моему, проще обойтись ip2long() (для php) либо INET_ATON() (для MySQL)

  Ответить  
 
 автор: kosta_in_net   (12.01.2010 в 10:19)   письмо автору
 
   для: Trianon   (12.01.2010 в 10:14)
 

спасибо. Просто таких задач не стояло, так что, не приходилось искать им решений. А тыт случайно прочел и заинтересовался, как...

  Ответить  
 
 автор: easywind   (09.01.2010 в 22:48)   письмо автору
 
   для: cheops   (09.01.2010 в 14:34)
 

>При вставке данных при помощи INSERT индексы наоборот мешают и замедляют работу, так как их необходимо пересчитывать.
Я имел ввиду первичные ключи, не индексы.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования