<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Персональный блог Валерия Леонтьева &#187; PostgreSQL</title>
	<atom:link href="http://valera.ws/tag/postgresql/feed/" rel="self" type="application/rss+xml" />
	<link>http://valera.ws</link>
	<description>Блог для публикации интересных личных заметок о работе, жизни, событиях... Digital lifestyle, веб-программирование, администрирование серверов и другое</description>
	<lastBuildDate>Sat, 31 Dec 2011 11:52:10 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Установка Redmine на Debian с СУБД Postgres. Работа по HTTPS.</title>
		<link>http://valera.ws/2009.04.24~redmine-debian-postgres-https/</link>
		<comments>http://valera.ws/2009.04.24~redmine-debian-postgres-https/#comments</comments>
		<pubDate>Fri, 24 Apr 2009 09:20:51 +0000</pubDate>
		<dc:creator>Валера Леонтьев</dc:creator>
				<category><![CDATA[IT]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[Debian]]></category>
		<category><![CDATA[PostgreSQL]]></category>

		<guid isPermaLink="false">http://valera.ws/?p=307</guid>
		<description><![CDATA[Стала задача установить хорошую современную систему управления задачами и багтрекинга. Выбор пал на Redmine. Фактически, Remine — это улучшенный Trac. Написан Redmine на Ruby. Основное отличие от Trac по функционалу — работа с несколькими разными проектами в связке. Кроме того, &#8230; <a href="http://valera.ws/2009.04.24~redmine-debian-postgres-https/">Читать далее <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Стала задача установить хорошую современную систему управления задачами и багтрекинга. Выбор пал на <a href="http://www.redmine.org/">Redmine</a>. Фактически, Remine — это улучшенный <a href="http://trac.edgewall.org/">Trac</a>. Написан Redmine на Ruby. Основное отличие от Trac по функционалу — работа с несколькими разными проектами в связке. Кроме того, у Redmine намного шире функционал, и сделан он добротней.</p>
<p>Как обычно, для установки некоего нового программного обеспечения в Линуксе сразу идем в Гугл и ищем подходящие HOWTO. По Редмайну я нашел несколько разных HOWTO, из которых каждый понемногу мне помог (см. ссылки внизу).<br />
<span id="more-307"></span></p>
<h2>Установка</h2>
<p><strong>Сначала ставим нужные пакеты.</strong></p>
<p><em># </em><em>apt-</em><em>get </em><em>install </em><em>ruby </em><em>rake </em><em>ruby1.8-</em><em>dev </em><em>rubygems </em><em>libmysql-</em><em>ruby </em><em>librmagick-</em><em>ruby </em><em>ruby-</em><em>pkg-</em><em>tools </em><em>build-</em><em>essential </em><em><a href="http://valera.ws/tag/postgresql/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  PostgreSQL">postgresql</a> </em><em>libdbd-</em><em>pg-</em><em>perl </em><em>libapache-</em><em>dbi-</em><em>perl </em><em>libapache2-</em><em>mod-</em><em>perl2 </em><em>libdigest-</em><em>sha1-</em><em>perl </em><em>postgresql-</em><em>common </em><em>postgresql-</em><em>contrib-8.3 </em><em>libpgsql-</em><em>ruby1.8 </em><em>libpgsql-</em><em>ruby </em><em>postgresql-</em><em>server-</em><em>dev-8.3 </em><em>libopenssl-</em><em>ruby</em></p>
<p>Вроде ничего не упустил :)</p>
<p><strong>Далее</strong><strong> устанавливаем</strong><strong> ruby gems.</strong></p>
<p><em># gem install rails mongrel mongrel_cluster </em></p>
<p><strong>Добавляем путь к </strong><strong>gems в переменную </strong><strong>PATH</strong>. Для этого редактируем файл <em>/</em><em>etc/</em><em>profile</em>. Добавляем путь в конец  переменной (два раза в файле, перед путем двоеточие). У меня получилось так:</p>
<p><em># head -n 8 /etc/profile<br />
# /etc/profile: system-wide .profile file for the Bourne shell (sh(1))<br />
# and Bourne compatible shells (bash(1), ksh(1), ash(1), &#8230;).if [ "`id -u`" -eq 0 ]; then<br />
PATH=&raquo;/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/var/lib/gems/1.8/bin&raquo;<br />
else<br />
PATH=&raquo;/usr/local/bin:/usr/bin:/bin:/usr/games:/var/lib/gems/1.8/bin&raquo;<br />
fi</p>
<p></em></p>
<p><strong>Подготавливаем базу</strong></p>
<p>Я решил использовать Postgres. С <a href="http://valera.ws/tag/mysql/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  MySQL">MySQL</a> у меня была как минимум одна проблема: с кодировкой. Неправильно работали длины полей для русских текстов в UTF-8.</p>
<p>Из-под рута:</p>
<p><em># su postgres</em></p>
<p><em>#createuser redmine &#8211;no-superuser &#8211;no-createdb &#8211;no-createrole &#8211;login &#8211;pwprompt –encrypted</em></p>
<p><em>#createdb &#8211;owner=redmine &#8211;encoding=utf-8 redmine</em></p>
<p><em>#</em><em>exit</em></p>
<p>Пароль для пользователя введен redmine.</p>
<p><strong>Скачиваем </strong><strong>Redmine</strong></p>
<p>На момент написания записи самый свежий стабильный релиз был 0.8.</p>
<p><em># mkdir /var/www/rails_apps</em></p>
<p><em># cd /var/www/rails_apps</em></p>
<p><em># svn co http://redmine.rubyforge.org/svn/branches/0.8-stable redmine-0.8</em></p>
<p>Все команды далее выполняются из каталога  <em>/</em><em>var/</em><em>www/</em><em>rails_</em><em>apps/</em><em>redmine-0.8</em>.</p>
<p><em># </em><em>cd /</em><em>var/</em><em>www/</em><em>rails_</em><em>apps/</em><em>redmine-0.8</em></p>
<p><strong>Конфигурируем доступ к базе</strong></p>
<p>Создаем файл config/database.yml со следующим содержимым:</p>
<p><em>production:<br />
adapter: postgresql<br />
database: redmine<br />
host: localhost<br />
username: redmine<br />
password: redmine</em></p>
<p><strong>Конфигурируем</strong><strong> SMTP</strong></p>
<p><em># cp config/email.yml.example config/email.yml</em></p>
<p><em># vim config/email.yml</em></p>
<p>Внесите изменения в соответствии с настройками вашего SMTP-сервера.</p>
<p><strong>Заполняем базу данных</strong></p>
<p><em># rake db:migrate RAILS_ENV=&raquo;production&raquo;</em></p>
<p><em># rake redmine:load_default_data RAILS_ENV=&raquo;production&raquo;</em></p>
<p><strong>Проверим, что все поставилось хорошо:</strong></p>
<p><em># mongrel_rails start &#8211;environment=production</em></p>
<p>Redmine должен работать по адресу <a href="http://localhost:3000/">http://localhost:3000</a>. Для авторизации используйте логин и пароль admin. Не забудьте его позже своевременно изменить.</p>
<p><strong>Настройка</strong><strong> Redmine на</strong><strong> работу</strong><strong> через</strong><strong> apache and mongrel_cluster по</strong><strong> HTTPS</strong></p>
<p>Создайте файл <em>config/</em><em>mongrel_</em><em>cluster.</em><em>yml</em> следующего содержания:</p>
<p><em>group: www-data<br />
log_file: log/mongrel.log<br />
port: &laquo;9000&#8243;<br />
cwd: /var/www/rails_apps/redmine-0.8<br />
environment: production<br />
user: www-data<br />
pid_file: log/mongrel.pid<br />
servers: 2</em></p>
<p>Проверьте, что все ОК:</p>
<p><em># mongrel_rails cluster::start</em></p>
<p>Теперь вы должны получить доступ к Redmine на портах 9000 и 9001.</p>
<p>Для того, чтобы кластер поднимался после ребута, выполняем:</p>
<p><em># mkdir /etc/mongrel_cluster</em></p>
<p><em># ln -s /var/www/rails_apps/redmine-0.8/config/mongrel_cluster.yml /etc/mongrel_cluster/redmine.yml</em></p>
<p><em># cp /var/lib/ruby/gems/1.8/gems/mongrel_cluster-1.0.5/resources/mongrel_cluster /etc/init.d</em></p>
<p><em># chmod +x /etc/init.d/mongrel_cluster</em></p>
<p><em># /usr/sbin/update-rc.d -f mongrel_cluster defaults</em></p>
<p><strong>Настраиваем </strong><strong>apache2</strong></p>
<p><em># a2enmod proxy</em></p>
<p><em># a2enmod proxy_http</em></p>
<p><em># a2enmod proxy_balancer</em></p>
<p><em># a2enmod rewrite</em></p>
<p><em># a2enmod headers</em></p>
<p>Создайте файл <em>/</em><em>etc/</em><em>apache2/</em><em>sites-</em><em>available/</em><em>redmine</em> со следующим содержимым:</p>
<p>NameVirtualHost *:443<br />
&lt;VirtualHost *:443&gt;<br />
ServerAdmin xxx@xxx.xx<br />
ServerName redmine # <strong>Измените</strong> <strong>имя сервера, чтобы виртуальный хост подхватился</strong>!<br />
DocumentRoot /var/www/rails_apps/redmine-0.8/public/<br />
RequestHeader set X_FORWARDED_PROTO &#8216;https&#8217;</p>
<p>&lt;Directory /var/www/rails_apps/redmine-0.8/public/&gt;<br />
Options FollowSymLinks<br />
AllowOverride None<br />
Order allow,deny<br />
Allow from all<br />
&lt;/Directory&gt;</p>
<p>SSLEngine on<br />
SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA;+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL<br />
SSLCertificateFile /var/www/conf/mobicon.crt<br />
SSLCertificateKeyFile /var/www/conf/mobicon.key<br />
&lt;Location /&gt;<br />
AuthType Basic<br />
AuthName &laquo;Mobicon-Media&raquo;<br />
AuthBasicProvider ldap<br />
<strong> </strong>AuthLDAPUrl ldap://localhost/ou=people,dc=mobicon-media,dc=com?cn<br />
Require ldap-group cn=mobicon,ou=groups,dc=mobicon-media,dc=com<br />
SSLRequireSSL<br />
&lt;/Location&gt;</p>
<p>ProxyPass /images !<br />
ProxyPass /stylesheets !<br />
ProxyPass /javascripts !<br />
ProxyPass /favicon.ico !<br />
ProxyPass /static !<br />
ProxyPass /holding !<br />
ProxyPass /templates !<br />
ProxyPass / balancer://redmine_cluster<br />
ProxyPreserveHost On</p>
<p>&lt;Proxy balancer://redmine_cluster&gt;<br />
BalancerMember <a href="http://127.0.0.1:9000/">http://127.0.0.1:9000</a><br />
BalancerMember <a href="http://127.0.0.1:9001/">http://127.0.0.1:9001</a><br />
Order allow,deny<br />
Allow from all<br />
&lt;/Proxy&gt;</p>
<p>RewriteEngine On<br />
RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-f<br />
RewriteRule ^/(.*)$ balancer://redmine2_cluster%{REQUEST_URI} [P,QSA,L]</p>
<p>ErrorLog /var/log/apache2/redmine.error.log<br />
LogLevel warn<br />
CustomLog /var/log/apache2/redmine.access.log combined<br />
ServerSignature On<br />
AddDefaultCharset Off<br />
&lt;/VirtualHost&gt;</p>
<p>Затем выполните:</p>
<p><em># ln -s /etc/apache2/sites-available/redmine /etc/apache2/sites-enabled/redmine</em></p>
<p><em># /</em><em>etc/</em><em>init.</em><em>d/</em><em>apache2 </em><em>restart</em></p>
<p><strong>Все настроено и готово к использованию!</strong></p>
<h2>Ссылки</h2>
<p><a href="http://blog.josefsson.org/2008/10/17/redmine-on-debian-lenny-using-lighttpd/">http://blog.josefsson.org/2008/10/17/redmine-on-debian-lenny-using-lighttpd/</a></p>
<p><a href="http://www.drinkingbird.net/blog/articles/2008/02/27/setting-up-a-redmine-site-on-ubuntu">http://www.drinkingbird.net/blog/articles/2008/02/27/setting-up-a-redmine-site-on-ubuntu</a></p>
<p><a href="http://www.redmine.org/wiki/redmine/RedmineInstall">http://www.redmine.org/wiki/redmine/RedmineInstall</a></p>
<p><a href="http://ubuntuforums.org/showthread.php?t=674598&amp;highlight=redmine">http://ubuntuforums.org/showthread.php?t=674598&amp;highlight=redmine</a></p>
<p><a href="http://www.drinkingbird.net/blog/articles/tag/redmine">http://www.drinkingbird.net/blog/articles/tag/redmine</a></p>
]]></content:encoded>
			<wfw:commentRss>http://valera.ws/2009.04.24~redmine-debian-postgres-https/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Замена SQL_CALC_FOUND_ROWS или подсчет количества записей в PostgreSQL</title>
		<link>http://valera.ws/2008.07.24~calc-found-rows-in-postgresql/</link>
		<comments>http://valera.ws/2008.07.24~calc-found-rows-in-postgresql/#comments</comments>
		<pubDate>Thu, 24 Jul 2008 07:59:04 +0000</pubDate>
		<dc:creator>Валера Леонтьев</dc:creator>
				<category><![CDATA[IT]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[Все рубрики]]></category>
		<category><![CDATA[PostgreSQL]]></category>
		<category><![CDATA[SQL]]></category>

		<guid isPermaLink="false">http://valera.ws/?p=83</guid>
		<description><![CDATA[На работе в новом проекте используется СУБД PostgreSQL. Так как до сих пор я работал с MySQL, сейчас приходится изучать и открывать для себя постгри. Первая проблема, которая меня заинтересовала — замена мускулевского SQL_CALC_FOUND_ROWS. Сходу готового решения найти не удалось. &#8230; <a href="http://valera.ws/2008.07.24~calc-found-rows-in-postgresql/">Читать далее <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft" style="margin: 0 5px 5px 0;" title="PostgreSQL" src="http://valera.ws/images/mysql_postgre.png" alt="" width="107" height="108" />На работе в новом проекте используется СУБД <a href="http://valera.ws/tag/postgresql/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  PostgreSQL">PostgreSQL</a>. Так как до сих пор я работал с <a href="http://valera.ws/tag/mysql/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  MySQL">MySQL</a>, сейчас приходится изучать и открывать для себя постгри. Первая проблема, которая меня заинтересовала — замена мускулевского <a href="http://valera.ws/2007.08.29~sql_calc_found_rows/">SQL_CALC_FOUND_ROWS</a>. Сходу готового решения найти не удалось. На форумах постоянно констатировали, что <a href="http://valera.ws/tag/sql/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  SQL">SQL</a>_CALC_FOUND_ROWS в постгри нет. Некоторые писали, что надо юзать count(*). Но еще из MySQL мне известно, что поиск с count()-запросом работает почти в 2 раза медленнее, чем с <a href="http://valera.ws/tag/sql/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  SQL">SQL</a>_CALC_FOUND_ROWS. Я консультировался у тех, кто пользуется PostgreSQL, день мучал google и в результате получил 4 варианта замены <a href="http://valera.ws/tag/sql/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  SQL">SQL</a>_CALC_FOUND_ROWS в PostgreSQL, один из которых вполне приемлимый по скорости. <span id="more-83"></span> Итак, сразу представлю те четыре варианта, о которых пойдет речь. Наш целевой запрос ищет в таблице записи, в которых встречается текст adf в поле `text`. Выбираем id 20 записей начиная от 180.000 по порядку и количество найденных всего. <strong>Вариант 1</strong>. Взят из phpPgAdmin. Я просто заглянул в код этого клиента для PostgreSQL и посмотрел как подсчет сделан у них при просмотре данных таблицы. Используется 2 запроса с подзапросами. Удобство в том, что не надо парсить и менять исходный запрос, чтобы подсчитать количество записей, найденных им.</p>
<pre><span style="color: #808000;">select count(id) from (select id from testing where text like '%adf%') as sub;
select * from (select id from testing where text like '%adf%') as sub limit 20 offset 180000</span></pre>
<p><strong>Вариант 2</strong>. Самый простой вариант, который обычно юзают новички как в MySQL, так и в Postgres и других СУБД. 2 запроса.</p>
<pre><span style="color: #808000;">select count(id) from testing where text like '%adf%';
select id from testing where text like '%adf%' limit 20 offset 180000</span></pre>
<p><strong>Вариант 3</strong>. © <a href="http://max-posedon.livejournal.com/" target="_blank">max_posedon</a>. Это попытка эмуляции мускулевского SQL_CALC_FOUND_ROWS в Postgres по логике. Правда работает только при сортировке по id (в данном случае). Здесь подставляется id последней записи в выборке, т.е. записи под номером 180.000 + 20.</p>
<pre><span style="color: #808000;">select * from testing where text like '%adf%' limit 20 offset 180000;
select count(id) from testing where text like '%adf%' and id &gt; 132629;</span></pre>
<p><strong>Вариант 4</strong>. По советам пользователей irc.freenode.org, опять же <a href="http://max-posedon.livejournal.com/" target="_blank">max_posedon</a>&#8216;а, и <a href="http://archives.postgresql.org/pgsql-general/2004-05/msg00668.php" target="_blank">этого ответа</a> на форуме PostgreSQL, который прятался глубоко в гугле. Используется курсор.</p>
<pre><span style="color: #808000;">DECLARE curs CURSOR FOR select id from testing where text like '%adf%';
MOVE FORWARD 180000 IN curs;
FETCH 20 FROM curs;
MOVE FORWARD ALL IN curs;</span></pre>
<p>+ фунция PQcmdTuples() API Postgres (или $count = pg_cmdtuples($result); в <a href="http://valera.ws/tag/php/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  PHP">PHP</a>). <strong>Обратите внимание,</strong> что все 4 варианта запросов следует выполнять в одной транзакции, тогда они работают быстрее. 4й вариант вовсе не будет работать, если не использовать одну транзакцию: теряется курсор. <strong>Теперь о скоростях</strong>. Я провел тестирование скорости работы этих четырех вариантов. Вобщем-то тесты подтвердили ожидания. Но отмечу важный факт. Все запросы запускались на конфигурации PostgreSQL по умолчанию, которая не является оптимизированной на производительность. У меня под рукой просто не было оптимизированного сервера. Так что цифры могут немного корректироваться при запуске с &laquo;хорошим&raquo; конфигом. Однако суть не изменится.  Тестовые запуски проводились в PHP по 20 повторов 2 раза на каждый вариант. Доступен <a href="http://valera.ws/files/pg.php.zip">php-скрипт</a>, который запускал тесты. Кому интересно, есть <a href="http://valera.ws/files/pg.xls.zip">полная статистика выборок</a> в Excel™. Здесь опубликую лишь сводную таблицу:</p>
<table style="text-align: justify;" border="1" cellspacing="0" cellpadding="5" width="393">
<tbody>
<tr>
<td></td>
<td>Вар 1</td>
<td>Вар 2</td>
<td>Вар 3</td>
<td>Вар 4</td>
</tr>
<tr>
<td>Ср. время (мс)</td>
<td>647,41</td>
<td>648,25</td>
<td>450,64</td>
<td>370,67</td>
</tr>
<tr>
<td>Отношение к вар 4</td>
<td>1,75</td>
<td>1,75</td>
<td>1,22</td>
<td>—</td>
</tr>
</tbody>
</table>
<p>Для сравнения время запросов без использования транзакции:</p>
<ul>
<li>Вар 1: 1204 мс,</li>
<li>Вар 2: 689 мс,</li>
<li>Вар 3: 560 мс,</li>
<li>Вар 4 работает только в пределах транзакции.</li>
</ul>
<p><strong>Итоги</strong>. Самый быстрый вариант 4 с использованием курсора. Его скорость обусловлена тем, что &laquo;тяжелый&raquo; поисковый запрос выполняется только один раз. Далее проводятся операции с курсором. Аналогично работает и SQL_CALC_FOUND_ROWS в MySQL. На 20% от него отстает вариант 3 — попытка эмуляции SQL_CALC_FOUND_ROWS в PostgreSQL. Варианты 1 и 2 работат примерно с одинаковой скоростью и на 75% (более чем на 2/3!) уступают по скорости запросу с курсором.</p>
]]></content:encoded>
			<wfw:commentRss>http://valera.ws/2008.07.24~calc-found-rows-in-postgresql/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Камень в огород полнотекстового поиска в PostgreSQL</title>
		<link>http://valera.ws/2008.06.30~fts_postgresql/</link>
		<comments>http://valera.ws/2008.06.30~fts_postgresql/#comments</comments>
		<pubDate>Mon, 30 Jun 2008 08:30:34 +0000</pubDate>
		<dc:creator>Валера Леонтьев</dc:creator>
				<category><![CDATA[IT]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[Все рубрики]]></category>
		<category><![CDATA[PostgreSQL]]></category>

		<guid isPermaLink="false">http://valera.ws/2008.06.30~fts_postgresql/</guid>
		<description><![CDATA[На днях на работе решали вопрос о том, какой инструмент использовать для полнотекстового поиска информации. Рассматривалось много вариантов, среди которых был встроенный с версии 8.3 поиск в PostrgeSQL. К сожалению, одной маленькой мелочи не хватило в нем, чтобы мы могли &#8230; <a href="http://valera.ws/2008.06.30~fts_postgresql/">Читать далее <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><img src="http://valera.ws/images/mysql_postgre.png" alt="PostgreSQL" hspace="5" vspace="5" width="107" height="108" align="left" />На днях на работе решали вопрос о том, какой инструмент использовать для полнотекстового поиска информации. Рассматривалось много вариантов, среди которых был встроенный с версии 8.3 поиск в PostrgeSQL. К сожалению, одной маленькой мелочи не хватило в нем, чтобы мы могли его использовать. Очень горькая ложка дегтя в большой бочке меда.</p>
<p><span id="more-52"></span></p>
<p>Для начала отмечу, что полнотекстовый поиск в <a href="http://valera.ws/tag/postgresql/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  PostgreSQL">PostgreSQL</a> довольно мощный, по возможностям превосходящий поиск в <a href="http://valera.ws/tag/mysql/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  MySQL">MySQL</a>. Многие программисты переводили проекты на постгри только из-за этого поиска.</p>
<p>Маленькая ложка дегтя заключается в том, что нет в полнотекстовом поиске в Postgres поиска по фразам. Мы прошуршали весь <a href="http://www.postgresql.org/docs/current/static/textsearch.html" target="_blank">мануал по поиску</a>, <a href="http://www.postgresql.org/docs/current/static/textsearch-controls.html" target="_blank">ну нету</a> синтаксиса для запроса поиска по фразе. Я зашел на #postgres@irc.freenode.org. И там совета не дали. <a href="http://forum.dklab.ru/sql/common/TsearchVPostgresKakIskatQuotPoTseloyFrazeQuot.html" target="_blank">Спросил</a> на известном форуме. Эффект ноль. Только <a href="http://max-posedon.livejournal.com/" target="_blank">один человек</a> посоветовал пути обхода этого момента, но они такие геморройные, что не считаю нужным их тут описывать.</p>
<p>Похоже, что эту опцию они собираются внедрить только в будущих версиях поискового движка. <a href="http://www.sai.msu.su/~megera/wiki/todo" target="_blank">http://www.sai.msu.su/~megera/wiki/todo</a> «todo: &#8230;phrase search through new operator or adding word ordering in tsquery…»</p>
<p>В общем, нет в PostgreSQL 8.3 полнотекстового поиска по фразам.</p>
]]></content:encoded>
			<wfw:commentRss>http://valera.ws/2008.06.30~fts_postgresql/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Поиск в MySQL. Часть 3 «FULLTEXT IN BOOLEAN MODE»</title>
		<link>http://valera.ws/2008.04.15~fulltext-in-mysql/</link>
		<comments>http://valera.ws/2008.04.15~fulltext-in-mysql/#comments</comments>
		<pubDate>Tue, 15 Apr 2008 14:53:10 +0000</pubDate>
		<dc:creator>Валера Леонтьев</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[Все рубрики]]></category>
		<category><![CDATA[FULLTEXT]]></category>
		<category><![CDATA[PostgreSQL]]></category>
		<category><![CDATA[морфология]]></category>

		<guid isPermaLink="false">http://valera.ws/2008.04.15~fulltext-in-mysql/</guid>
		<description><![CDATA[Поиск в MySQL. Часть 3 «FULLTEXT IN BOOLEAN MODE» В первой части рассказа о поиске в MySQL рассказывается про использование полнотекстного индекса FULLTEXT. При поиске неких ключевых слов в большом массиве текста, хранящегося в БД, без использования индекса не обойтись. Однако родные возможности полнотекстового поиска в СУБД MySQL не &#8230; <a href="http://valera.ws/2008.04.15~fulltext-in-mysql/">Читать далее <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><img style="width: 107px; height: 108px" title="Поиск с учетом русской морфологии" src="http://valera.ws/images/php_mysql.png" border="0" alt="Поиск с учетом русской морфологии" hspace="3" vspace="3" width="107" height="108" align="left" /></p>
<p><strong>Поиск в <a href="http://valera.ws/tag/mysql/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  MySQL">MySQL</a>. Часть 3 «<a href="http://valera.ws/tag/fulltext/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  FULLTEXT">FULLTEXT</a> IN BOOLEAN MODE»</strong></p>
<p>В первой части рассказа о поиске в MySQL <a href="http://valera.ws/2007.08.29~fulltext_search_in_mysql/">рассказывается</a> про использование полнотекстного индекса FULLTEXT. При поиске неких ключевых слов в большом массиве текста, хранящегося в БД, без использования индекса не обойтись. Однако родные возможности полнотекстового поиска в СУБД MySQL не обеспечиват функционал для поиска с учетом русской морфологии. Решение этой проблемы <a href="http://valera.ws/2007.09.05~morpho_search_in_mysql/">описывалось во второй части</a> «Поиск с учетом русской морфологии». И вот недавно в описанном алгоритме обнаружился  большой недостаток. Что это за недостаток и как с ним бороться и описано в этой статье.</p>
<p><span id="more-48"></span>Для начала хочу заметить один нюанс. Не так давно вышел релиз СУБД <a href="http://www.postgresql.org/" target="_blank">PostgreSQL 8.3</a>. И одной из важнейших его особенностей стало то, что полнотекстный поиск, причем еще и с поддержкой русской морфологии, включен в ядро СУБД. Теперь не надо использовать различные плагины и примочки, чтобы пользоваться <a href="http://www.sai.msu.su/~megera/postgres/talks/fts_pgsql_intro.html" target="_blank">возможностями полнотекстного о поиска</a>. А возможности эти на порядок мощнее и щире возможностей fulltext-поиска в MySQL. По-этому, если поиск информации в базе для вашего проекта является одной из центральных &laquo;фишек&raquo;, стоит смотреть в сторону Postgres.</p>
<p>Если же у вас нет выбора СУБД, или требования к поиску невысокие, можно пользоваться и <a href="http://valera.ws/2007.09.05~morpho_search_in_mysql/">моим решением</a> на базе MySQL. Только необходимо учесть поправки для поискового запроса, описанные ниже.</p>
<p><strong>По делу.</strong> При использовании конструкции MATCH &#8230; AGAINST СУБД ищет указанные в запросе ключевые слова в индексе, если подходящий найден, или в указанном поле данных. Поиск может проходить в трех разных режимах: в натуральном (обычном) и <a href="http://dev.mysql.com/doc/refman/5.0/en/fulltext-boolean.html">логическом</a> (boolean mode). Общее между этими режимами то, что в обоих случаях фраза поиска, переданная в AGAINST будет разделена на слова. И при поиске будут находиться записи, в которых встречается хотя бы одно из указанных слов.</p>
<p>Например, при указании фразы &laquo;трудовой договор&raquo; будут найдены все строки, в которых встречается слово &laquo;трудовой&raquo; и все строки со словом &laquo;договор&raquo;. На практике такой подход оказывается неприемлемым, так как выдает слишком много лишних результатов. Особенно ярко выражается проблема, когда одно слово очень популярное и находится в огромном количестве строк. В этом случае уточняющее слово практически не имеет смысла. И релевантность тут не спасет. Популярное слово может встретиться в строке 50 раз. В этом случае строка получит релевантность значительно выше, чем строка в которой оба слова встретились по одному разу.</p>
<p>В результате поиск по такому принципу в большом массиве информации становится неюзабельным. Обойти проблему можно с помощью второго режима поиска — поиска в логическом режиме. Его преимущество в том, что с помощью некоторых специальных операторов можно управлять значимостью и ролью слов в запросе, а также искать по фразам.</p>
<p>Для включения логического режима используется синтаксис: MATCH (&#8230;) AGAINST (&#8216;&#8230;&#8217; IN BOOLEAN MODE);</p>
<p>Оператор пишется в кавычках  непосредственно перед ключевым словом, к которому он относится. Операторы, которые воспринимает  анализатор запроса:</p>
<ul>
<li>- (дефис, символизирующий &laquo;минус&raquo;). Этот оператор указывает, что данное ключевое слово не должно содержаться в поле (NOT);</li>
<li>+ указывает, что слово должно обязательно содержаться  в запросе (AND);</li>
<li>&gt; и &lt; соответственно увеличивают и уменьшают вес слова при подсчете релевантности;</li>
<li>( и ) группируют слова для применения к ним оператора</li>
<li>~ имеет смысл, схожий с &laquo;минусом&raquo;, но оно слово не исключает, а просто уменьшает релевантность строки, в которой слово встретилось;</li>
<li>* — оператор усечения, ставится в конце слова и имеет классический смысл (например, слов*);</li>
<li>&raquo; (кавычка). В кавычки  берутся фразы, по которым требуется искать целиком.</li>
</ul>
<p>Следует обратить внимание так же на то, что результаты в случае использования логического режима автоматически не сортируются по релевантности.</p>
<p>Чтобы обеспечить точный поиск и релевантность вывода, передадим в запрос ключевые слова в обработанном виде. Первой частью пустим в кавычках  фразу, составленную  из слов, которые ввел пользователь (естественно, предварительно  отфильтровав спец-символы). Установим перед ней оператор повышения релевантности &raquo;&gt;&raquo;. Далее через пробел открываем скобки. В них нужно указать слова, полученные от морфологического движка. Перед скобками ставим оператор уменьшения релевантности. Слова пишутся через пробел, а перед каждым словом ставится оператор &laquo;+&raquo;.</p>
<p>Для наглядности приведем пример. При поиске по фразе &raquo;отпуск за работу&raquo; запрос будет выглядеть так: &#8230; MATCH (&#8230;) AGAINST (&#8216;&gt;&raquo;отпуск за работу&raquo; &lt;(+отпуск +работу)&#8217; IN BOOLEAN MODE) &#8230;</p>
<p>Кроме этого, из-за логического режима поиска необходимо вручную указать порядок вывода (сортировку) найденных строк. Для этого добавляем в выборку еще один столбец, который определяется так выражением MATCH &#8230; AGAINST с псевдонимом. Причем оно должно быть идентично выражению в блоке WHERE. Тогда СУБД будет выполнять поиск только один раз. Ну а в конец запроса нужно дописать, что сортировка идет по полю (через псевдоним) в порядке убывания.</p>
<p>Итак, теперь пример полного результирующего запроса. Поиск по фразе &raquo;отпуск за работу&raquo; в таблице table в полях text и text_index, по которым был предварительно создан полнотекстный индекс:</p>
<p>SELECT <a href="http://valera.ws/tag/sql/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  SQL">SQL</a>_CALC_FOUND_ROWS *,<br />
MATCH (text,text_index) AGAINST (&#8216;&gt;&raquo;отпуск за работу&raquo; &lt;(+отпуск +работа)&#8217; IN BOOLEAN MODE)  AS rel<br />
FROM table<br />
WHERE MATCH (text,text_index) AGAINST (&#8216;&gt;&raquo;отпуск за работу&raquo; &lt;(+отпуск +работа)&#8217; IN BOOLEAN MODE)<br />
ORDER BY rel DESC LIMIT 0, 10</p>
<p>Результаты такого поиска получается вполне неплохими и очень даже приемлемыми.</p>
]]></content:encoded>
			<wfw:commentRss>http://valera.ws/2008.04.15~fulltext-in-mysql/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
		<item>
		<title>Обо всем по-немногу</title>
		<link>http://valera.ws/2008.04.10~prosto/</link>
		<comments>http://valera.ws/2008.04.10~prosto/#comments</comments>
		<pubDate>Thu, 10 Apr 2008 18:33:43 +0000</pubDate>
		<dc:creator>Валера Леонтьев</dc:creator>
				<category><![CDATA[Все рубрики]]></category>
		<category><![CDATA[Жизнь]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[PostgreSQL]]></category>
		<category><![CDATA[велосипед]]></category>

		<guid isPermaLink="false">http://valera.ws/2008.04.10~prosto/</guid>
		<description><![CDATA[Эта запись будет не посвящена ничему конкретному. Просто набор интересностей, которые я повстречал за последние дни. Итак, начнем с конца. Только что прочитал интересную запись в дневнике Лебедева, посвященную курению. Сегодня пришел к окончательному выводу, что Java гавно. Почему? Все &#8230; <a href="http://valera.ws/2008.04.10~prosto/">Читать далее <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Эта запись будет не посвящена ничему конкретному. Просто набор интересностей, которые я повстречал за последние дни.</p>
<p><span id="more-46"></span>Итак, начнем с конца. Только что прочитал <a href="http://tema.livejournal.com/80070.html" target="_blank">интересную запись</a> в дневнике Лебедева, посвященную курению.</p>
<p>Сегодня пришел к окончательному выводу, что <a href="http://java.net/" target="_blank">Java</a> гавно. Почему?  Все просто — она неюзабельна. Великий тормоз <a href="http://www.netbeans.org/" target="_blank">NetBeans</a>, который к тому же обладает бесплатным набором багов в своем гуи. В теории у явы очень интересные и правильные подходы ко всему, но как выясняется на практике, они сложны, запутаны и не так интересны, как в теории. Человек, привыкший к MS Visual Studio и ms-way, будет чувствовать за явой себя неудобно. С C# картина абсолютно другая. Все хорошо, приятно и привычно. К тому же по яве очень мало помощи, что на сайтах в сети, то же и в <a href="http://irc.by/" target="_blank">irc</a>. Сейчас пишу на яве курсач, договорился использовать его на работе. Сейчас уже жалею, что связался с ней. Ведь придется потом этот гавнокод сопровождать и развивать :(</p>
<p><a href="http://mysql.com" target="_blank">MySQL</a> хорошая СУБД.  Но в ней гавняный полнотекстный поиск. Он не поддерживает русскую морфологию. Сегодня обнаружил, что <a href="http://valera.ws/2007.09.05~morpho_search_in_mysql/" target="_blank">мое решение</a> не очень-то нормально работает. В результатах такого поиска очень много лишних результатов из-за того, что ищется по правилу &laquo;или&raquo;, а не &laquo;и&raquo; между словами :( Пришел к выводу, <a href="http://valera.ws/2007.09.04~postgresql-vs-mysql/" target="_blank">подтвержденному Котеровым</a>: &laquo;Собственно, на MойКруге <a href="http://www.postgresql.org/" target="_blank">PostgreSQL</a> во многом как раз из-за того, что в нем есть отличный полнотекстовый поиск, который и не снился <a href="http://valera.ws/tag/mysql/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  MySQL">MySQL</a>. (А в 8.3 он будет еще лучше.)&raquo;. 8.3 уже вышла, буду ее осваивать.</p>
<p>Посидел неделю на <a href="http://habrahabr.ru/" target="_blank">Хабре</a>. Сделал вывод, что половину тамошних обитателей невменяемы  :( Портал опопсел (как в свое время и баш), там конечно попадаются хорошие и интересные, и полезные статьи, но половина — чушь, половина комментов — чушь, и минусуют все (карму, статьи, комменты) только по принципу &laquo;согласен/не согласен&raquo; и &laquo;модно/не модно&raquo;. А жаль.</p>
<p>На <a href="http://valera.ws/2008.03.29~velo-start/" target="_blank">велосипеде</a> придется менять переднюю вилку :( Она кривоватая, плохо держит колесо. Огорчило.</p>
]]></content:encoded>
			<wfw:commentRss>http://valera.ws/2008.04.10~prosto/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>MySQL vs PostgreSQL</title>
		<link>http://valera.ws/2007.09.04~postgresql-vs-mysql/</link>
		<comments>http://valera.ws/2007.09.04~postgresql-vs-mysql/#comments</comments>
		<pubDate>Tue, 04 Sep 2007 14:28:41 +0000</pubDate>
		<dc:creator>Валера Леонтьев</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[PostgreSQL]]></category>

		<guid isPermaLink="false">http://valera.ws/2007.09.04~postgresql-vs-mysql/</guid>
		<description><![CDATA[Неделю назад я инициировал обсуждение на одном сайтике на тему миграции с MySQL на PostgreSQL. В процессе обсуждения плавно сменили тему на сравнение этих двух популярных СУБД. В результате мне показалось, что почитать это обсуждение будет интересно и полезно многим &#8230; <a href="http://valera.ws/2007.09.04~postgresql-vs-mysql/">Читать далее <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><img style="width: 107px; height: 108px;" title="MySQL vs PostgreSQL" src="http://valera.ws/images/mysql_postgre.png" border="0" alt="MySQL vs PostgreSQL" hspace="3" vspace="3" width="107" height="108" align="left" />Неделю назад я инициировал обсуждение на  одном сайтике на тему миграции с <a href="http://valera.ws/tag/mysql/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  MySQL">MySQL</a> на <a href="http://valera.ws/tag/postgresql/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  PostgreSQL">PostgreSQL</a>. В процессе обсуждения плавно  сменили тему на сравнение этих двух популярных СУБД. В результате мне  показалось, что почитать это обсуждение будет интересно и полезно многим  программистам. В обсуждении участвовал известный программист <a href="http://valera.ws/tag/php/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  PHP">PHP</a>, автор двух книг по <a href="http://valera.ws/tag/php/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  PHP">PHP</a>, разработчик сервиса moikrug.ru <a title="Дмитрий Котеров" href="http://dmitry.moikrug.ru/" target="_blank">Дмитрий Котеров</a>.</p>
<p><span id="more-13"></span></p>
<p>Вот обсуждение, немного обработанное с вырезанными лишними  постами.</p>
<p><strong>from MySQL to PostgreSQL</strong></p>
<p><strong>Валерий Леонтьев</strong>,  программист PHP/MySQL</p>
<p>Вопрос тем,  кто уже прошел такой путь: на сколько сложен переход для программиста, на  сколько велики отличия, сколько % запросов обычно надо переписать для сайта на  MySQL. Все рассматривается в контексте программирвоания на PHP.</p>
<p><strong>Илья Бутыльский</strong>, web-developer</p>
<p>Не сильно  сложно. Взвесьте все &laquo;за&raquo; и &laquo;против&raquo;. Может и не стоит  переходить.</p>
<p><strong>Валерий Леонтьев</strong>, программист PHP/MySQL</p>
<p>Уже взвесил. Скорость постгри при нагрузке в разы выше, чем у MySQL. При  этом, предел отказоустойчивости тоже выше. Т.е. переводить мелкие проекты  смысла нет, а вот крупные стоило бы.</p>
<p><strong>Михаил Талисов</strong>, Магистрант, <a href="http://valera.ws/tag/java/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  Java">Java</a> EE developer</p>
<p>У меня тоже возникала год назад необходимость переводить приложение с MySQL  на PostgreSQL. Особых трудностей не возникло.</p>
<p>Но все же некоторые вещи пересмотреть пришлось: в PostgreSQL нет  автоинкрементных полей (для автоматического инкремента ПК используется  специальный тип SERIAL). И для хранения значения счетчика используются  специальные конструкции &#8211; sequence. Для получения текущего значения счетчика  используется нечто вроде:</p>
<p>&laquo;select currval(&#8216;task_id_seq&#8217;)&raquo;</p>
<p>Вроде больше особых отличий нету, остальное &#8211; детали.</p>
<p><strong>Дмитрий Кадыков</strong>, web-программист  Интернет-гипермаркета 003.ru</p>
<p>Мне приходилось делать обратную  операцию: перевести часть кода с Postgre на MySQL. Пришлось заменить  TO_CHAR(date,&#8217;MM.YYYY&#8217;) на DATE_FORMAT(date, &#8216;%m.%Y\&#8217;), и в принципе всё.</p>
<p><strong>Валерий Леонтьев</strong>, программист PHP/MySQL</p>
<p>Re: Дмитрий Кадыков</p>
<p>А по какой причине так пришлось сделать, если не секрет?</p>
<p><strong>Антон  Полумисков</strong>, PHP  программист</p>
<p>А на каком MySQL проект находится  сейчас? У постгри приемуществ конечно хватает, но может проще будет перейти на  MySQL5, если проект конечно не под 5 работает )), он и быстрее чем  предшественники и возможностей стало больше. Но и самое главное &#8211; возникнет  значительно меньше проблем с переходом.</p>
<p><strong>Валерий Леонтьев</strong>, программист PHP/MySQL</p>
<p>Re: Антон Полумисков</p>
<p>Понимаешь, тут дело такое: если бы не 5 версия MySQL, то я бы уже давно перешел  на ту же PostgreSQL или что-то другое. Версии до 5 &#8211; это полупустые СУБД. Там  кроме тормозючести еще и половины фишек нет, которые в других СУБД давно есть и  являются стандартом.</p>
<p><strong>Евгений  Ненаглядов</strong>, Вэб-разработчик</p>
<p>А мне из мускула не хватает REPLACE.  В постгресе сие реализуется только триггером на INSERT, а я еще не освоил  программирование процедур.</p>
<p>Переводил довольно крупный проект. Нудно, но не критично.</p>
<p>Из-за особенностей работы с автоинкреметными полями, реализовал замену функции  mysql_insert_id().</p>
<p><strong>Дмитрий Котеров</strong>, МойКруг.ру: сооснователь, рук.  разработки</p>
<p>Скорость постгри при нагрузке в разы  выше, чем у MySQL</p>
<p>Мой опыт показывает, что это  совершенно неверное заявление. Все в точности да наоборот. Вы какой тип таблиц  используете? Если MyISAM, то все понятно &#8211; они под нагрузкой плохо живут, если  операции записи производятся сравнительно часто. Попробуйте InnoDB, они  работают примерно так же, как таблицы в PostgreSQL (версионник с блокировкой  строк). И попробуйте еще настройки MySQL потюнить &#8211; от них многое зависит.</p>
<p>Для крупных высоконагруженных проектов важное значение имеет репликация. В MySQL  она встроенная и, главное, работает отлично &#8211; практически нет запаздывания при  обновлении реплики. Для PostgreSQL есть Slony, однако у него: (а) раз в 10  бОльший &laquo;барьер на вход&raquo; (т.е. если с репликацией MySQL Вы в  продакшене освоитесь, скажем, за неделю, то в Slony &#8211; за 10 недель), и (б)  конструктивно значительный лаг при обновлении реплик, а значит, Вам придется  строить приложение с учетом этого лага, что не так-то просто (встроенных  средств в Slony для отслеживания этого лага [пока] нет).</p>
<p>Кроме того, если Вы рассчитываете с переходом на PostgreSQL обеспечить лучшую  сохранность данных, то для обеспечения высокой производительности <em>совместно</em> с высокой надежностью нужно обязательно использовать аппаратный дисковый  контроллер со встроенной кэш-памятью записи значительного размера и батарейкой  (а такие контроллеры недешевы). Без аппаратного решения Вы &laquo;упретесь&raquo;  в операцию fsync, которая, собственно, и обеспечивает сохранность данных, и  которая несовместима с интенсивным обновлением данных без аппаратного решения.</p>
<p>Так что, если у Вас проект прекрасно работает на MySQL, возможностей MySQL ему <em>хватает</em>,  то я бы категорически не рекомендовал переходить на PostgreSQL. PostgreSQL  нужен для действительно сложных проектов, когда возможностей MySQL (даже 5-й  версии) не хватает, когда приходится применять нереляционный подход, &#8211;  например, для МойКруг. По крайней мере, в стратегическом (долгосрочном) плане  повышения быстродействия при переходе с MySQL на PostgreSQL Вы точно не  добьетесь.</p>
<p><strong>Валерий Леонтьев</strong>, программист PHP/MySQL</p>
<p>Re: Дмитрий Котеров</p>
<p>Спасибо за столь подробный ответ. Мое &laquo;заявление&raquo; на самом деле  основывалось не на личном опыте (как понятно из темы &#8211; я с постгри не работал),  а не статьях других программистов. Последняя статья на эту тему, которую я  прочитал была опубликована в журнале &laquo;Системный администратор&raquo;  кажется за август (я не обратил внимания на номер). И как раз там у них по  результатам опытов разница получилась в разы.</p>
<p>В MySQL медленнее работают сложные запросы: с джойнами и подзапросами. На этой  почве у меня даже развилась некая фобия таких запросов. А если эх будет много в  скрипте, да плюс нагрузка пиковая большая, то MySQL может и в ступор впасть.  Один раз я такой ступор уже наблюдал. Правда там причина была в том, что проект  был написан неграмотно (не мной) и не стояли индексы. Когда я открыл show  processes, я там наблюдал кучу сложных висящих запросов. И загрузка ЦП деманом  мускуля 99%. Так как времени на оптимизацию не было, да и двиг этот скоро уйдет  в корзину, я не менял запросы, но просто сделал для них &laquo;правильные  индексы&raquo;, проблема частично решилась. Таких ступоров больше не было. И вот  сложилось по статьям у меня впечатление, что с постгри такого не будет, а если  и будет, то при много большей нагрузке. Тип таблиц в данном скрипте  действительно MyISAM.</p>
<p><strong>Александр  Лещинский</strong>, Мизантропичный  админ</p>
<p>Re: Дмитрий  Котеров</p>
<p>Мой опыт  показывает, что это совершенно неверное заявление.</p>
<p>нечасто я  соглашаюсь с Дмитрием, но тут поддержу из всех стволов. Безмозглое неграмотное  мудачье, не знающее матчасти, делает &laquo;абы как&raquo; своими руками,  растущими из жопы, а потом удивляется &laquo;а шо, нам обещали что будет все  шоколадно, а все совсем не так&raquo;? Любой инструмент, даже самый хороший, не  отменяет необходимости думать&#8230; головой!!! а не тем, чем привыкли так  называемые &laquo;работники&raquo; &#8211; очком.</p>
<p>Re: Валерий Леонтьев</p>
<p>Про журнальчик этот вобще цензурных слов нет&#8230; большего сборища ламерья я еще  не встречал&#8230; Писать и проектировать надо аккуратно, чтобы не накрывал БП</p>
<p><strong>Дмитрий  Кадыков</strong>, web-программист  Интернет-гипермаркета 003.ru</p>
<p>Re: Валерий Леонтьев</p>
<p>Да просто новому начальнику не понравилось, что одна часть проекта работает по  Postgre, а всё остальное &#8211; под MySQL. Кстати, сразу же хотелось бы задать  вопрос всем: может ли считаться оправданным совмещение двух СУБД в рамках  одного проекта и в каких случаях стоит так делать?</p>
<p><strong>Валерий Леонтьев</strong>, программист PHP/MySQL</p>
<p>Re: Дмитрий Котеров</p>
<p>Кстати, как я понял, Дмитрий Котеров повсеместно предпочитает использовать  InnoDB. А как с <a href="http://valera.ws/tag/fulltext/" class="st_tag internal_tag" rel="tag" title="Записи, помеченные с  FULLTEXT">fulltext</a>-поиском? Используете ли Вы его? Или ищите по каким-то  другим алгоритмам?</p>
<p><strong>Валерий Леонтьев</strong>, программист PHP/MySQL</p>
<p>Re: Дмитрий Кадыков</p>
<p>Логически поразмышляв, пришел к выводу, что совмещение СУБД оправдано быть не  может. Обычно, из 2х СУБД одна лучше. Тогда зачем делить, логичнее все делать  на той, которая лучше в данной ситуации. Возможно, деление оправдано в крайне  редких случаях, когда разные элементы проекта <strong>требуют</strong> функционал,  доступный только в разных СУБД. Не знаю бывает ли такое вообще, но если и  бывает, то крайне редко (может 1 сайт из 1000).</p>
<p><strong>Александр Лещинский</strong>, Мизантропичный админ</p>
<p>Re: Валерий Леонтьев</p>
<p>Логически поразмышляв, пришел к выводу, что совмещение СУБД оправдано быть  не может.</p>
<p>А практики говорят, что резоны могут быть&#8230;</p>
<p><strong>Валерий Леонтьев</strong>, программист PHP/MySQL</p>
<p>Ну так у любого правила есть  исключения. Я и пример даже привел.</p>
<p><strong>Евгений  Неверов</strong>, Я — человек!</p>
<p>Если же вернуться к сути вопроса, то  структуру из одной БД нужно будет перенести заранее ручками (проще это), а вот  данные скорее всего перенесутся без проблем.</p>
<p>Был у меня один проект, который я переносил с MySQL на PostgreSQL, так вот там  по ходу дела пришлось сменить структуру таблиц. Чтобы импортировать данные я  написал около 20 регулярных выражений, которые преобразовывали INSERT-запросы к  нужному формату. Но в результате всё получилось очень хорошо.</p>
<p>Ответить</p>
<p><strong>Виктор Куряшкин</strong>, Semantic Web specialist, Sun Microsystems</p>
<p>На постгрес с мускула имеет смысл  переходить, если вы будете использовать возможности постгреса.</p>
<p>Просто &laquo;переписать запросы&raquo;, сделать автоинкремент сиквенсом и все &#8211;  это не аргумент.</p>
<p>Если вы не планируете усложнять логику на уровне субд &#8211; то точно переходить не  стоит. Просто провозитесь и получите прибавку к производительности 5%, а то и  потеряете в некоторых случаях.</p>
<p><strong>Дмитрий Котеров</strong>, МойКруг.ру:  сооснователь, рук. разработки</p>
<p>В MySQL  медленнее работают сложные запросы: с джойнами и подзапросами</p>
<p>Не совсем так. Скорость выполнения  запроса зависит во многом от того, &laquo;попадает&raquo; ли он, грубо говоря, в  индексы. Если запрос &laquo;не попал&raquo; в индексы в MySQL и &laquo;не  попал&raquo; в PostgreSQL, неверно говорить, что &laquo;в PostgreSQL этот запрос  будет работать быстрее&raquo; &#8211; он в обоих случаях работает недопустимо долго.</p>
<p>Другое дело, что в PostgreSQL мощный планировщик и оптимизатор запросов  (правда, он при этом и очень сложен, а также часто &laquo;ошибается&raquo;, т.е.  на его приструнение и изучение нужно тратить много времени). Кроме того, в  PostgreSQL есть всякие там Hash Join и т.д. Так что, действительно, у  написанного &laquo;от балды&raquo; сложного многотабличного запроса в PostgreSQL  вероятность выполниться быстро выше, чем у того же запроса в MySQL. Но речь-то  сейчас не о вероятностях, а о том, что запросы нужно строить грамотно, смотреть  план их выполнения и &laquo;подгонять&raquo; друг под друга запрос, его план и  индексы. А если все подогнанно, то и там, и там выполняется быстро, и на  передний план выходит уже скорость апдейтов и простота репликации.</p>
<p>Кстати, как  я понял, Дмитрий Котеров повсеместно предпочитает использовать InnoDB. А как с  fulltext-поиском? Используете ли Вы его? Или ищите по каким-то другим  алгоритмам?</p>
<p>Собственно,  на MойКруге PostgreSQL во многом как раз из-за того, что в нем есть отличный  полнотекстовый поиск, который и не снился MySQL. (А в 8.3 он будет еще лучше.)  В InnoDB, к сожалению, полнотекстовых индексов и правда не бывает. Но я слышал,  что есть масса внешних решений для индексации таблиц &#8211; в этом случае индекс  строится с задержкой и по нему не так удобно искать, конечно, но &#8211; это лучше, чем  ничего. Лично мне с ними работать не приходилось.</p>
<p>Опять же, если строить систему с нуля, и если в системе планируется много  апдейтов данных, то лучше идти в сторону как раз раздельного хранения  полнотекстового индекса и данных. Ну или хотя бы считать полнотекстовый индекс  асинхронно (с задержкой) &#8211; как сделано здесь.</p>
<p>Насчет систем с двумя различными СУБД &#8211; почему бы и нет? Мы, например,  используем и MySQL тоже (как раз там, где мало селектов, но много инсертов и  апдейтов). Да, на администрирование дополнительной базы должно тратиться больше  времени, однако тут есть два &laquo;но&raquo;:</p>
<p>1. Админ, работая с двумя базами сразу, здорово повышает свою квалификацию.  Кроме того, появляется возможность сравнивать те или иные вещи.</p>
<p>2. MySQL очень неприхотлива и нетребовательна в администрировании (по моим  приблизительным оценкам &#8211; там раз в 10 меньше подводных камней, чем в  PostgreSQL), поэтому затраты на администрирование и MySQL тоже крайне малы.</p>
<p style="padding: 5px" align="center"><script type="text/javascript"><!--
google_ad_client = "pub-0424730706680650";google_ad_width = 468;google_ad_height = 15;google_ad_format = "468x15_0ads_al";google_ad_channel = "";google_color_border = "940F04";google_color_bg = "FFCC66";google_color_link = "006699";google_color_text = "000033";google_color_url = "008000";
// --></script><script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"></script></p>
<p><strong>Поучаствовать в обсуждении можно здесь: <a href="http://moikrug.ru/topics/216367527/" target="_blank">http://moikrug.ru/topics/216367527/</a> </strong></p>
<p><strong> Вывод: прежде чем переходить на PostgreSQL нужно  хорошо обдумать, стоит ли оно того, чтобы потом не пришлось откатывать все  назад.</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://valera.ws/2007.09.04~postgresql-vs-mysql/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

