SQL

Статус
В этой теме нельзя размещать новые ответы.

gimmo

Профессор
Регистрация
4 Апр 2007
Сообщения
228
Реакции
44
Делаю запрос
Код:
$sql="SELECT distinct m.* from media m left join tag2media t2m on t2m.VID = m.VID left join tags t on t2m.TID = t.id where m.media_type = 'video' and active = '+' AND m.type='public' and m.active = '+'and (m.title like '%".doEscape($_REQUEST[search_id])."%' or t.keyword like '%".doEscape($_REQUEST[search_id])."%' or m.description like '%".doEscape($_REQUEST[search_id])."%') $sortby limit $startfrom, $config[items_per_page]";
и всё - ждать секунд 10 .
Сервер - дедик.
Я поперву думал меня роботы угружают - яндех с гуглем круглосуточно пасутся - отключил их - не помогло.
Думаю проблема в запросе - гляньте кто понимает...
Ошибок в логах нет,свап пустой.
Али подскажите куда смотреть.
Может базу чем-то почекать?
Любая помощь приветствуется.
 
Может нужно индексы создать по нужным полям?

Кроме того вот такое: m.active = '+' - бред. Лучше создать INT поля и выставлять 1 или 0.
 
Делаю запрос
Код:
SELECT distinct m.* from media m
left join tag2media t2m on t2m.VID = m.VID
left join tags t on t2m.TID = t.id
where
	m.media_type = 'video' and
	active = '+' AND
	m.type='public' and
	m.active = '+'and
	(m.title like '%".doEscape($_REQUEST[search_id])."%'
		or t.keyword like '%".doEscape($_REQUEST[search_id])."%'
		or m.description like '%".doEscape($_REQUEST[search_id])."%')
$sortby limit $startfrom, $config[items_per_page]

1. сделай индексы на media.VID, tag2media.VID, tag2media.TID
2. может не все поля из media надо?
3. distinct m.*? может из-за этого? если да, то может при добавлении/изменении таблицы можно удалять дубликаты и если нужно, то добавить поле count, которое ++
4. если ничего не поможет, то подумай по поводу кеширования.
 
какая СУБД ? Если mysql то сейчас и впредь поможет EXPLAIN
(это только для select'ов),

explain SELECT distinct m.* from med...

а далее смотри результат колонки rows и key, key не должен быть null, а значение rows как можно меньше, так как это колво сканируемых строк
 
Пошел разбираться - результат отпишу.
 
Надо бы поменять название темы - да не знаю как.
Теперь это должно называться "Связка PHP MySql Smarty".
Это в PHP:
Код:
$sql="select * from media WHERE media_type = 'video' AND UID=$_REQUEST[UID] and type='$_REQUEST[type]' order by VID desc limit $startfrom, $config[items_per_page]";
	$rs=$conn->execute($sql);
	if($rs->recordcount()>0)$vdo = $rs->getrows();
	$start_num=$startfrom+1;
	$end_num=$startfrom+$rs->recordcount();
Это в шаблоне:
Код:
<div class=moduleEntryTags> {$language[4]}: {insert name=media_keyword assign=tags vid=$answers[i].VID} {section name=j loop=$tags}
                                        <a href="{$baseurl}/search_result.php?search_id={$tags[j]}">{$tags[j]}</a> &nbsp; {/section}
                                      </div>
В шаблоне присутствует ещё один внешний цикл . Как я понимаю при вызове тегов оно херит то, что втащило в память (getrows) и делает это снова...и снова...и снова.
Вытер из шаблона этот кусок - стало гораздо веселее...
Вопрос - как поправить код (шаблон?).
Нужен ответ как для идиота - поскольку я в этом не очень.
Предыдущие посты оч. помогли - всё будет включено при окончательной чистке - однако это не решает мою проблему т.е разница видна , но затык не в этом.
 
два left join'а сьедают кучу процессорного времени. По-хорошему от них лучше отказаться, и "склеивать" таблицы из трех запросов на php.
 
два left join'а сьедают кучу процессорного времени. По-хорошему от них лучше отказаться, и "склеивать" таблицы из трех запросов на php.
Ага. А ещё скажи, что от базы данных нужно отказаться. :D

Может лучше индексы добавить? Да и пост по моему был о правке шаблона, а не запроса...
 
Может лучше индексы добавить? Да и пост по моему был о правке шаблона, а не запроса...

Предположительно опытные товарищи подскажут шаблон или код или оба и как. Хотелось бы малой кровью, поскольку проект на ходу и переколбашивать всё не очень удобно.Эта проблема сквозная - т.е. присуща всему скрипту.Я привёл только одно место.
Запрос из первого поста выполнялся прямо на базе с эксплейном и занял 0,0063 сек - на 10-20 сек никак не похоже.
кейзов с нулем нет, а строк - по количеству контента - мыж ишшем.....
На страничку выводится десяток видео - в каждом примерно 3 тега.
Если теги не выводить (вырезать кусок из шаблона) задержка на глаз не заметна.Т.е. всё происходит с приемлимой скоростью.
И вообще с увеличением числа юзверей и контента (независимо от нагрузки в текущий момент) всё как-то отупело и еле ворочается. Я полагаю надо всё делать заново, но блин не успеваю трагически.И так уже половину начисто переколбасил.
У меня такое впечатление, что смарти вызывает нечто некэшированное и от этого все траблы. Как я понимаю индексирование + проч. даст выигрыш в разы, а тут имеется явный заёб.
Потому и изменил постановку вопроса.
Поскольку число тегов неизвестно, смарти не может кешировать это место - оно должно быть описано как-то иначе не понимаю как.
Мы сами не местные - мокументы украли ... поможить братья !!
 
to gimmo, шаблон смарти кэширует нормально (там генерится foreach, который отрабатывает быстро). И проблема здесь покка мне не понятно. Запрос к БД как я понял осуществляется быстро. Я бы замерил общее время отдачи странички. Если оно значительно меньше её отображения в браузере, то проблема скорее всего в отдачи графики. Вы случаем не из БД её отдаёте? Или сложности самой структуры страницы (куча табличной вёрстки).
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху