Слишком большое время обработки php+sql
Здравствуйте, написал кодец, но время обработки у него 250+ ms ... проблемма в том, что каждых 100ms к нему за ответом обращается 'ajax'....надо php'шный код оптимизировать что-ли как-то...это реально тут сделать? Тупит из-за большого обьема БД...сейчас там 1500записей. Когда было 120 - не тупило(((
вобщем, помогите пожалуйста максимально оптимизировать код.. код: $userdat = mysql_fetch_assoc(mysql_query("SELECT * FROM users WHERE id='".$_POST["plid"]."'")); $count = 0; for ($y=$userdat["y"]-5; $y<=$userdat["y"]+5; $y++){ for ($x=$userdat["x"]-5; $x<=$userdat["x"]+5; $x++){ $data_map = mysql_fetch_assoc(mysql_query("SELECT * FROM map WHERE loc='".$userdat["loc"]."' AND x='".$x."' AND y='".$y."'")); if($data_map["img"]!="" && $data_map["img"]!=NULL){ if($_SESSION["x".$count]!=$data_map["img"]){ $map.="<d".$count.">".$data_map["img"]."</d".$count.">"; $_SESSION["x".$count]=$data_map["img"]; } }else{ if($_SESSION["x".$count]!="0"){ $map.="<d".$count.">0</d".$count.">"; $_SESSION["x".$count]="0"; } } $count+=1; } } |
индексы по полям x,y,loc расставил?
|
не имею понятия как это и что это, вот сейчас чту сижу...спасибо за наводку)
|
Ещё про join заодно почитай.
|
Возможно есть смысл сделать выборку из map одним запросом.
|
[sql]SELECT * FROM users RIGHT JOIN map ON map.y BEETWEEN users.y-5 AND users.y+5 AND map.x BEETWEEN users.x-5 AND users.x+5 WHERE id={$id} ORDER BY map.x, map.y[/sql] Что-то вроде этого, проверить не смогу.
|
:blink: хм, спасибо..ща буду чет колупать
|
проиндексировал....было так:
Код:
CREATE TABLE `map` ( Код:
CREATE TABLE `map` ( |
с учетом поправок B@rmaley.e><e, и subzey, данная таблица должна показывать хорошее время запроса.
если нет, то почему вы не написали, результаты нового тестирования? PS ваша база микроскопическая вообще-то. я бы посоветовал проверять на большой базе |
проверил на большой базе
в таблице 500.000 строк время обработки около 500ms ;) надо меньше 100ms ибо запросы на серв каждых 100мс поступают |
С помощью неких личностей написал такое...но работает не коректно, выдает не полный ответ...читает мало с базы( должно читать 121 строку, читает и выдает 35+-
$userdat = mysql_fetch_assoc(mysql_query("SELECT * FROM users WHERE id='1'")); $count = 0; $arr_x = array(); $arr_y = array(); for ($y=$userdat["y"]-5; $y<=$userdat["y"]+5; $y++){ $arr_y[] = $y; for ($x=$userdat["x"]-5; $x<=$userdat["x"]+5; $x++){ $arr_x[] = $x; } } $resource = mysql_query("SELECT * FROM `map` WHERE `loc` = 0 AND `x` IN (" . join(',', $arr_x) . ") AND `y` IN (" . join(',', $arr_y) . ")"); while($data_map = mysql_fetch_assoc($resource)){ $session_name = "x" . $count; if (empty($data_map['img'])) continue; if ($_SESSION[$session_name] != $data_map['img']){ $_SESSION[$session_name] = $data_map["img"]; $map .= "<d" . $count . ">" . $_SESSION[$session_name] . "</d" . $count . ">"; }else{ if ($_SESSION[$session_name]){ $_SESSION[$session_name] = 0; $map .= "<d" . $count . ">" . $_SESSION[$session_name] . "</d" . $count .">"; } } $count++; } |
Цитата:
|
Цитата:
|
кстати!
это да. вам нужно либо сокеты использовать, либо уменьшить частоту запросов хотя и сокеты могу не сильно-то помочь |
Часто ли от клиента дожна идти какая-то информация? Часто ли будут меняться переданные данные?
Если данные меняются относительно редко (раз в несколько секунд), можно использовать COMET, чтобы не гнать клиенту одинаковые данные. Если достаточно часто, то можно устроить некое подобие event-source (IE с файрфоксом, насколько я знаю, event-source не умеют). А именно — в старых добрых традициях чата Бородина слать последовательно теги <script> в скрытый ифрейм. Тогда можно сэкономить время на SYN→ACK→SYN-ACK и передаче заголовков запроса и ответа. Другие предложения? Самому интересно. :) |
Часовой пояс GMT +3, время: 10:41. |