|
|
|
| Всем привет, столкнулся с проблемой.
Решил вести статистику скачиваний, когда пользователь жмёт "скачать" ему выдаётся файл и записывается запись о файле в БД.
Вот она:
mysql_query("INSERT INTO `ip_tm_nm_ob` VALUES('".$ip."', NOW(), '".$name."', '".$sz."')");
|
Со временем сервер начинает тормозить, если запустить более обширную статистику (много запросов), то сервер чуть ли не виснет.
Самое смешное, что в минуту записывается примерно 10 записей.
Поля с типом varchar с нужным количеством допустимых символов.
Как поступить в данном случае? В каких местах подредактировать mysql? Может есть какие оптимальные методы кеширования, самостоятельной очистки памяти mysql (помимо mysql_close)?
p.s. Надеюсь похмелье никого мучить не будет, и сможете дать рациональные советы не в 10тых числах января)))) | |
|
|
|
|
|
|
|
для: Diplex
(01.01.2010 в 04:52)
| | 1) mysql_close() когда применяется? До того, как начинает скачиваться файл?
2) В таблице ip_tm_nm_ob имеются ключи? | |
|
|
|
|
|
|
|
для: cheops
(01.01.2010 в 11:56)
| | 1) mysql_close() применяется сразу после записи в БД. Файл отдаётся файлом, после того, как отдался весь файл, идёт запись в БД.
2) Нет, никаких ключей и индексов нет... | |
|
|
|
|
|
|
|
для: Diplex
(02.01.2010 в 01:38)
| | Привет.
Вот из-за второго она и тормозит :) Мне приносили базу на 800 тыс записей тормозила ужасно.
Я потом читал, что база не имеющая первичного ключа, при любом запросе сначала его высчитывает. У меня раньше был вопрос зачем они вообще первичные ключи нужны, после общения с той базой вопрос больше не возникает . :) | |
|
|
|
|
|
|
|
для: easywind
(08.01.2010 в 12:31)
| | При вставке данных при помощи INSERT индексы наоборот мешают и замедляют работу, так как их необходимо пересчитывать. | |
|
|
|
|
|
|
|
для: cheops
(09.01.2010 в 14:34)
| | Да, я тоже про это читал :) | |
|
|
|
|
|
|
|
для: cheops
(09.01.2010 в 14:34)
| | Компромисс есть? Очень интересно=) | |
|
|
|
|
|
|
|
для: Boeing
(09.01.2010 в 15:26)
| | Чтобы услышать что-то определенное, нужно хотя бы дамп структуры таблицы показать. | |
|
|
|
|
|
|
|
для: 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;
|
| |
|
|
|
|
|
|
|
для: Diplex
(10.01.2010 в 02:55)
| | Но здесь нет ни одного индекса, даже первичного. А значит серверу придется просканировать всё табличное пространство, чтобы добраться до хвоста.
IP, меж тем, в 4 байта влезает.
Когда будете создавать, подумайте, что проще проиндексировать - 4 байта или 15. | |
|
|
|
|
|
|
|
для: Trianon
(10.01.2010 в 10:01)
| | Можете показать, как переделать дамп, чтобы было правильно? | |
|
|
|
|
|
|
|
для: Diplex
(10.01.2010 в 15:59)
| | Дамп у Вас снят с таблицы вполне корректно.
А по структуре я подсказал. | |
|
|
|
|
|
|
|
для: Trianon
(10.01.2010 в 22:52)
| | Ну я конечно имел ввиду не дамп, а структуру... Какое поле лучше сделать первичным? Или добавить поле id и сделать его первичным, но оно мне не понадобится... как поступить? | |
|
|
|
|
|
|
|
для: Diplex
(11.01.2010 в 00:10)
| | Как я могу советовать?
Я же не знаю, какую сущность эта таблица описывает.
Естественный уникальный ключ обычно является хорошим претендентом на роль первичного.
Если это слишком громоздкое для практического доступа поле (или набор полей) - тогда имеет смысл ввести суррогатный. | |
|
|
|
|
|
|
|
для: 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 символа получается. Или есть варианты разумней? | |
|
|
|
|
|
|
|
для: kosta_in_net
(12.01.2010 в 03:20)
| | Преобразовать в число. Те же 4 байта, но их уже можно будет использовать в выражениях. | |
|
|
|
|
|
|
|
для: 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) | |
|
|
|
|
|
|
|
для: Trianon
(12.01.2010 в 10:14)
| | спасибо. Просто таких задач не стояло, так что, не приходилось искать им решений. А тыт случайно прочел и заинтересовался, как... | |
|
|
|
|
|
|
|
для: cheops
(09.01.2010 в 14:34)
| | >При вставке данных при помощи INSERT индексы наоборот мешают и замедляют работу, так как их необходимо пересчитывать.
Я имел ввиду первичные ключи, не индексы. | |
|
|
|