|
|
|
| Скрипты стали тормозить, а некоторые даже отказываются исполняться. Стремясь разобраться в причине, я постепенно сокращал объём кода каждого скрипта, но он всё равно открывался слишком медленно.
В конце концов остался вот такой код:
$start_arh = time ();
// Параметры соединения
$dblocation = "localhost";
$dbname = "luck";
$dbuser = "svn";
$dbpasswd = "Str";
// Соединяемся с сервером базы данных
$dbcnx = @mysql_connect($dblocation, $dbuser, $dbpasswd);
if(!$dbcnx) return;
// Выбираем базу данных
if(!@mysql_select_db($dbname,$dbcnx)) exit();
$dat_arh = date("Y-m-d", time());
$seg_sec = mktime(0,0,0,date("m"), date("d"), date("Y"));
$res = mysql_query("SELECT DISTINCT ip FROM log_vh WHERE time > '$seg_sec' ");
while($row = mysql_fetch_assoc($res))
{
$ip = $row['ip'];
mysql_query ("INSERT INTO ip_arh (dat_arh, ip) VALUES ('$dat_arh', '$ip')");
}
echo "<br>", time() - $start_arh;
|
Выборка произволится из таблицы, содержащей менее 5000 записей. Время выборки не постоянно, то 7 секунд, то 16 секунд. А иногда и 25 секунд!
Разве это нормально? | |
|
|
|
|
|
|
|
для: Владимир55
(02.03.2009 в 17:56)
| | На 5 тысяч запросов - не удивительно.
В то время как задача решается одним. | |
|
|
|
|
|
|
|
для: Trianon
(02.03.2009 в 18:53)
| | Одним запросом я не сумел. Пытался вот так:
$query = "
INSERT INTO ip_arh (dat_arh, ip) VALUES ('$dat_arh', '$ip')
SELECT DISTINCT ip FROM log_vh WHERE time > '$seg_sec'";
mysql_query($query);
|
| |
|
|
|
|
|
|
|
для: Владимир55
(02.03.2009 в 19:21)
| | VALUES то зачем?
$query = "
INSERT INTO ip_arh (dat_arh, ip)
SELECT DISTINCT '$dat_arh' AS dat_arh, ip
FROM log_vh WHERE time > '$seg_sec'";
mysql_query($query);
|
| |
|
|
|
|
|
|
|
для: Trianon
(02.03.2009 в 19:26)
| | Так получилось время ноль. Иной раз 1 секунда.
Но вот это
SELECT DISTINCT '$dat_arh' AS dat_arh, ip
| я никак понять не могу! Даже гипотезы нет, что это означает...
Как $dat_arh попало в критерий уникальности?
Это можно выразить словами? | |
|
|
|
|
|
|
|
для: Владимир55
(02.03.2009 в 19:50)
| | SELECT DISTINCT запрашивает уникальными целые строки выборки, а вовсе не отдельные поля, как многие думают.
кроме того так цитировать неправильно.
в запросе будет уже
SELECT DISTINCT '2009-03-02' AS dat_arh, ip ....
|
собственно алиас здесь можно и не ставить... соответственно будет
SELECT DISTINCT '2009-03-02', ip ....
|
| |
|
|
|
|
|
|
|
для: Trianon
(02.03.2009 в 19:57)
| | То есть, можно и так (оно работает):
$query = "
INSERT INTO ip_arh (dat_arh, ip)
SELECT DISTINCT '$dat_arh', ip
FROM log_vh WHERE time > '$seg_sec'";
mysql_query($query);
|
| |
|
|
|
|
|
|
|
для: Владимир55
(02.03.2009 в 20:11)
| | во сколько раз быстрее? | |
|
|
|
|
|
|
|
для: Trianon
(02.03.2009 в 20:30)
| | Измерительное средство не располагает достаточным разрешением, но раз в 15-20 быстрее - это наверняка.
================
Начитавшись книжек о необычайном быстродействии выборки в MySQL, я даже не ставил своей целью экономию ресурсов (а хоть бы и ставил, в силу отсутствия навыков вряд ли бы чего достиг - тут хоть бы как-нибудь то заработало!).
Но на практике пришлось уже дважды повысить хостинговый тариф, ибо, по сравнению с рнр как таковым, база оказалась весьма требовательной к производительности процессора, ибо при выполнении любого запроса съедает абсолютно все, оставшееся от апача. | |
|
|
|
|
|
|
|
для: Владимир55
(02.03.2009 в 21:38)
| | Измерительное средство - это функция microtime(1) , дающая точность 10-6 сек | |
|
|
|
|
|
|
|
для: Trianon
(02.03.2009 в 22:06)
| | Я то мерил в секундах, а Ваша версия работает быстрее 1 секунды, потому и неопределенность. Но теперь, ради интереса, измерил поточнее. И получился выигрыш в 45 раз! | |
|
|
|
|
|
|
|
для: Владимир55
(02.03.2009 в 21:38)
| | SELECT DISTINCT - вообще тяжелый запрос... | |
|
|
|