#1 2010.03.30 20:10

Anwap
Участник
Зарегистрирован: 2009.09.19
Сообщений: 26
Карма: 0
Профиль

Оптимизировать кусок кода

Gemorroj помоги оптимизировать этот кусок кода

Код:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
mysql_query("OPTIMIZE TABLE `".prefix."url`");
mysql_query("OPTIMIZE TABLE `".prefix."users`");
$result1=mysql_query("SELECT * FROM `".prefix."users` WHERE `cfrom`<=`cto`");
 
if ($result1>0)
{
 
while ($field=mysql_fetch_assoc($result1))
{
mysql_query("update `".prefix."url` set `activ`='1' where `activ` = '0' && `moder` = '0' and `id_user` = '".$field['id']."';");
}
}
$res=mysql_query("SELECT * FROM `".prefix."users` WHERE `cfrom`>`cto`");
if ($res>0)
{
while ($field=mysql_fetch_assoc($res))
{
mysql_query("update `".prefix."url` set `activ`='0' where `activ` = '1' && `moder` = '0' and `id_user` = '".$field['id']."';");
}
}
 
$l = mysql_result(mysql_query('SELECT COUNT(`id`) FROM `'.prefix.'url` WHERE `id_user`<>"'.$_USER['id'].'" AND `activ`=0 AND `moder`=0 '),0);
$r = mysql_result(mysql_query('SELECT COUNT(`who`) FROM `'.prefix.'clicks` WHERE `who`="'.$_USER['login'].'"'),0);
$pll = $l-$r;
$pll++;
 
 
echo 'Показано: <strong>'.$_USER['numlink'].'</strong> ссылок из <strong>'.$pll.'</strong> доступных | <a href="/?mode=go&amp;'.rand(0,9999).'">Обновить</a><div class="lines"></div>';
 
 
$col = mysql_result(mysql_query('SELECT COUNT(`id`) FROM `'.prefix.'url` WHERE `id_user`="'.$_USER['id'].'"'),0);
if($col == 0)
{
echo 'Для того чтобы переходить по ссылкам, Вам нужно создать хоть одну плошадку!';
break;
}
 
 
$re=mysql_query("SELECT u.login, l.id, l.nazv FROM `".prefix."users` as `u`, `".prefix."url` as `l` WHERE u.cfrom > u.cto and l.id_user = u.id and l.activ = 0 and l.moder = 0 and l.id_user <> '".$_USER['id']."' and l.id not in (SELECT `to` FROM `".prefix."clicks` WHERE `who`='".$_USER['login']."' ) ORDER by rand() LIMIT 1,".$_USER['numlink'].";");
 
 
while($ress=mysql_fetch_array($re))
{
echo '<div class="url">
&raquo; <a href="/?mode=gook&amp;to='.$ress['login'].'&amp;id='.$ress['id'].'">'.$ress['nazv'].'</a>
</div>';
}
if ($pll==0) { echo 'Нет доступных ссылок! Зайдите позже...'; }

это из клик клуба.

Неактивен

#2 2010.03.30 22:53

Gemorroj
Administrator
Откуда: Белоруссия
Зарегистрирован: 2007.11.03
Сообщений: 6594
Карма: 107
Профиль Веб-сайт

Re: Оптимизировать кусок кода

Anwap написал:

`cfrom`<=`cto`

шо это?

Неактивен

#3 2010.03.30 23:31

Anwap
Участник
Зарегистрирован: 2009.09.19
Сообщений: 26
Карма: 0
Профиль

Re: Оптимизировать кусок кода

cfrom-это сколько переходов совершил юзер по площадкам, cto-это сколько переходов по его площадкам

Неактивен

#4 2010.03.31 00:16

Gemorroj
Administrator
Откуда: Белоруссия
Зарегистрирован: 2007.11.03
Сообщений: 6594
Карма: 107
Профиль Веб-сайт

Re: Оптимизировать кусок кода

Код:

