Слишком большое время обработки 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, время: 20:30. |