This Might Be Useful

Двигаем при выводе строчки в таблице друг относительно друга

August 14th, 2008 | автор: Filosoff | PHP, SQL | No Comments »

Часто встречается ситуация, когда необходимо вручную устанавливать порядок вывода записей в некоем списке. То есть клиент должен иметь возможность двигать строчки вверх-вниз друг относительно друга. Некоторые "программисты" изобретают для этого сложнейшие велосипеды. На самом же деле сделать это очень просто. Просто создаем дополнительное поле `customorder`, которое по умолчанию равно `id` (в случае, усли `id` не auto_increment, можно его ставить в (MAX(`customorder`) + 1)). Затем используем вот такую простую функцию:

PHP:
  1. function move_line($id, $up) {
  2.   $rez = mysql_query('SELECT `customorder`
  3.       FROM `thetable`
  4.       WHERE `id` = '.intval($id));
  5.   list($o) = mysql_fetch_row($rez);
  6.   $rez = mysql_query('SELECT `id`, `customorder`
  7.       FROM `thetable`
  8.       WHERE `customorder` '.($up ? '<' : '>').' '.$o.'
  9.       ORDER BY `customorder` DESC
  10.       LIMIT 1');
  11.   if (mysql_num_rows($rez) > 0) {
  12.     list($nid, $no) = mysql_fetch_row($rez);
  13.     mysql_query('UPDATE `content`
  14.       SET `customorder` = '.$no.'
  15.       WHERE `id` = '.$rid);
  16.     mysql_query('UPDATE `content`
  17.       SET `customorder` = '.$o.'
  18.       WHERE `id` = '.$nid);
  19.   }
  20. } // move_line

И да, я знаю, что это можно сделать меньшим количеством запросов. Но так нагляднее :).

Как заставить JOIN в MySQL нормально использовать индексы и максимально ускорить выполнение запросов

July 30th, 2008 | автор: Filosoff | SQL | 8 Comments »

Несколько раз натыкался на эту проблему, но только сегодня полноценно ее решил. Проблема проста: есть запрос с несколькими JOIN'ами. При выполнении запроса толком не используются индексы. В результате все ужасно тормозит.
Запрос примерно такой:

SQL:
  1. SELECT `a`.*, `b`.*
  2. FROM `a` LEFT JOIN `b` ON `a`.`field1` = `b`.`field2`
  3. WHERE `b`.`field3` = "something"
  4. ORDER BY `a`.`field4`

Понятно, что все может быть сложнее, но для примера сойдет.
Итак, что же надо сделать, чтобы запрос работал максимально быстро (при условии, что запрос и таблицы построены грамотно)?

  1. Создать индекс по каждому из полей, используемых в WHERE и JOIN. Отдельно по каждому.
  2. Убедиться, что в WHERE указано максимально жесткое условие дабы сократить диапазон выборки.
  3. А теперь - внимание! Убедиться, что у `a`.`field1` и `b`.`field2` одинаковый collation!

Комментарий по последнему пункту: В моем случае у одного поля был latin1_swedish_ci, у второго - utf8_general_ci. Вроде как по данным выходило правильно. Но запрос работал очень медленно, порядка 3 секунд (использовались три таблицы с большим количеством записей - ~100,000, ~30,000 и ~3,000). После применения пункта номер один и особенно пункта номер три запрос стал выполняться за 0.1 (одну десятую!) секунды.

Способы красивого завязывания шнурков

July 4th, 2008 | автор: Filosoff | Life and stuff | No Comments »

Для разнообразия - совершенно не ITшная заметка. Случайно увидел эти картинки и решил поделиться.
Развлечение для владельцев ботинок :).

Способо завязывания шнурков #1 Способо завязывания шнурков #2 Способо завязывания шнурков #3 Способо завязывания шнурков #4 Способо завязывания шнурков #5 Способо завязывания шнурков #7 Способо завязывания шнурков #6

Остальные способы можно найти тут (несколько десятков вариантов, однако).

Простое создание DVD-рипов в Linux

July 3rd, 2008 | автор: Filosoff | Linux, Software | No Comments »

В качестве продолжения описания темы конвертирования видео привожу простой способ создания DVD-рипов в Linux.

Данная комманда берет первый раздел с DVD и конвертирует его в flv:

mencoder dvd://1 -ofps 25 -o a.flv -of lavf -oac mp3lame -lameopts abr:br=256 -srate 44100 -ovc lavc -lavcopts vcodec=flv:keyint=50:vbitrate=900:mbd=2:mv0:trell:v4mv:cbp:last_pred=3 -vf pp=lb,scale=512:384,harddup

Если нужно выдернуть определенную главу, можно добавить параметр -chapter.
В случае, если содержимое DVD скопировано на жесткий диск, нужно указать путь к файлам: -dvd-device /path/to/the_folder/

mencoder dvd://1 -chapter 1 -dvd-device /path/to/the_folder/ -ofps 25 -o a.flv -of lavf -oac mp3lame -lameopts abr:br=256 -srate 44100 -ovc lavc -lavcopts vcodec=flv:keyint=50:vbitrate=900:mbd=2:mv0:trell:v4mv:cbp:last_pred=3 -vf pp=lb,scale=512:384,harddup

На предмет того, что какой параметр значит и какие они бывают, советую почитать man по mencoder.

Выходной формат, понятное дело, может быть не только flv :).

Уменьшаем нагрузку на сервер - кэширование данных для ускорения генерации страницы

July 2nd, 2008 | автор: Filosoff | PHP | 2 Comments »

Представьте себе проект, в котором достаточно сложная структура базы данных. Да и собственно данных много. И для генерации страницы постоянно необходимо примерно одним и тем же образом вытягивать и обрабатывать массу информации. В моем случае это дело занимало до 25 секунд на весьма неслабой машине. Для оптимизации процесса было принято решение кэшировать данные. Само собой, это снимает только часть проблем. Но ведь кэш можно еще и генерировать автоматически, верно? :).
В общем, ниже я приведу небольшой класс, сделанный за несколько минут. Кэширует массив, в котором хранится основной dataset. По умолчанию считается, что данного REQUEST_URI dataset постоянен. Но есть параметры для изменения такого поведения.
Read the rest of this entry »

Страница: 2 (всего: 24)«12345»...Последняя »