1
span style="color: #0000BB"><?php// сделать поля activ и moder типом ENUM// ну и нужно расставить индексы,// на основе этого кода можно сказать только что нужен однозначно индекс не поле who таблицы clicks// Это тут ни к чему, сбрасывает кэши// mysql_query('OPTIMIZE TABLE `' . prefix . 'url`');// mysql_query('OPTIMIZE TABLE `' . prefix . 'users`');mysql_query('UPDATE `' . prefix . 'url`SET `activ`="1"WHERE `activ` = "0"AND `moder` = "0"AND `id_user` IN (SELECT `id` FROM `' . prefix . 'users` WHERE `cfrom` <= `cto`)');mysql_query('UPDATE `' . prefix . 'url`SET `activ` = "0"WHERE `activ` = "1"AND `moder` = "0"AND `id_user` IN (SELECT `id` FROM `' . prefix . 'users` WHERE `cfrom` > `cto`)');$l = mysql_result(mysql_query('SELECT COUNT(1)FROM `' . prefix . 'url`WHERE `id_user` <> ' . intval($_USER['id']) . 'AND `activ` = "0"AND `moder` = "0"'), 0);// на поле who поставить индекс, если не стоит$r = mysql_result(mysql_query('SELECT COUNT(1)FROM `' . prefix . 'clicks`WHERE `who` = "' . mysql_real_escape_string($_USER['login']) . '"'), 0);$pll = $l - $r;$pll++;echo 'Показано: <strong>' . $_USER['numlink'] . '</strong> ссылок из <strong>' . $pll . '</strong> доступных | <a href="/?mode=go&amp;' . mt_rand(0,9999) . '">Обновить</a><div class="lines"></div>';$col = mysql_result(mysql_query('SELECT COUNT(1)FROM `' . prefix . 'url`WHERE `id_user` = ' . intval($_USER['id'])), 0);if (!$col) { echo 'Для того чтобы переходить по ссылкам, Вам нужно создать хоть одну плошадку!'; break;}// в этом запросе может быть огромная проблема при большом кол-ве записей// ORDER BY RAND() - это крамольный пездец$re = mysql_query('SELECT u.login, l.id, l.nazvFROM `' . prefix . 'users` as `u`,`' . prefix . 'url` as `l`WHERE u.cfrom > u.ctoAND l.id_user = u.idAND l.activ = "0"AND l.moder = "0"AND l.id_user <> ' . intval($_USER['id']) . 'AND l.id NOT IN (SELECT `to` FROM `' . prefix . 'clicks` WHERE `who` = "' . $_USER['login'] . '")ORDER BY RAND() LIMIT 1, ' . intval($_USER['numlink']));while ($ress = mysql_fetch_array($re)) { echo '<div class="url">&raquo; <a href="/?mode=gook&amp;to=' . htmlspecialchars($ress['login']) . '&amp;id=' . $ress['id'] . '">' . htmlspecialchars($ress['nazv'], ENT_NOQUOTES) . '</a></div>';}if (!$pll) { echo 'Нет доступных ссылок! Зайдите позже...';}

Неактивен

#5 2010.03.31 01:01

Anwap
Участник
Зарегистрирован: 2009.09.19
Сообщений: 26
Карма: 0
Профиль

Re: Оптимизировать кусок кода

а сколько записей считается много в том запросе где коментарий написан?
Очень благодарен за код!При том коде что раньше был время генерации было минимальное 11 секунд,при около 300 ссылок,когда поставил твой код время генерации стало около 0.0391

Неактивен

#6 2010.03.31 09:19

Gemorroj
Administrator
Откуда: Белоруссия
Зарегистрирован: 2007.11.03
Сообщений: 6594
Карма: 107
Профиль Веб-сайт

Re: Оптимизировать кусок кода

нужно тестить, думаю, проблемы начнутся с тысяч 50 -100. дело в том, что при ORDER BY RAND СУБД физически выбирает ВСЕ записи в таблие, помещает их во ременную таблицу и из нее уже выбирает случайные.

Неактивен

#7 2010.04.24 21:05

Anwap
Участник
Зарегистрирован: 2009.09.19
Сообщений: 26
Карма: 0
Профиль

Re: Оптимизировать кусок кода

А вот взгляни как можно этот код переписать?

Код:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$sql = mysql_query("SELECT `id`,`login` FROM `ma_anket` order by `id` desc;");
while ($r = mysql_fetch_array($sql))
{
$res = mysql_num_rows(mysql_query("SELECT `login` FROM `ma_anket` WHERE `pa`='".$r['id']."' AND `pa`<>'1'"));
if ($res>0)
$arr[$r['login']] = $res;
}
arsort($arr);
$i=1;
foreach($arr as $key=>$value)
{
echo $i.') '.$key.' ['.$value.' чел.] <br/>';
 
$i++;
}

Неактивен

#8 2010.04.24 21:39

Gemorroj
Administrator
Откуда: Белоруссия
Зарегистрирован: 2007.11.03
Сообщений: 6594
Карма: 107
Профиль Веб-сайт

Re: Оптимизировать кусок кода

Код:

1
2
3
4
5
6
7
8
9
10
11
$sql = mysql_query('
SELECT t2.`login`, (SELECT COUNT(1) FROM `ma_anket` AS t1 WHERE t1.`pa` = t2.id AND t1.`pa` <> 1) AS `cnt`
FROM `ma_anket` AS t2
GROUP BY t2.login
HAVING `cnt` > 0
ORDER BY t2.`id` DESC
');
$i = 1;
while ($r = mysql_fetch_assoc($sql)) {
echo $i++ . ') ' . $r['login'] . '[' . $r['cnt'] . ']<br/>';
}

если я правильно понял задачу.

Неактивен

#9 2010.04.24 22:34

Anwap
Участник
Зарегистрирован: 2009.09.19
Сообщений: 26
Карма: 0
Профиль

Re: Оптимизировать кусок кода

Спасибо,как раз то что нужно!

Неактивен

Дополнительно

forum.wapinet.ru

PunBB Mod v0.6.2
0.015 s