ФорумПрограммированиеPHP для идиотов → Сортировка пользователей, оптимизация запросов

Сортировка пользователей, оптимизация запросов

  • pasha

    Сообщения: 1048 Репутация: N Группа: Адекваты

    Spritz 9 января 2010 г. 8:21

    Есть таблица
    id | vk_id | parent_id |sort_id

    допустим в таблице 9 записей

    Маша - 1
    Света - 2
    Поликарп - 3
    Григорий - 4
    Василий - 5
    Этибор - 6
    Галина - 7
    Александр - 8
    Геннадий - 9

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

    Написал следующее говнецо
    $parent_id = (int)$_GET['pid'];
    $user_id = (int)$_GET['uid'];

    $mysqlconnect = mysql_connect($db['host'], $db['user'], $db['password']) or die;
    mysql_select_db($db['name'], $mysqlconnect);

    $query = "SELECT * FROM `commands` WHERE `parent_id` = '{$parent_id}' ORDER BY `sort_id` ASC";
    $result = mysql_query($query);

    /*кол-во участников*/
    $num_rows = mysql_num_rows($result);

    /*если пользователей 9(MAX) то удаляем 1го по списку*/

    while($row = mysql_fetch_assoc($result)){
    $id = $row['id'];
    $sort_id = $row['sort_id'];
    $vk_id = $row['vk_id'];

    $newsort_id = ($sort_id - 1);

      $query = "UPDATE `commands` SET `sort_id` = '{$newsort_id}' WHERE `sort_id` ='{$sort_id}' AND `parent_id`='{$parent_id}' LIMIT 1;";
      mysql_unbuffered_query($query);
    }

    if($num_rows == 9){
    $query = "UPDATE `commands` SET `vk_id` = '{$user_id}', `sort_id`='9' WHERE `sort_id` ='0' AND `parent_id`='{$parent_id}' LIMIT 1;";
    mysql_unbuffered_query($query);
    }else{
     $query = "INSERT INTO `commands` ( `id` , `vk_id` , `sort_id` , `parent_id` ) VALUES ('', '{$user_id}', '9', '{$parent_id}');";
    mysql_unbuffered_query($query);
    }
    mysql_close($mysqlconnect);


    Очень важно время выполнения скрипта и оптимизация запросов т.к запросы буду слать из флеш оболочки и по 10 раз многопоточно(я знаю что в php нет многопоточности)

    include_once('libs/multithreading.class.php');
    $uid = 3894466;

    $array = array(
    '3894411','3894422','3894433','3894444','3894455','3894466','3894477','3894488','3894499','3894400'
    );

    foreach($array as $k => $v){
    $multithreading = new MultiThreading();
    $multithreading->setScriptName('get.php?pid='.$v.'&uid='.$uid);
    //$multithreading->setParams($data);
    $multithreading->execute();
    }
  • Ewg777

    Сообщения: 510 Репутация: N Группа: Джедаи

    Spritz 9 января 2010 г. 8:29, спустя 7 минут 6 секунд

    Если будет такая нагрузка, то однозначно постоянный коннект нужен. Мемкэш может под это дело напрячь?
    Спустя 42 сек.
     $id = $row['id'];
    $sort_id = $row['sort_id'];
    $vk_id = $row['vk_id'];
    Это болезнь повсеместна.
  • phpdude

    Сообщения: 26624 Репутация: N Группа: в ухо

    Spritz 9 января 2010 г. 8:33, спустя 4 минуты 8 секунд

    Ewg777, не в курсе? переменные, объявленные как элемент массива в пхп5 копируются или так и остаются ссылками?) просто интересно.
    Сапожник без сапог
  • Ewg777

    Сообщения: 510 Репутация: N Группа: Джедаи

    Spritz 9 января 2010 г. 8:48, спустя 15 минут 1 секунду


    Ewg777, не в курсе? переменные, объявленные как элемент массива в пхп5 копируются или так и остаются ссылками?) просто интересно.
    Не копируются.

    $array = range(-100500, 100500);
    echo memory_get_usage(1) . "<br>"; // 21495808
    $a = $array['15'];
    echo memory_get_usage(1) . "<br>"; // 21495808
  • phpdude

    Сообщения: 26624 Репутация: N Группа: в ухо

    Spritz 9 января 2010 г. 8:35, спустя 23 часа 47 минут 43 секунды

    Ewg777, просто

    $a = $b не копируются в пхп5. а $a = $b[$c]; интересно :)
    это я пояснил чем интересуюсь
    Сапожник без сапог
  • artoodetoo

    Сообщения: 5139 Репутация: N Группа: в ухо

    Spritz 9 января 2010 г. 19:47, спустя 11 часов 12 минут 5 секунд

    думаю делать выводы из замеров memory_get_usage() нельзя

    во-первых в PHP есть отложенное копирование.
    во-вторых, в комментариях к функции есть много интересных замечаний по поводу CGI, по поводу PHP под Windows, по поводу того что функция провоцирует сборку мусора…
    в-третьих, уже неважно :)

    если $a = $b['a'] делается только для удобства использования, как короткий синоним, то наверное логично делать $a =& $b['a'], что означает буквально то что нужно. при этом точно память не будет тратиться :)

    ιιlllιlllι унц-унц
  • Ewg777

    Сообщения: 510 Репутация: N Группа: Джедаи

    Spritz 9 января 2010 г. 23:44, спустя 3 часа 56 минут 12 секунд

    по поводу PHP под Windows
    Ну, а это причём здесь?
  • phpdude

    Сообщения: 26624 Репутация: N Группа: в ухо

    Spritz 9 января 2010 г. 23:53, спустя 9 минут 43 секунды

    в пхп5 переменные не копируются при сваивании, они являются ссылками на значения которые присваивались им. если переменную изменить, то тогда происходит копирование и изменение, но не присваивание :)

    так что в пхп5 для удобства $a = $b делать можно и нужно)
    Сапожник без сапог
  • artoodetoo

    Сообщения: 5139 Репутация: N Группа: в ухо

    Spritz 10 января 2010 г. 0:54, спустя 1 час 51 секунду

    Ewg777, просто докучи. есть много причин не полагаться на эти замеры.

    кстати, если заменить параметр memory_get_usage() на 0 или false, то согласно документации будет показываться запрошенная память вместо реально выделенной. так вот, память под переменную таки запрашивается (немножко)! просто реально выделяется она большими кусками. поэтому практически случайно в твоем примере цифры совпали.

    вобщем да, память в PHP расходуется экономно :) а вот результатам тестов верить можно с кучей оговорок.
    ιιlllιlllι унц-унц
  • phpdude

    Сообщения: 26624 Репутация: N Группа: в ухо

    Spritz 10 января 2010 г. 1:06, спустя 12 минут

    artoodetoo, айайай))

    Сапожник без сапог
  • artoodetoo

    Сообщения: 5139 Репутация: N Группа: в ухо

    Spritz 10 января 2010 г. 2:24, спустя 1 час 18 минут 3 секунды

    в наше время верить нельзя никому и ничему.

    кстати, интересно почему ТС использовал unbuffered запросы? особенно в insert и update :)
    ιιlllιlllι унц-унц
  • phpdude

    Сообщения: 26624 Репутация: N Группа: в ухо

    Spritz 10 января 2010 г. 2:39, спустя 14 минут 39 секунд


    в наше время верить нельзя никому и ничему.

    кстати, интересно почему ТС использовал unbuffered запросы? особенно в insert и update :)
    видимо чтобы было круто и быстро)

    $query = "SELECT * FROM `commands` WHERE `parent_id` = '{$parent_id}' ORDER BY `sort_id` ASC";
    $result = mysql_query($query);

    /*кол-во участников*/
    $num_rows = mysql_num_rows($result);

    /*если пользователей 9(MAX) то удаляем 1го по списку*/

    while($row = mysql_fetch_assoc($result)){


    тогда вот этот кусок неоптимален :)
    Сапожник без сапог
  • artoodetoo

    Сообщения: 5139 Репутация: N Группа: в ухо

    Spritz 10 января 2010 г. 5:45, спустя 3 часа 6 минут 11 секунд

    Pasha, так много букв в первом посте, что непонятная цель.
    сдается мне что надо просто выбирать 10 записей с максимальным id (или sort_id??? нахуй sort_id!!!) я не нашел нигде слова delete, значит ты их не удаляешь… чем select … limit не устраивает?
    зачем возня с постоянным update, может надо просто ВЫВОДИТЬ номера сминусованные на max(id)-9, а не изменять их в базе?
    http://pyha.ru/forum/mlist/sortdesc/registered
    добавь сюда номера по порядку и это твой случай. или нет?
    ιιlllιlllι унц-унц
  • pasha

    Сообщения: 1048 Репутация: N Группа: Адекваты

    Spritz 10 января 2010 г. 5:43, спустя 23 часа 57 минут 36 секунд

    artoodetoo, что там не понятно то в первом посте?)
    бля есть пирамида из 10 человек, при добавлении новый юзер на 10е место, 10й на 9 … 1й вообще выпадает (это как должно работать). В моем случае (в моем говнокоде) удаления вообще не происходит. Я так понял я не правильно реализовал т.к сильно насилую базу.

    применил mysql_unbuffered_query т.к
    чтобы было круто и быстро)


    вот. я не знаю как сделать иначе. не знаю тонкостей
  • artoodetoo

    Сообщения: 5139 Репутация: N Группа: в ухо

    Spritz 10 января 2010 г. 5:47, спустя 4 минуты 23 секунды

    http://pyha.ru/forum/mlist/sortdesc/registered
    добавь сюда номера по порядку и это твой случай. или нет?

    mysql_unbuffered_query тебе не дает НИ ЧЕ ГО в плане оптимизации. он применяется для специальных случаев select. и вообще нахуй не нужен
    ιιlllιlllι унц-унц

Пожалуйста, авторизуйтесь, чтобы написать комментарий!