Как включить кеширование запросов

elven

Новичок
Как включить кеширование запросов

У меня на странице выполняется куча запросов. Часть я попытлся оптимизировать. Но все равно долго. Обновляется информация раз в сутки.

Почитав в интернете, что есть несколько вариантов кеширования.

1) Запись результатов в файл (кеш) и проверка по времени.

2) средствами самого mysql. Кажется query_cache_startup_type

Не можете ли помочь настроить кеш? В одном месте написано, что это должно быть выставлено в в у становках mysql, в другом, что можно выставлять и через php. А как правильн оего написать, внутри php - кода?
 

alpes

Весь мир на ладони
выставлять настройки кеша mysql нужно в его конфигурационном файле, скриптами php это не делается.

по оптимизации: если информация меняется раз в сутки то выполни один раз всю кучу запросов во время модификации, создав из них статический html код, который потом и показывай пользователям.
 

zerkms

TDD infected
Команда форума
алгоритм поиска информации:

1. dev.mysql.com/doc/refman/4.1/en/
2. слева в поле ввода поиска вводим 'cache'
3. жмём 'ok'
4. кликаем на первый результат
5. читаем
6. кликаем на меню слева и читаем остальные разделы по теме
 

alpes

Весь мир на ладони
да, еще хотел добавить: долго - эт чет не нормально. самое первое: индексы расставлены?
 

elven

Новичок
Автор оригинала: alpes
да, еще хотел добавить: долго - эт чет не нормально. самое первое: индексы расставлены?
Нет, индекс только на id

вот кусочек кода:

PHP:
$sql="SELECT A.clan, count(*) as cnt, I.level 
 FROM analiz as A
 JOIN clans_all as I ON ( I.name = A.clan)
 WHERE A.date='".$ddate."' and I.level>=3
 group by A.clan
 ORDER BY cnt desc
 LIMIT 0, 12";
$topic_=mysql_query($sql);
while($topic=mysql_fetch_array($topic_)){
   ++$i;
$clan_name[$i]=$topic['clan'];
$clan2=$topic['clan'];
$col_summ[$i]=$topic['cnt'];
$sql9="select * from analiz where clan='".$clan2."'  and date='".$ddate."' order by  level desc, id";
$topic_9=mysql_query($sql9);
while($topic9=mysql_fetch_array($topic_9)){
   $name=$topic9['name'];
   $level=$topic9['level'];
if ($level>=40)   {$listclan[$i].="<tr><td valign='top' width=100><font color='#FF9933'>$tt<strong>$name</strong>$tt1</font></td><td width=100  align=center>$prof</td><td width=20>$level</td></tr>";    }
if ($level==39)   {$listclan[$i].="<tr><td valign='top' width=100><font color='#FFBB66'>$tt<strong>$name</strong>$tt1</font></td><td width=100  align=center>$prof</td><td width=20>$level</td></tr>";   }
if ($level<=38)   {$listclan[$i].="<tr><td valign='top' width=100><font color='#CC9966'>$tt<strong>$name</strong>$tt1</font></td><td width=100  align=center>$prof</td><td width=20>$level</td></tr>";  }
}

}
Можно ли как нибудь оптимизировать это?

В результате появляется массив:
$clan_name
$listclan
$col_summ
 

zerkms

TDD infected
Команда форума
elven
что общего приведённый код имеет с mysql и оптимизацией запросов?
 

elven

Новичок
To zerkms:

Данный код - реакция на вопрос alpes. Каюсь, отошел от темы поста.

Просто у меня из за этого кусочка кода страница загружается долго. Поэ тому и возник вопрос об использовании кеширования.

Так как я получил ответ, что кеширование включается толкьо на серверной части (где мне нет доступа к астройкам сервака), то буду думать над тем вариантом, который предложил alpes (вариант с статичным html), тем более если данный кусочек кода нельзя оптимизировать.
 

alpes

Весь мир на ладони
да, оптимизировать есть как раз что.
1). ты уже сам сказа - нет индексов. Обязательно почитай доку по "Использование индексов в MySQL". Индексируй как правило то что идет в WHERE, по чем связываются таблицы, группировки и сортировки. Не забывай об EXPLAIN. Проиндексируй и сразу заметишь разницу.
2). не понятно зачем сново выбирать по таблице `analiz`, хотя тут сложно судить не понимая твоей задачи и структуры данных.
3). старайся не использовать запросы внутри циклов, а получи ключи а потом делай одним запросом чтот на подобии
PHP:
"...WHERE id IN (".join(',',$ArrKey).")"
 

elven

Новичок
alpes, большое спасибо.
1) Про индексы почитаю. Т. е правильно я понял, что нужно проиндексировать все поля, по которым ведется любой поиск?
2) В базе у меня примерно 6000 записей добавляется каждый день. Это имена персонажей, их уровень принадлежность к клану т.д. Первый запрос у меня направлен на то чтобы сделать выборку отдельно по кланам, отортированной по количеству людей в Кланах, во внутреннем запросе я исходя из названия клана, составляю уже список членов по кланам.
3) А как это сделать? Я еще не очень хорошо разбираюсь в запросах. И то что в первом запросе я объединил 2 базы есть большое достижение для меня, недавно я и это не умел.

Если бы помогли объединить 2 запроса в один я был бы очень признателен.
 

Andreika

"PHP for nubies" reader
elven
1. не чегото там сделать на всех полях, а вдумчиво и со смыслом )
2. в итоге то что должно получиться? выводится список членов всех кланов, кланы отсортированы по количеству? и де такое надо?
3. объединил ты не базы, а таблицы
 

elven

Новичок
Ну это просто для личных нужд собирается ежедневно статистика с офиц. игрового сервера. Там много полезной информации можно получить оперируя с этой базой. Да я неправильно написал, я объединил 2 таблицы :) а не базы
 

Andreika

"PHP for nubies" reader
хм.. да мало ли что и где можно получить.. вопрос - что тебе в итоге надо получить и что и как в какой таблице хранится?
 

elven

Новичок
Таблица analiz
id int(10)
name text
level int(10)
clan text
race text
pk int(1)
date date
event text
lvl int(1)
migr int(1)
pkstat int(1)

Необходимо вывести в одном запросе
список членов Клана (name) упорядоченный по уровню в обратном порядке (level desc) согласно списку кланов (clan), в свою очередь упорядоченной по уровню клана (таблица clans_all: поля name[=clan в таблице analiz], level desc)
 
Сверху