Оптимизация php и mysql

Рейтинг: 3Ответов: 1Опубликовано: 07.06.2011

И опять вопросы по работе с mysql и php:

1) Есть два запроса:

mysql_query('select * from `table` where `id`='.$id.' and `user_id`='.$_SESSION['id']);
mysql_query('select * from `table` where `id`='.$id.' and `user_id`='.$_SESSION['id'].'limit 0, 1');

Первичный ключ - id. Имеет ли смысл писать limit 0, 1 в конце запроса или это не ускорит запрос?

2) В случае уже полученных данных:

$ar = array();
$res = mysql_query('select * from `table` where `id`<30');
while($ar = mysql_fetch_assoc($res)){}

Что лучше использовать: mysql_num_rows($res) или sizeof($ar) ?

3) Зачем нужен mysql_fetch_array, если есть mysql_fetch_assoc и mysql_fetch_row? По идее, эти две функции по отдельности работают быстрее?

4) При организации, допустим, блогов, разумно ли вынести посты блогов в отдельные файлы, а комментарии оставить в БД? Просто тогда получается, что при выводе последних блогов одновременно будет вестись работа как с БД, так и с файлами, что мне не нравится. Тем более, что анонс все равно придется писать в БД.

5) Определение глобальных переменных в функции - довольно медленная вещь. Можно ли ускорить работу функции, загнав ссылки на нужные переменные в массив и определив в функции глобальным только новый массив? То есть, было:

function f() {
    global $ar1, $ar2, $ar3;
}

Стало:

$all = array('ar1' => &$ar1, 'ar2' => &$ar2, 'ar3' => &$ar3);
function f() {
    global $all;
    $ar1 = $all['ar1'];
}

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

Ответы

▲ 2Принят

1) Имеет смысл сделать так:

mysql_query('select * from `table` where `id`='.$_SESSION['id'].' limit 0,1');

Только исключите в запросах *, тогда будет экономия уже не на спичках :)

2) Согласен с @mozzart

3) mysql_fetch_array работает быстрее, чем assoc, т.к. добавляет только индексы в массив.

4) Согласен с @mozzart

5) Скорее вот так быстрее:

function (&$ar1, &$ar2, &$ar3) {
...
}

Пример:

class Api {

    private $db;

    public function test() { // Этой функции Вы собирались передать get и post

        $this->db; // объект бд

    }

}

или так:

class Api extends DB {

    public function test() {
        $this->query();
    }

}
class DB {

    public function query() {
        ...
    }

}