Оптимизиция SQL запроса

12
edogs software
На сайте с 15.12.2005
Offline
775
#11

Судя по коду это phpnuke или slaed, так что код для них достаточно стандартный.

Вот это


$result = $db->sql_query("SELECT COUNT(*) FROM {$prefix}_files");
@$num_files = mysql_result($result,0,0);

$result = $db->sql_query("SELECT COUNT(*) FROM {$prefix}_news");
@$num_news = mysql_result($result,0,0);

заменяем на это


$result=$db->sql_query("SHOW TABLE STATUS WHERE name IN ('{$prefix}_news','{$prefix}_news') ");$tt=array();
$t=mysql_fetch_assoc($result);$tt[$t['Name']]=$t['Rows'];
$t=mysql_fetch_assoc($result);$tt[$t['Name']]=$t['Rows'];
$num_files=$tt["{$prefix}_files"];$num_news=$tt["{$prefix}_news"];

и это


$result = $db->sql_query("SELECT hits FROM {$prefix}_files");

while (list($hits) = $db->sql_fetchrow($result)){
$hitsum = $hitsum + $hits;
}

на это


$result = $db->sql_query("SELECT sum(hits) FROM {$prefix}_files");
list($hitsum)=mysql_fetch_row($result);
Troyan:
переменные strip1 и strip2 лишние их можно сделать просто strip?

А вот это как раз на нагрузку считайте вообще не влияет. Забейте.

P.S.: А самое умное в этой ситуации - сделать кэширование блоков. А раскэшировать их допустим раз в час и по любому POST запросу.

Разработка крупных и средних проектов. Можно с криптой. Разумные цены. Хорошее качество. Адекватный подход. Продаем lenovo legion в спб, дешевле магазинов, новые, запечатанные. Есть разные. skype: edogssoft
T
На сайте с 22.02.2008
Offline
141
#12

bearman, хорошо жду, но номер аськи если можно в pm, просмотрел множество отзывов положительных о вас

edogs, спасибо испробую, хотелось бы узнать и про $strip1 и $strip2 можно ли их объядинить для улучшения кода?

M
На сайте с 26.02.2009
Offline
36
#13
bearman:
вот этот блок кода у меня в голове вообще не укладывается ... это чо интересно ... я понимаю что хотели, но ТАК это делать - минимум дибилизм

Даже если написать


$hitsum = mysql_result($db->sql_query("SELECT SUM(hits) FROM {$prefix}_files"),0);

все равно тормозить будет. надо структуру таблиц менять

работы тут наверное больше чем на день, если нужно оптимизацией заниматься

T
На сайте с 22.02.2008
Offline
141
#14

macaronnik, да мне не обязательно мега оптимизировать, можно чтобы код был как бы сказать валиднее более легче и создавал меньше запросов, по школе я знаю что

FROM {$prefix}_files WHERE status='1' OR status='3' ORDER BY hits DESC LIMIT 10"

будет из всей таблицы файлов искать макс колво скачиваний вроде, просто сделать попроще, вот

[Удален]
#15

<?php

if (!defined('BLOCK_FILE')){
Header("Location: ../index.php");
die();
}
global $db,$prefix,$config,$block_cache;

$block_cache = 1;
$strip_files = 40;
$strip_news = 40;
$a = $b = 1;

$result = $db->sql_query("SELECT fid, title, hits FROM {$prefix}_files WHERE status='1' OR status='3' ORDER BY hits DESC LIMIT 10");
$files = array();
while(list($id, $title,) = $db->sql_fetchrow($result))
{
$title = htmlspecialchars($title);
$titleshort = strlen($title) > $strip_files ? (substr($title, 0, $strip_files)."...") : $title;
$files[] = "<b>$a </b><a href='index.php?module=Files&do=View&id=$id' title='$title'>$titleshort</a>";
$a++;
}
$files = join("<br/>",$files);

$result = $db->sql_query("SELECT nid, title, view FROM {$prefix}_news WHERE status='1' OR status='3' ORDER BY view DESC LIMIT 10");
$news = array();
while(list($id, $title,) = $db->sql_fetchrow($result))
{
$title = htmlspecialchars($title);
$titleshort = strlen($title) > $strip_news ? (substr($title, 0, $strip_news)."...") : $title;

$news[] = "<b>$b. </b><a href='index.php?module=News&do=View&id=$id' title='$title'>$titleshort</a>";
$b++;
}
$news = join("<br/>",$news);

