Anwap » 2010.03.30 20:10

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 'Нет доступных ссылок! Зайдите позже...'; }

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

Gemorroj » 2010.03.30 22:53

Anwap написал:

`cfrom`<=`cto`

шо это?

Anwap » 2010.03.30 23:31

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

Gemorroj » 2010.03.31 00:16

Код:

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 'Нет доступных ссылок! Зайдите позже...';}
Anwap » 2010.03.31 01:01

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

Gemorroj » 2010.03.31 09:19

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

Anwap » 2010.04.24 21:05

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

Код:

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++;
}
Gemorroj » 2010.04.24 21:39

Код:

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/>';
}

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

Anwap » 2010.04.24 22:34

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