PHP

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

Сегодня на одном форуме видел один скрипт, который выводит записи из базы. Вроде бы все просто, но он был не оптимизирован!

1.
#PHP
<?php
$format='txt';
$query=mysql_query("SELECT * FROM files WHERE format='".$format."' ORDER BY name DESC");
while($result=mysql_fetch_array($query)){
$cat=mysql_fetch_array(mysql_query('SELECT name FROM categories WHERE id='.$result['cat']));
echo $result['name'].'<br/>
Категория: '.$cat['name'].'<br/>';
}

Это только показательный процесс, но таких запросов в цикле я встречал в большом количестве! Что тут можно оптимизировать? Имя категории файла можно получать в том же запросе, что и информацию о файле:
#PHP
<?php
$format='txt';
$query=mysql_query("SELECT t1.*,t2.name AS catname
FROM files AS t1
LEFT JOIN categories AS t2 ON(t2.id=t1.cat)
WHERE t1.format='".$format."' ORDER BY t1.name DESC");
while($result=mysql_fetch_array($query)){
echo $result['name'].'<br/>
Категория: '.$result['catname'].'<br/>';
}

Теперь прокомментирую этот запрос.
1. SELECT t1.* - вытащить все записи из таблицы помеченной как t1
2. t2.name AS catname - вытаскиваем значение name из таблицы помеченной как t2 и присваиваем новый ключ этому элементу - catname. Именно такой ключ будет использоваться в массиве при выводе
3. FROM files AS t1 - даем нашей таблице псевдоним t1 (удобно при работе с большими именами таблиц)
4. LEFT JOIN categories AS t2 ON(t2.id=t1.cat) - получаем запись из таблицы categories, где id записи равно значению ячейки cat из таблицы t1, и затем даем ей псевдомим t2
5. WHERE t1.format='".$format."' ORDER BY t1.name DESC - условие для выборки из таблицы files и сортировка
__________________
AS - в переводе на русский будет "как", т.е. у нас это будет так: ВЫБРАТЬ все ИЗ ТАБЛИЦЫ под псевдонимом t1, name и обозначить КАК catname из таблицы под псевдонимом t2
ON - условие для выборки из таблицы t2
LEFT JOIN - соединить данные с левой таблицей(с t2)

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

Хотел бы еще уточнить один момент - вывод статистики
<?php
$count=mysql_result(mysql_query('SELECT COUNT(*) FROM files'),0);
echo 'Всего файлов: '.$count.'<br/>';
$size=mysql_result(mysql_query('SELECT SUM(size) FROM files'),0);
echo 'Размер всех файлов: '.$size.'<br/>';
/* и т.д.
Множественные запросы являются причиной большой генерации. Это нужно исправлять. В 1 запросе мы видим, что идет подсчет записей в таблице files, а во втором идет суммирование размеров файлов из той же таблицы. Такое тоже можно хорошо оптимизировать:
*/
$all=mysql_fetch_row(mysql_query('SELECT COUNT(*),SUM(size) FROM files'));
echo 'Всего файлов: '.$all[0].'
Размер всех файлов: '.$all[1].'<br/>';

А вообще подобные вещи нужно кэшировать. Как это делается, расскажу Вам немного позже!
Добавлено: 23 Августа 2013 03:10:24 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...