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

Форум MySQL

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

 

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

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

тема: Норматив быстродействия базы
 
 автор: Владимир55   (02.03.2009 в 17:56)   письмо автору
 
 

Скрипты стали тормозить, а некоторые даже отказываются исполняться. Стремясь разобраться в причине, я постепенно сокращал объём кода каждого скрипта, но он всё равно открывался слишком медленно.

В конце концов остался вот такой код:
    $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 секунд!
Разве это нормально?

  Ответить  
 
 автор: Trianon   (02.03.2009 в 18:53)   письмо автору
 
   для: Владимир55   (02.03.2009 в 17:56)
 

На 5 тысяч запросов - не удивительно.
В то время как задача решается одним.

  Ответить  
 
 автор: Владимир55   (02.03.2009 в 19:21)   письмо автору
 
   для: 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);

  Ответить  
 
 автор: Trianon   (02.03.2009 в 19:26)   письмо автору
 
   для: Владимир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);

  Ответить  
 
 автор: Владимир55   (02.03.2009 в 19:50)   письмо автору
 
   для: Trianon   (02.03.2009 в 19:26)
 

Так получилось время ноль. Иной раз 1 секунда.

Но вот это
SELECT DISTINCT '$dat_arh' AS dat_arh, ip 
я никак понять не могу! Даже гипотезы нет, что это означает...
Как $dat_arh попало в критерий уникальности?

Это можно выразить словами?

  Ответить  
 
 автор: Trianon   (02.03.2009 в 19:57)   письмо автору
 
   для: Владимир55   (02.03.2009 в 19:50)
 

SELECT DISTINCT запрашивает уникальными целые строки выборки, а вовсе не отдельные поля, как многие думают.
кроме того так цитировать неправильно.
в запросе будет уже
SELECT DISTINCT '2009-03-02' AS dat_arh, ip ....

собственно алиас здесь можно и не ставить... соответственно будет
SELECT DISTINCT '2009-03-02', ip ....

  Ответить  
 
 автор: Владимир55   (02.03.2009 в 20:11)   письмо автору
 
   для: 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);

  Ответить  
 
 автор: Trianon   (02.03.2009 в 20:30)   письмо автору
 
   для: Владимир55   (02.03.2009 в 20:11)
 

во сколько раз быстрее?

  Ответить  
 
 автор: Владимир55   (02.03.2009 в 21:38)   письмо автору
 
   для: Trianon   (02.03.2009 в 20:30)
 

Измерительное средство не располагает достаточным разрешением, но раз в 15-20 быстрее - это наверняка.

================
Начитавшись книжек о необычайном быстродействии выборки в MySQL, я даже не ставил своей целью экономию ресурсов (а хоть бы и ставил, в силу отсутствия навыков вряд ли бы чего достиг - тут хоть бы как-нибудь то заработало!).

Но на практике пришлось уже дважды повысить хостинговый тариф, ибо, по сравнению с рнр как таковым, база оказалась весьма требовательной к производительности процессора, ибо при выполнении любого запроса съедает абсолютно все, оставшееся от апача.

  Ответить  
 
 автор: Trianon   (02.03.2009 в 22:06)   письмо автору
 
   для: Владимир55   (02.03.2009 в 21:38)
 

Измерительное средство - это функция microtime(1) , дающая точность 10-6 сек

  Ответить  
 
 автор: Владимир55   (02.03.2009 в 22:41)   письмо автору
 
   для: Trianon   (02.03.2009 в 22:06)
 

Я то мерил в секундах, а Ваша версия работает быстрее 1 секунды, потому и неопределенность. Но теперь, ради интереса, измерил поточнее. И получился выигрыш в 45 раз!

  Ответить  
 
 автор: Trianon   (02.03.2009 в 22:08)   письмо автору
 
   для: Владимир55   (02.03.2009 в 21:38)
 

SELECT DISTINCT - вообще тяжелый запрос...

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

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