Элементарный запрос, быстрей или медленей

12 3
[Удален]
1373

Ребята, собственно нужны знатоки mysql. Может возможно как нить перестроить данный запрос

$inqnl = $db->query("SELECT * FROM ".$basepref."_news WHERE catid = 1 ORDER BY public DESC LIMIT 0,1");

if ($db->numrows($inqnl) > 0) { while ($item=$db->fetchrow($inqnl)) {

......

}
}

так чтобы выполнялся быстрей? таких запросов на странице около 20. Возможно глупый вопрос но в моём случае очень актуальный.

S
На сайте с 17.12.2007
Offline
118
#1
KosoyRoman:
Ребята, собственно нужны знатоки mysql. Может возможно как нить перестроить данный запрос
$inqnl = $db->query("SELECT * FROM ".$basepref."_news WHERE catid = 1 ORDER BY public DESC LIMIT 0,1");

if ($db->numrows($inqnl) > 0) { while ($item=$db->fetchrow($inqnl)) {

......

}
}

так чтобы выполнялся быстрей? таких запросов на странице около 20. Возможно глупый вопрос но в моём случае очень актуальный.

Напишите остальные запросы.

Кэширование не пробовали включать?

[Удален]
#2
Syler:
Напишите остальные запросы.

Кеширование не пробывали включать?

$bt ="<table border=0 cellpadding=0 cellspacing=3 width=100%><tr>";


$inqnl = $db->query("SELECT * FROM ".$basepref."_news WHERE catid = 1 ORDER BY public DESC LIMIT 0,1");
if ($db->numrows($inqnl) > 0) { while ($item=$db->fetchrow($inqnl)) {
$iconnl = ($item['icon']) ? "<img src=\"".$item['icon']."\" border=\"0\" align=\"middle\">" : "";
$titlenl = str_replace('\"','"',$item['title']);
$timenl = $lang['news_data']." ".format_time($item['public'],0);
$textnl = substr(str_replace('\"','"',$item['textshort'].$item['textmore']),0,$previewnl);
$text = strip_tags(notslashes(preparse($textnl,THIS_TRIM)));
$linknl = ($item['textmore']) ? "<a href=\"index.php?dn=news&to=art&id=".$item['newsid']."\"><img src=\"temp/".$conf['site_temp']."/images/icon.gif\" border=\"0\"> ".$lang['news_read']."</a>" : "";

$bt.="<td width=60% align=\"left\" valign=\"top\"><div class=\"zagolo\"><a href=\"index.php?dn=news&amp;to=art&amp;id=".$item['newsid']."".$popularcpu."\" >$titlenl</a></div>";

$bt.="<div><a href=\"index.php?dn=news&amp;to=art&amp;id=".$item['newsid']."".$popularcpu."\"><img class=\"thumb2\" src=\"".$item['image']."\" align=\"left\" border=\"0\" width=\"150\" height=\"120\" alt=\"".$item['title']."\"></a><div style=\"font-size:12px;\">$text...</div></div>
<div class=\"blocktext4\"><a href=\"/news.rss\" title=\"Экспорт новостей в формате RSS 2.0\"><img src=\"/up/rss.png\" alt=\"Экспорт новостей в формате RSS 2.0\" border=\"0\"></a><a href=\"index.php?dn=news&amp;to=art&amp;id=".$item['newsid']."".$popularcpu."\"> ".$lang['news_read']."</a></div></td>
";
}
}

так выглядит весь скрипт. он повторяется порядка 10-15 раз на странице. кеширование используется жесткое, но всё равно идет нагрузка на mysql

S
На сайте с 17.12.2007
Offline
118
#3
KosoyRoman:

так выглядит весь скрипт. он повторяется порядка 10-15 раз на странице. кеширование используется жесткое, но всё равно идет нагрузка на mysql

С точно такиже запросом?

Если да, то в чем проблема, сохраните данные в какой нибудь переменной и выводите 10-15 раз.

А вообще, запрос не такой уж и тяжелый...совсем даже не тяжелый.

DyaDya
На сайте с 11.04.2007
Offline
147
#4

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

А потом уже оставшиеся 9 раз к базе не обращаться, а использовать подготовленный ранее массив!!!

Но есть нюанс, с размером массива, если записей 3 млн., то хрен знает будет ли это хорошо, не тестил на таких ;(.

2. Если записей много, то можно врубить и кеширование и еще одну штуку.

Основная нагрузка идет от ORDER BY

Можно по крону раз в 4 часа например подготавливать отдельную таблицу и вносить в неё данные уже отсортированными!!! Тогда при выборке не нужно будет писать ORDER BY, поверьте, очень поможет.

3. Ну и есть такая фича как SLAVE и MASTER, но это уже другая история...

Оптимизация, дело такое...

==============

кстати может помочь аренда сервака, общий хостинг вообще мало чего выдерживает ;(

Выбирайте качественный хостинг (http://vashmaster.ru/informaciya/o_poleznyh_programmah/news83.php) и продвигайте сайты в СЕОПУЛЬТ (http://seopult.ru/ref.php?ref=72b5ed9561fe66a1). А на «SAPE» я в обиде :) Не упрекайте за очепятки, пишу вслепую (http://ergosolo.ru/) и также делаю сайты (http://www.vashmaster.ru/) ;)
S
На сайте с 17.12.2007
Offline
118
#5

catid у вас первичный ключ? если так, то зачем тут вообще ORDER BY....

[Удален]
#6

Нет catid не первичны. Выборка идет именно по catid, тоесть есть 10-15 категорий и нужно в разных блоках отображать по 5 новостей из разных категорий. Получаеться нужно пожторять код несколько раз с разными catid

ах да и сервер VDS разгон от firstvds

S
На сайте с 17.12.2007
Offline
118
#7

А в 'public' хранится дата публицации? (подозреваю, что выводятся последние новости с каждого раздела)

Вам нужно избавиться от ORDER BY.

Если у вас такая нагрузка только на одну страницу, то попробуйте создать вспомогательную таблицу и в ней хранить только те новости, которые будут отображаться на этой странице.

Не спец по оптимизации, может это бред).

DI
На сайте с 03.01.2007
Offline
123
#8

каким образом выводится 5 новостей, если там LIMIT 0,1?

можно не вызывать запрос 15 раз, а собрать все id категорий в массив, и сделать один запрос:

SELECT * FROM ".$basepref."_news WHERE catid IN (".implode(",",$ArrayWithID).") ORDER BY public DESC LIMIT 0,1

Только LIMIT поменять.

И в дальнейшем работать уже с одним полученным массивом без БД.

Высказывание идиотского утверждения требует на порядок меньше усилий, чем его последовательное и обоснованное опровержение и более того, иногда это опровержение вообще невозможно. © (http://zhurnal.lib.ru/s/shapiro_m_a/raspidiota.shtml)
[Удален]
#9
DenIT:
каким образом выводится 5 новостей, если там LIMIT 0,1?

можно не вызывать запрос 15 раз, а собрать все id категорий в массив, и сделать один запрос:
SELECT * FROM ".$basepref."_news WHERE catid IN (".implode(",",$ArrayWithID).") ORDER BY public DESC LIMIT 0,1

Только LIMIT поменять.

И в дальнейшем работать уже с одним полученным массивом без БД.

Извените, а не могли бы вы поподробней? пример можно пожалуйста.

DI
На сайте с 03.01.2007
Offline
123
#10
KosoyRoman:
Извените, а не могли бы вы поподробней? пример можно пожалуйста.

Так я вроде и привел пример. Что именно непонятно?

12 3

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