$files_count = mysql_result($db->sql_query("SELECT COUNT(*) FROM {$prefix}_files"),0,0);
$news_count = mysql_result($db->sql_query("SELECT COUNT(*) FROM {$prefix}_news"),0,0);

$all_count = $files_count + $news_count;

$hitssum = mysql_result($db->sql_query("SELECT SUM(hits) FROM {$prefix}_files"),0,0);

$content = "<table width='100%' cellspacing='1' cellpadding='3'>
<tr>
<th width='50%' class='borderright1'>"._POPNEWS."</th>
<th>"._POPFILES."</th>
</tr>
<tr>
<td width='50%' class='borderright1' valign='top'>$news</td>
<td valign='top'>$files</td>
</tr>
<tr>
<TD width='50%' class='borderright1' valign='top'>
<b>Всего файлов и новостей: $all_count</b></td>
<td valign='top'><b>Всего скачано: $hitssum</b></td>
</tr>
</table>";
?>

такое чтото + надо бы сделать индекс (если его нет) на таблицах news, files по полям hits, views.

T
На сайте с 22.02.2008
Offline
141
#16

По поводу кеширования оно есть, и работает, просто когда заходишь в phpmyadmin у хосетра и оптимизируешь таблицу то кэш как бы пропадает, или я сам очищаю случайно, пока сделать чтобы сама cms раз в час очищала кэш я не умею

Troyan добавил 25.06.2009 в 19:30

bearman, спасибо огромное, сейчас попробую, буду надеяться что быстрее будет, а что за индекс не подскажете?

[Удален]
#17
Troyan:
По поводу кеширования оно есть, и работает, просто когда заходишь в phpmyadmin у хосетра и оптимизируешь таблицу то кэш как бы пропадает, или я сам очищаю случайно, пока сделать чтобы сама cms раз в час очищала кэш я не умею

Troyan добавил 25.06.2009 в 19:30
bearman, спасибо огромное, сейчас попробую, буду надеяться что быстрее будет, а что за индекс не подскажете?

если файлов много, то не помешает индекс по двум полям в таблице files. поля - hits, status.

в таблице news = также двойной индекс по полям status, views. это значительно ускорит выборку топ-10(в десятки возможно сотни и тысячи раз)

T
На сайте с 22.02.2008
Offline
141
#18

bearman, спасибо запрос теперь занимает всего:

4.0E-6 [SELECT COUNT(*) FROM {$prefix}_files]

4.0E-5 [SELECT COUNT(*) FROM {$prefix}_news]

5.0E-5 [SELECT SUM(hits) FROM {$prefix}_files]

в замен 0.06 и выше

Да файлов действительно пока не много, скоро 1000 будет, но база быстро забивается соотвественно мы стараемся обновляться и файлы быстро увеличиваются, то есть индекс полей это что то вроде оглавления в книге? будет сразу видеть куда идти в замен перебора всей таблицы да? а реальзация тяжёлая?

[Удален]
#19
Troyan:
bearman, спасибо запрос теперь занимает всего:

4.0E-6 [SELECT COUNT(*) FROM {$prefix}_files]
4.0E-5 [SELECT COUNT(*) FROM {$prefix}_news]
5.0E-5 [SELECT SUM(hits) FROM {$prefix}_files]

в замен 0.06 и выше

Да файлов действительно пока не много, скоро 1000 будет, но база быстро забивается соотвественно мы стараемся обновляться и файлы быстро увеличиваются, то есть индекс полей это что то вроде оглавления в книге? будет сразу видеть куда идти в замен перебора всей таблицы да? а реальзация тяжёлая?

ути пути бирмен жжет))

если индексы добавить(если не были добавлены) будет еще меньше(хотя куда там ..).

bearman добавил 25.06.2009 в 19:44

файлы быстро увеличиваются, то есть индекс полей это что то вроде оглавления в книге? будет сразу видеть куда идти в замен перебора всей таблицы да? а реальзация тяжёлая?

да это своего рода оглавление в книге, перебор таблиц отпадает и результаты как из ячеек достаются, если рпавильно использовать индексы :)

реализация - в смысле вы сами решили повторить идею индексов где то... или в мускуле реализация, да тяжелая, очень тяжелая =)) а для вас просто сказать что надо сделать индекс по полю - разве это сложно? :) в пхп майадмине можно это сделать

T
На сайте с 22.02.2008
Offline
141
#20

ладно до этого я думаю далеко ещё, спасибо вам большое за помощь

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий