<?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; Базы данных</title>
	<atom:link href="http://tigor.com.ua/blog/category/databases/feed/" rel="self" type="application/rss+xml" />
	<link>http://tigor.com.ua/blog</link>
	<description>О разработке веб-приложений на Symfony</description>
	<lastBuildDate>Fri, 18 Jun 2010 08:27:25 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>ORM в мире PHP</title>
		<link>http://tigor.com.ua/blog/2009/10/21/orm-in-the-php-world/</link>
		<comments>http://tigor.com.ua/blog/2009/10/21/orm-in-the-php-world/#comments</comments>
		<pubDate>Wed, 21 Oct 2009 20:50:38 +0000</pubDate>
		<dc:creator>ingvar</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Symfony]]></category>
		<category><![CDATA[Базы данных]]></category>
		<category><![CDATA[ORM]]></category>

		<guid isPermaLink="false">http://tigor.com.ua/blog/?p=1297</guid>
		<description><![CDATA[ORM (англ. Object-relational mapping, русск. Объектно-реляционная проекция) — запись объектов программы в реляционную базу данных, отображение объекта и его представления в виде набора таблиц. &#8211; Википедия: ORM 
В своей работе используем PHP Framework Symfony 1.2.9 и Propel 1.3, но планируем перейти на Symfony 1.3 + Doctrine. У меня возник вопрос: &#171;А какие еще PHP ORM [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p><strong>ORM</strong> (англ. Object-relational mapping, русск. Объектно-реляционная проекция) — запись объектов программы в реляционную базу данных, отображение объекта и его представления в виде набора таблиц. &#8211; <a href="http://ru.wikipedia.org/wiki/ORM">Википедия: ORM</a> </p></blockquote>
<p>В своей работе используем PHP Framework Symfony 1.2.9 и Propel 1.3, но планируем перейти на Symfony 1.3 + Doctrine. У меня возник вопрос: &laquo;А какие еще PHP ORM разработаны?&raquo;. Немного погуглив &#8211; получили следующую подборку. Многие проекты новые и ещё альфа/бета версии, но в любом случае уже есть возможность из чего выбрать.</p>
<p>&bull; <a href="http://propel.phpdb.org/trac/">Propel</a><br />
&bull; <a href="http://www.doctrine-project.org/">Doctrine</a><br />
&bull; <a href="http://getdorm.com/">dOrm</a><br />
&bull; <a href="http://www.outlet-orm.org/site/">Outlet PHP ORM</a><br />
&bull; <a href="http://www.redbeanphp.com/">RedBean</a><br />
&bull; <a href="http://code.google.com/p/php-orm/"> phpORM</a><br />
&bull; <a href="http://phpdatamapper.com/">phpDataMapper</a><br />
&bull; <a href="http://www.qcodo.com/">Qcodo</a><br />
&bull; <a href="http://www.coughphp.com/">CoughPHP</a><br />
&bull; <a href="http://phplinq.codeplex.com/">PHPLinq</a><br />
&bull; <a href="http://sourceforge.net/projects/phplightorm/">LightOrm for PHP</a>, <a href="http://freshmeat.net/projects/lightorm">LightOrm on Freshmeat</a><br />
&bull; <a href="http://www.phpactiverecord.org/">PHP ActiveRecord</a>, <a href="http://github.com/kla/php-activerecord/">PHP ActiveRecord on GitHub</a><br />
&bull; <a href="http://www.phpersistence.online.fr/">phpersistence</a><br />
&bull; <a href="http://www.php-rocks.com/">Rocks PHP Library</a><br />
&bull; <a href="http://www.schizofreend.nl/pork.dbobject/">Pork.dbObject</a><br />
&bull; <a href="http://www.repose-php.org/">Repose</a><br />
&bull; <a href="http://www.greaterscope.net/projects/ORMer">ORMer</a><br />
&bull; <a href="http://porte.adaltas.com/">Porte</a><br />
&bull; <a href="http://code.google.com/p/dabase/">DaBase</a>, <a href="http://habrahabr.ru/blogs/php/72731/">DaBase — не очередная ORM для PHP</a></p>
<p><span id="more-1297"></span></p>
<p><strong>ORM в разных PHP Framework:</strong><br />
&bull; <a href="http://framework.zend.com/wiki/display/ZFPROP/Zend_Generator_Orm+-+Thomas+VEQUAUD">Zend Framework Zend_Db_Mapper</a><br />
&bull; <a href="http://code.google.com/p/zend-framework-orm/">Zend Framework Db Table ORM</a><br />
&bull; <a href="http://docs.kohanaphp.com/libraries/orm">Kohana ORM</a><br />
&bull; <a href="http://ciex.levallois.biz/">CIEXtended: based on CodeIgniter</a><br />
&bull; <a href="http://xyster.libreworks.net/">Xyster</a><br />
&bull; <a href="http://solarphp.com/package/Solar_Sql_Model">Solar’s Solar_Sql_Model</a></p>
<p><strong>Active Record (AR) в разных PHP Framework:</strong><br />
&bull; <a href="http://www.yiiframework.com/doc/guide/database.ar">Yii Active Record</a><br />
&bull; <a href="http://book.cakephp.org/view/66/Models">CakePHP</a></p>
<p><strong>Что можно почитать:</strong><br />
&bull; <a href="http://mikhailstadnik.com/few-words-about-orm">ORM и с чем его едят</a><br />
&bull; <a href="http://wiki.agiledev.ru/doku.php?id=ooad:dp:data_mapper">Шаблон DataMapper</a><br />
&bull; <a href="http://en.wikipedia.org/wiki/List_of_object-relational_mapping_software#PHP">List of object-relational mapping software: PHP</a><br />
&bull; <a href="http://www.libhound.com/databases/php-object-relational-mapping-frameworks">Comprehensive list of the object relational mapping tools and frameworks. part one: php</a><br />
&bull; <a href="http://maggienelson.com/2009/05/orm-in-the-php-world/">ORM in the PHP World</a><br />
&bull; <a href="http://nepalphp.org/content/orm-php">ORM in PHP</a><br />
&bull; <a href="http://www.derivante.com/2009/05/14/php-activerecord-with-php-53/">PHP ActiveRecord with PHP 5.3</a><br />
&bull; <a href="http://sourceforge.net/apps/trac/phplightorm/wiki/ruhome">LightOrm: Описание на русском языке</a><br />
&bull; <a href="http://www.derivante.com/2009/05/19/php-activerecord-available-for-beta-testing/">PHP ActiveRecord Available for Beta Testing</a><br />
&bull; <a href="http://trac.symfony-project.org/wiki/ConvertingPropelProjectToDoctrine">Symfony Converting Propel Project To Doctrine</a></p>
]]></content:encoded>
			<wfw:commentRss>http://tigor.com.ua/blog/2009/10/21/orm-in-the-php-world/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>MySQL EXPLAIN Cheat Sheet</title>
		<link>http://tigor.com.ua/blog/2009/06/07/mysql-explain-cheat-sheet/</link>
		<comments>http://tigor.com.ua/blog/2009/06/07/mysql-explain-cheat-sheet/#comments</comments>
		<pubDate>Sat, 06 Jun 2009 22:19:31 +0000</pubDate>
		<dc:creator>ingvar</dc:creator>
				<category><![CDATA[Cheat Sheets]]></category>
		<category><![CDATA[MySQL]]></category>

		<guid isPermaLink="false">http://tigor.com.ua/blog/?p=1243</guid>
		<description><![CDATA[Команда Explain отображает информацию о запросе Select. Эта информация может выявить проблемы с оптимизацией таблиц: необходимостью добавить индексы, чтобы получить более быструю выборку; можно понять, насколько запрос связывающий несколько таблиц удачный и т.д. 
На страничке EXPLAIN Cheatsheet выложили электронную версию краткого описания работы с этой командой: pdf-версия. Там всего одна страница формата А-4, что весьма [...]]]></description>
			<content:encoded><![CDATA[<p>Команда <strong><a href="http://www.mysql.ru/docs/man/EXPLAIN.html">Explain</a></strong> отображает информацию о запросе <strong>Select</strong>. Эта информация может выявить проблемы с оптимизацией таблиц: необходимостью добавить индексы, чтобы получить более быструю выборку; можно понять, насколько запрос связывающий несколько таблиц удачный и т.д. </p>
<p>На страничке <a href="http://www.pythian.com/news/960/explain-cheatsheet">EXPLAIN Cheatsheet</a> выложили электронную версию краткого описания работы с этой командой: <a href="http://www.pythian.com/blogs/wp-content/uploads/explain-diagram.pdf"><strong>pdf-версия</strong></a>. Там всего одна страница формата А-4, что весьма удобно.</p>
<p>Что можно почитать:<br />
&bull; <a href="http://dev.mysql.com/doc/refman/5.0/en/using-explain.html">MySQL: Optimizing Queries with EXPLAIN</a><br />
&bull; <a href="http://habrahabr.ru/blogs/mysql/31129/">Habr: EXPLAIN — Самая мощная команда MySQL</a></p>
]]></content:encoded>
			<wfw:commentRss>http://tigor.com.ua/blog/2009/06/07/mysql-explain-cheat-sheet/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Топ-100 советов по производительности MySQL</title>
		<link>http://tigor.com.ua/blog/2009/03/14/top-10sqlperformance-tips/</link>
		<comments>http://tigor.com.ua/blog/2009/03/14/top-10sqlperformance-tips/#comments</comments>
		<pubDate>Sat, 14 Mar 2009 09:03:53 +0000</pubDate>
		<dc:creator>ingvar</dc:creator>
				<category><![CDATA[MySQL]]></category>

		<guid isPermaLink="false">http://tigor.com.ua/blog/?p=949</guid>
		<description><![CDATA[Топ-100 советов о производительности MySQL от авторов: Jay Pipes, Sheeri Kritzer, Bill Karwin, Ronald Bradford, Farhan &#171;Frank Mash&#187; Mashraqi, Taso Du Val, Ron Hu, Klinton Lee, Rick James, Alan Kasindorf, Eric Bergen, Kaj Arno, Joel Seligstein, Amy Lee.
]]></description>
			<content:encoded><![CDATA[<p><a href="http://forge.mysql.com/wiki/Top10SQLPerformanceTips">Топ-100 советов о производительности MySQL</a> от авторов: Jay Pipes, Sheeri Kritzer, Bill Karwin, Ronald Bradford, Farhan &laquo;Frank Mash&raquo; Mashraqi, Taso Du Val, Ron Hu, Klinton Lee, Rick James, Alan Kasindorf, Eric Bergen, Kaj Arno, Joel Seligstein, Amy Lee.</p>
]]></content:encoded>
			<wfw:commentRss>http://tigor.com.ua/blog/2009/03/14/top-10sqlperformance-tips/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Как определить оптимальный размер innodb_log_file_size</title>
		<link>http://tigor.com.ua/blog/2009/02/04/how-to-determine-the-optimal-size-innodb_log_file_size/</link>
		<comments>http://tigor.com.ua/blog/2009/02/04/how-to-determine-the-optimal-size-innodb_log_file_size/#comments</comments>
		<pubDate>Wed, 04 Feb 2009 08:25:48 +0000</pubDate>
		<dc:creator>ingvar</dc:creator>
				<category><![CDATA[MySQL]]></category>

		<guid isPermaLink="false">http://tigor.com.ua/blog/?p=798</guid>
		<description><![CDATA[Как известно, при коммите InnoDB записывает данные не сразу в файлы данных, а сначала записывает изменения в innodb_log_file. Дело в том что записать данные непосредственно в таблицу &#8211; существенно более дорогая операция, чем записать изменения в бинарный лог.
Ведение innodb_log_file позволяет проводить оптимизацию i/o: записывать данные большими последовательными кусками, а также более быстрее обслуживать клиентов (клиент [...]]]></description>
			<content:encoded><![CDATA[<p>Как известно, при коммите InnoDB записывает данные не сразу в файлы данных, а сначала записывает изменения в innodb_log_file. Дело в том что записать данные непосредственно в таблицу &#8211; существенно более дорогая операция, чем записать изменения в бинарный лог.</p>
<p>Ведение innodb_log_file позволяет проводить оптимизацию i/o: записывать данные большими последовательными кусками, а также более быстрее обслуживать клиентов (клиент быстро сделал коммит, а данные в табличное пространство записываются в фоне). Поэтому чем больше файл, тем больше возможности для InnoDB оптимизировать ввод/вывод. В настоящее время суммарный размер innodb_log_file ограничен 4 Гб, что более чем достаточно для большинства случаев.</p>
<p><span id="more-798"></span></p>
<p>При старте после неожиданного отключения MySQL просматривает innodb_log_file, откатывая транзакции, которые не успели завершиться перед крахом и отмечая коммиты, которые успели (и были полностью записаны в innodb_log_file). И естественно, чем больше файл, тем больше времени требуется серверу чтобы просмотреть его.</p>
<p>Как же определить наиболее оптимальный размер?</p>
<p>Выполните эти команды во время наиболее интенсивной нагрузки вашего сервера:</p>
<pre class="brush: sql;">
mysql&gt; pager grep sequence
PAGER SET TO 'grep sequence'
 
mysql&gt; SHOW engine innodb STATUS\G SELECT sleep(60); SHOW engine innodb STATUS\G
Log sequence number 84 3836410803
 1 row IN SET (0.06 sec)
 1 row IN SET (1 min 0.00 sec)
Log sequence number 84 3838334638
 1 row IN SET (0.05 sec)
</pre>
<p> </p>
<p>Обратите внимание на номер log sequence. Это общее количество байт записанных в лог. Так что мы можем узнать сколько Мб было записано за минуту. (Эти команды будут работать в любой версии MySQL, начиная с 5.0 можно воспользоваться метрикой Innodb_os_log_written из <span class="geshifilter"><code class="geshifilter-text">SHOW GLOBAL STATUS</code></span>.)</p>
<pre class="brush: sql;">
mysql&gt; SELECT (3838334638 - 3836410803) / 1024 / 1024 AS MB_per_min;
 
+------------+
| MB_per_min |
+------------+
| 1.83471203 |
+------------+
</pre>
<p> </p>
<p>Хорошим правилом будет установка такого размера, чтобы там могли уместиться около часа логов. Тогда InnoDB сможет весьма эффективно спланировать записи в файлы данных, и вместе с тем это хороший компросс для скорости запуска. Округляем до 128 Мб и поскольку по умолчанию файлов два устанавливаем <span class="geshifilter"><code class="geshifilter-text">innodb_log_file_size=64M</code></span>.</p>
<p>Не слишком ли это мало? Возможно. Часто я вижу размеры логов транзакций в несколько гигабайт, но обычно это ошибка. Сервер который я использовал для измерений &#8211; большой и делающий много работы, это не игрушка для тестов. Размер лог файлов не стоит оставлять в 5 Мб по умолчанию, но часто не нужно устанавливать их настолько большими, как вы можете думать.</p>
<p>Если воспользовавшись этим парвилом вы получули цифру в несколько гигабайн, значит видимо вы очень активно пишете в базу. В этом случае вы можете попробовать установить размер поменьше, чтобы минимизировать время восстановления. Но учтите: время восстановления зависит не только от размера лога транзцакций, но и от количества записей в нем. Если у вас много больших транзакций, можно установить размер побольше. И наоборот: если у вас много маленьких транзакций, стоит установить размер поменьше.<br />
В любом случаев, цифра полученая этим правилом &#8211; хорошая отправная точка.</p>
<p><strong>Источник:</strong><br />
&bull; <a href="http://greenmice.info/ru/node/92">GreenMice: Как определить оптимальный размер innodb_log_file_size</a><br />
&bull; <a href="http://habrahabr.ru/blogs/mysql/51013/">Обсуждение на хабре</a></p>
]]></content:encoded>
			<wfw:commentRss>http://tigor.com.ua/blog/2009/02/04/how-to-determine-the-optimal-size-innodb_log_file_size/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Триггеры в MySQL</title>
		<link>http://tigor.com.ua/blog/2008/08/27/mysql-triggers/</link>
		<comments>http://tigor.com.ua/blog/2008/08/27/mysql-triggers/#comments</comments>
		<pubDate>Wed, 27 Aug 2008 21:08:27 +0000</pubDate>
		<dc:creator>ingvar</dc:creator>
				<category><![CDATA[MySQL]]></category>

		<guid isPermaLink="false">http://tigor.com.ua/blog/?p=525</guid>
		<description><![CDATA[Поддержка триггеров появилась в MySQL 5.0.2. Триггер &#8211; это аналог процедуры, который ассоциируется с конкретной таблицей и запускается при наступлении определенных событий связанных с этой самой таблицей. Событий для таблиц всего несколько: INSERT, DELETE, UPDATE.
Пример триггера INSERT для таблицы News &#8211; записываем в поле `created_at` дату и время создания записи. Конечно можно было воспользоваться TIMESTAMP, [...]]]></description>
			<content:encoded><![CDATA[<p>Поддержка триггеров появилась в MySQL 5.0.2. Триггер &#8211; это аналог процедуры, который ассоциируется с конкретной таблицей и запускается при наступлении определенных событий связанных с этой самой таблицей. Событий для таблиц всего несколько: INSERT, DELETE, UPDATE.</p>
<p>Пример триггера INSERT для таблицы News &#8211; записываем в поле `created_at` дату и время создания записи. Конечно можно было воспользоваться TIMESTAMP, но в данном случае это сделано в качестве простого примера:<br />
<span id="more-525"></span></p>
<pre class="brush: sql;">
DROP TRIGGER IF EXISTS  `database`.`news_insert`;

DELIMITER $$

CREATE
    DEFINER = CURRENT_USER
    TRIGGER `database`.`news_insert` BEFORE INSERT
    ON `database`.`news`
    FOR EACH ROW BEGIN
      SET NEW.`created_at` = NOW();
    END$$

DELIMITER ;
</pre>
<p>В триггере используем оператор <b>DEFINER = CURRENT_USER</b>, его можно опустить, тогда в этом случае будут права текущего пользователя, но можно и установить другого, например:</p>
<pre class="brush: sql;">
CREATE
    DEFINER = `user`@'localhost'
    TRIGGER `database`.`news_insert` BEFORE INSERT
....
</pre>
<p>До версии MySQL 5.1.6 для создания триггеров требовались полномочия суперпользователя, что не совсем хорошо, т.к. во-первых на шаровых хостингах не предоставляют полномочия суперпользователя, а во-вторых это потенциальная брешь в системе безопасности. Без прав суперпользователя в MySQL ниже 5.1.6 получим ошибку:</p>
<pre class="brush: sql;">
ERROR 1227 (42000): Access denied; you need the SUPER privilege for this operation
</pre>
<p>Пример создание пользователя в MySQL и предоставления ему обычных прав:</p>
<pre class="brush: sql;">
#DROP USER 'user'@'localhost';
# ''
CREATE USER 'user'@'localhost' IDENTIFIED BY PASSWORD '*6C8989366EAF75BB670AD8EA7A7FC1176A95CEF4;
GRANT USAGE ON *.* TO 'user'@'localhost' IDENTIFIED BY PASSWORD '*6C8989366EAF75BB670AD8EA7A7FC1176A95CEF4;
GRANT ALL PRIVILEGES ON `database`.* TO 'user'@'localhost' WITH GRANT OPTION;
</pre>
<p>Пример создание пользователя и предоставления ему прав суперпользователя:</p>
<pre class="brush: sql;">
CREATE USER 'user'@'localhost' IDENTIFIED BY 'my_password';
GRANT USAGE ON *.* TO 'user'@'localhost';
GRANT ALL PRIVILEGES ON `database`.* TO 'user'@'localhost' WITH GRANT OPTION;
GRANT SUPER ON *.* TO 'user'@'localhost';
</pre>
<p>Ссылки по теме:<br />
&bull; <a href="http://dev.mysql.com/doc/refman/5.1/en/create-trigger.html">MySQL 5.1 Reference Manual :: 24.1 CREATE TRIGGER Syntax</a><br />
&bull; <a href="http://dev.mysql.com/doc/refman/5.1/en/grant.html">MySQL 5.1 Reference Manual :: 12.5.1.3 GRANT Syntax</a><br />
&bull; <a href="http://dev.mysql.com/tech-resources/articles/mysql-triggers.pdf">PDF: MySQL 5.0 Triggers</a><br />
&bull; <a href="http://habrahabr.ru/blogs/mysql/37693/">Habrahabr: Триггеры в MySQL</a></p>
]]></content:encoded>
			<wfw:commentRss>http://tigor.com.ua/blog/2008/08/27/mysql-triggers/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MySQL: cравнение даты (datetime) через оператор BETWEEN</title>
		<link>http://tigor.com.ua/blog/2008/08/23/date_comparison_by_between_operator_of_mysql/</link>
		<comments>http://tigor.com.ua/blog/2008/08/23/date_comparison_by_between_operator_of_mysql/#comments</comments>
		<pubDate>Sat, 23 Aug 2008 18:29:27 +0000</pubDate>
		<dc:creator>ingvar</dc:creator>
				<category><![CDATA[MySQL]]></category>

		<guid isPermaLink="false">http://tigor.com.ua/blog/?p=492</guid>
		<description><![CDATA[Оператор BETWEEN идеально подходит для сравнения диапазона между датами (datetime). Но тут есть подводные камни. Например, есть задача &#8211; выбрать данные из таблицы за некоторый промежуток времени (с &#8216;2008-08-14&#8242; по &#8216;2008-08-23&#8242;).
Рекомендации:
1. Выполняя любые сравнения, приводить все данные к одному типу.
2. Если один операнд имеет значение типа TIMESTAMP или DATETIME, а другой является константой, операнды сравниваются [...]]]></description>
			<content:encoded><![CDATA[<p>Оператор BETWEEN идеально подходит для сравнения диапазона между датами (datetime). Но тут есть подводные камни. Например, есть задача &#8211; выбрать данные из таблицы за некоторый промежуток времени (с &#8216;2008-08-14&#8242; по &#8216;2008-08-23&#8242;).</p>
<p><strong>Рекомендации:</strong><br />
1. Выполняя любые сравнения, приводить все данные к одному типу.<br />
2. Если один операнд имеет значение типа TIMESTAMP или DATETIME, а другой является константой, операнды сравниваются как значения типа TIMESTAMP. А это значит, что если была строка в виде &#8216;2008-08-14&#8242;, то она автоматически преобразуется в TIMESTAMP &#8216;2008-08-14 00:00:00&#8242; и это влияет на результат запроса.<br />
3. Над данными, которые участвуют в условиях сравнения желательно не делать никаких операций &#8211; это позволяет для них использовать индексы, иначе они игнорируются.</p>
<p><span id="more-492"></span><br />
Примеры запросов с BETWEEN и без него:</p>
<pre class="brush: sql;">
# Поле created_at - тип DATETIME
# КОРРЕКТНЫЕ ЗАПРОСЫ

# 1: Индексы для created_at поля не используются.
# Условие BETWEEN '2008-08-14' AND '2008-08-23'
# преобразуется в BETWEEN '2008-08-14 00:00:00' AND '2008-08-23 00:00:00'.
SELECT * FROM news
  WHERE DATE(created_at) BETWEEN '2008-08-14' AND '2008-08-23';

# 2: Оператор BETWEEN не используем, но тоже не самый лучший вариант, индексы не используются
SELECT * FROM news
  WHERE DATE(created_at) &gt;= '2008-08-14' AND DATE(created_at) &lt;= '2008-08-23';

# 3: Строки '2008-08-14 00:00:00' и '2008-08-23 23:59:59' не приведены к типу данных DATE
SELECT * FROM news
  WHERE created_at BETWEEN '2008-08-14 00:00:00' AND '2008-08-23 23:59:59';

# 4: Самый лучший вариант, привели к типу DATETIME, индексы будут использоваться
SELECT * FROM news
  WHERE created_at BETWEEN STR_TO_DATE('2008-08-14 00:00:00', '%Y-%m-%d %H:%i:%s')
  AND STR_TO_DATE('2008-08-23 23:59:59', '%Y-%m-%d %H:%i:%s');

#############################
# НЕПРАВИЛЬНЫЕ ЗАПРОСЫ

# 5: Строки '2008-08-14' и '2008-08-23' преобразуются в TIMESTAMP и дополняются '00:00:00'
SELECT * FROM news
  WHERE created_at &gt;= '2008-08-14' AND created_at &lt;= '2008-08-23';

# 6: Аналогично запросу 5
SELECT * FROM news
  WHERE created_at BETWEEN STR_TO_DATE('2008-08-14', '%Y-%m-%d') AND STR_TO_DATE('2008-08-23', '%Y-%m-%d');
</pre>
<p>Получаем самый лучший запрос:</p>
<pre class="brush: sql;">
SELECT * FROM news
  WHERE created_at BETWEEN STR_TO_DATE('2008-08-14 00:00:00', '%Y-%m-%d %H:%i:%s')
  AND STR_TO_DATE('2008-08-23 23:59:59', '%Y-%m-%d %H:%i:%s');
</pre>
<p>Ссылки по теме:<br />
&bull; <a href="http://dev.mysql.com/doc/refman/5.1/en/comparison-operators.html#operator_between">MySQL 5.1 Reference Manual :: 11.2.3 Comparison Functions and Operators :: Operator BETWEEN</a><br />
&bull; <a href="http://dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html">MySQL 5.1 Reference Manual :: 11 Functions and Operators :: 11.6 Date and Time Functions</a><br />
&bull; <a href="http://www.winstonyw.com/2008/03/17/search-by-date-or-timestamp-in-mysql/">Search by Date or Timestamp in MySQL</a></p>
]]></content:encoded>
			<wfw:commentRss>http://tigor.com.ua/blog/2008/08/23/date_comparison_by_between_operator_of_mysql/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Список стратегий эффективного взаимодействия Memcached и MySQL</title>
		<link>http://tigor.com.ua/blog/2008/08/07/bunch-great-strategies-using-memcached-and-mysql-better-together/</link>
		<comments>http://tigor.com.ua/blog/2008/08/07/bunch-great-strategies-using-memcached-and-mysql-better-together/#comments</comments>
		<pubDate>Thu, 07 Aug 2008 19:40:45 +0000</pubDate>
		<dc:creator>Igor</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[memcached]]></category>

		<guid isPermaLink="false">http://tigor.com.ua/blog/?p=362</guid>
		<description><![CDATA[На сайте highscalability разместили очень полезную статью о взаимодействии Memcached и MySQL: A Bunch of Great Strategies for Using Memcached and MySQL Better Together.
]]></description>
			<content:encoded><![CDATA[<p>На сайте highscalability разместили очень полезную статью о взаимодействии Memcached и MySQL: A <a href="http://highscalability.com/bunch-great-strategies-using-memcached-and-mysql-better-together">Bunch of Great Strategies for Using Memcached and MySQL Better Together</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://tigor.com.ua/blog/2008/08/07/bunch-great-strategies-using-memcached-and-mysql-better-together/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Установка, настройка и запуск нескольких серверов MySQL для Windows</title>
		<link>http://tigor.com.ua/blog/2008/07/26/mysql-install-and-start-multiple-windows-services/</link>
		<comments>http://tigor.com.ua/blog/2008/07/26/mysql-install-and-start-multiple-windows-services/#comments</comments>
		<pubDate>Sat, 26 Jul 2008 12:30:43 +0000</pubDate>
		<dc:creator>Igor</dc:creator>
				<category><![CDATA[MySQL]]></category>

		<guid isPermaLink="false">http://tigor.com.ua/blog/?p=185</guid>
		<description><![CDATA[Каждый раз когда, делаю установку, обновление новой версии сервера MySQL под Windows, необходимо перекинуть все базы данных со старой версии на новую. В этом случае удобно запустить обе версии MySQL на разных портах, а не останавливать одну службу, потом другую, потому что, что-то забываем, что-то не надо сразу. Итак последовательность действий.

1. Скачать MySQL Server:
MySQL Downloads [...]]]></description>
			<content:encoded><![CDATA[<p>Каждый раз когда, делаю установку, обновление новой версии сервера MySQL под Windows, необходимо перекинуть все базы данных со старой версии на новую. В этом случае удобно запустить обе версии MySQL на разных портах, а не останавливать одну службу, потом другую, потому что, что-то забываем, что-то не надо сразу. Итак последовательность действий.<br />
<span id="more-185"></span></p>
<p><strong>1. Скачать MySQL Server:</strong><br />
<a href="http://dev.mysql.com/downloads/">MySQL Downloads</a> &#8211; выбираем версию которая нас интересует. Текущая версия <a href="http://dev.mysql.com/downloads/mysql/5.1.html">MySQL 5.1 Release Candidate</a>, все еще релиз, и самый последний дистрибутив, который можно скачать MySQL 5.1.26. Для работы в Windows пользуюсь MySQL без инсталляции &#8211; Without installer (unzip in C:\), в архиве это весит 98.3 Мб.</p>
<p>Качаем напрямую <a href="http://dev.mysql.com/get/Downloads/MySQL-5.1/mysql-noinstall-5.1.26-rc-win32.zip/from/http://mysql.infocom.ua/">Download</a> или выбираем зеркало <a href="http://dev.mysql.com/get/Downloads/MySQL-5.1/mysql-noinstall-5.1.26-rc-win32.zip/from/pick">Pick a mirror</a>, где вежливо отказываемся &laquo;» No thanks, just take me to the downloads!&raquo; и получаем прямую ссылку.</p>
<p><strong>2. Установка MySQL</strong><br />
У меня MySQL, Apache, PHP, Python, и др. софт находиться на диске <strong>D:\</strong>:<br />
d:/usr/<br />
apache2/<br />
php/<br />
mysql/ &#8211; текущая версия сервера</p>
<p>Это позволяет не переустанавливать каждый раз все заново при новой инсталляции Windows. Очень удобно и переносимо.</p>
<p>Создаем папку <strong>d:/usr/mysql_5.1.26-rc/</strong> и распаковываем туда наш архив mysql-noinstall-5.1.26-rc-win32.zip.</p>
<p><strong>3. Настройка MySQL</strong><br />
Можно скопировать файл конфигурации <strong>my.ini</strong> с предыдущей версии, только если это версия 5.1, более старые конфигурации могут отличаться. Или настраиваем новый файл.<br />
Делаем все с нуля.</p>
<p>Есть четыре файла настройки MySQL: my-huge.ini, my-large.ini, my-medium.ini, my-small.ini. Отличаются они разными опциями и зависят от целей, ресурсов сервера. Берем my-medium.ini и переименовываем в my.ini &#8211; это наш файл конфигурации.</p>
<p>Добавляем следующие полезные опции в секцию <strong>[mysqld]</strong>.</p>
<pre class="brush: sql;">
[mysqld]
# меняем временно порт с 3306 на 3307
port = 3307

# добавляем поддержку кодировки UTF-8 по умолчанию, это решает много проблем
default-character-set=utf8
default-collation=utf8_unicode_ci
</pre>
<p><strong>4. Запуск MySQL</strong><br />
Запускать MySQL в Windows будем как службу. Для это её надо добавить в сервисы. Можно запускать сервис вручную, или включить автозагрузку в &laquo;Сервисах&raquo;.</p>
<p><strong>Добавление службы</strong></p>
<p>Создаем следующие bat-файлы, все команды можно запускать в консоли, но так удобнее.<br />
<strong>install_service.bat</strong> &#8211; инсталляция сервиса</p>
<pre class="brush: xml;">
&quot;d:\usr\mysql_5.1.26-rc\bin\mysqld&quot; --install-manual MySQL5_1_26-rc  --defaults-file=&quot;d:\usr\mysql_5.1.26-rc\my.ini&quot;
</pre>
<p><strong>MySQL5_1_26-rc</strong> &#8211; название нашей службы, оно обязательно должно быть уникальным. Если зайти в &laquo;Службы&raquo;: Настройка &#8211; Панель Управления &#8211; Администрирование Службы , то можно увидеть новый сервис: <strong>MySQL5_1_26-rc</strong> и в её настройках параметр запуска</p>
<pre class="brush: xml;">
d:\usr\mysql_5.1.26-rc\bin\mysqld --defaults-file=d:\usr\mysql_5.1.26-rc\my.ini MySQL5_1_26-rc
</pre>
<p><strong>remove_service.bat</strong> &#8211; удаления сервиса из списка служб</p>
<pre class="brush: xml;">
NET STOP MySQL5_1_26-rc
&quot;d:\usr\mysql_5.1.26-rc\bin\mysqld&quot; --remove MySQL5_1_26-rc
</pre>
<p><strong>service_start_mysql.bat</strong> &#8211; запуск сервиса</p>
<pre class="brush: xml;">
NET START MySQL5_1_26-rc
</pre>
<p><strong>service_stop_mysql.bat</strong> &#8211; остановка сервиса</p>
<pre class="brush: xml;">
NET STOP MySQL5_1_26-rc
</pre>
<p><strong>5. Подключение к БД</strong><br />
После инсталляции сервиса и его запуска, нужно проверить работоспособность MySQL сервера.</p>
<p><strong>Настройки подключения по умолчанию:</strong><br />
хост: localhost<br />
имя пользователя: root<br />
пароль:<br />
порт: 3306 (но мы его поменяли, теперь он 3307)</p>
<p>Можно воспользоваться каким-нибудь клиентом, например: SQLyog. Или с помощью  консольной утилиты mysql:</p>
<pre class="brush: sql;">
# очень важно использовать полный путь к новому серверу и порт 3307
D:&gt; d:\usr\mysql_5.1.26-rc\bin\mysql -h localhost -P 3307 -u root

# отобразить список БД
mysql&gt; show databases;

+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| test               |
+--------------------+
3 rows in set (0.00 sec)
</pre>
<p><strong>6. Экспорт базы данных</strong><br />
Для экспорта БД лучше воспользоваться стандартным программой <strong>MySQL mysqldump</strong>. Все родные утилиты более производительнее, чем другие.</p>
<pre class="brush: sql;">
&quot;d:\usr\mysql\bin\mysqldump.exe &quot;  -hlocalhost -uroot -proot  --add-drop-table --all-databases &gt; mysql_all_db.sql
</pre>
<p>На выходе получаем файл &#8211; <strong>mysql_all_db.sql</strong>.</p>
<p>Можно добавить опцию <strong>&#8211;add-drop-database</strong> &#8211; но тогда будут удалены все БД при импорте. Когда это нужно? Например, если нужно импортировать БД со всеми пользователями, их привилегиями, правами.</p>
<p><strong>7. Импорт БД</strong><br />
Для импорта воспользуемся консольной утилитой mysql.</p>
<pre class="brush: sql;">
# без пароля
d:\usr\mysql_5.1.26-rc\bin\mysql -h localhost -P 3307 -u root &lt; mysql_all_db.sql

# с указанием пароля
d:\usr\mysql_5.1.26-rc\bin\mysql -h localhost -P 3307 -u root -proot &lt; mysql_all_db.sql
# или с паролем, но с вводом его вручную
d:\usr\mysql_5.1.26-rc\bin\mysql -h localhost -P 3307 -u root -p &lt; mysql_all_db.sql
</pre>
<p><strong>8. Окончательная настройка нового MySQL сервера</strong><br />
Поменять порт в новом сервере на 3306</p>
<p>Если старый сервер не нужен, то как минимум надо его службу остановить, оключить из автозапуска сервисов</p>
<p>Если вдруг понадобятся данные из старого сервера, рекомендую создать bat-файлы для него, и настроить его на другой порт, тогда не будет конфликтов с текущим.</p>
<p>Чтобы консольные утилиты сервера MySQL работали без указания полного пути можно добавить в &laquo;Переменные среды&raquo; путь к серверу:</p>
<pre class="brush: xml;">
Path: d:\usr\mysql;d:\usr\mysql\bin;

# или
Path: d:\usr\mysql_5.1.26-rc;d:\usr\mysql_5.1.26-rc\bin;
</pre>
<p>Только учтите, там не должны быть указаны пути на несколько серверов, только на один сервер.</p>
<p><strong>Ссылки по теме:</strong><br />
<a href="http://dev.mysql.com/doc/refman/5.1/en/windows-installation.html">Installing MySQL on Windows</a><br />
<a href="http://dev.mysql.com/doc/refman/5.1/en/windows-start-service.html">Starting MySQL as a Windows Service</a><br />
<a href="http://dev.mysql.com/doc/refman/5.1/en/multiple-windows-services.html">Starting Multiple Windows Servers as Services</a><br />
<a href="http://dev.mysql.com/doc/refman/5.1/en/connecting.html">Connecting to the MySQL Server</a><br />
<a href="http://dev.mysql.com/doc/refman/5.1/en/mysql.html">mysql — The MySQL Command-Line Tool</a><br />
<a href="http://dev.mysql.com/doc/refman/5.1/en/mysqldump.html">mysqldump — A Database Backup Program</a><br />
<a href="http://www.mysql.ru/docs/man/NT_start.html">Запуск MySQL на Windows NT, 2000 или XP</a></p>
<p><a href="http://www.webyog.com/en/">SQLyog MySQL Client</a><br />
<a href="http://ru.wikipedia.org/wiki/SQLyog">http://ru.wikipedia.org/wiki/SQLyog</a><br />
<a href="http://www.phpmyadmin.net/">phpMyAdmin</a></p>
]]></content:encoded>
			<wfw:commentRss>http://tigor.com.ua/blog/2008/07/26/mysql-install-and-start-multiple-windows-services/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Журнал общих запросов Mysql 5.1 general_log_file</title>
		<link>http://tigor.com.ua/blog/2008/07/25/mysql-general_log-file/</link>
		<comments>http://tigor.com.ua/blog/2008/07/25/mysql-general_log-file/#comments</comments>
		<pubDate>Thu, 24 Jul 2008 22:11:39 +0000</pubDate>
		<dc:creator>Igor</dc:creator>
				<category><![CDATA[MySQL]]></category>

		<guid isPermaLink="false">http://tigor.com.ua/blog/?p=106</guid>
		<description><![CDATA[Журнал содержит информацию о подключениях клиентов, запросах и другого рода событиях. Это файл очень полезен для отладки, оптимизации систем.

# С помощью этого запроса можно увидеть состояние системных переменных.
mysql&#62; show variables
  where Variable_name in ('version', 'log', 'general_log', 'general_log_file', 'log_output');

+------------------+---------------------------------------+
&#124; Variable_name    &#124; Value           [...]]]></description>
			<content:encoded><![CDATA[<p>Журнал содержит информацию о подключениях клиентов, запросах и другого рода событиях. Это файл очень полезен для отладки, оптимизации систем.<br />
<span id="more-106"></span></p>
<pre class="brush: sql;"># С помощью этого запроса можно увидеть состояние системных переменных.
mysql&gt; show variables
  where Variable_name in ('version', 'log', 'general_log', 'general_log_file', 'log_output');

+------------------+---------------------------------------+
| Variable_name    | Value                                 |
+------------------+---------------------------------------+
| general_log      | OFF                                   |
| general_log_file | /usr/local/mysql/data/datacharmer.log |
| log              | OFF                                   |
| log_output       | FILE                                  |
| version          | 5.1.25-rc-community-log               |
+------------------+---------------------------------------+

# Показать значения всех переменных для логов, плюс и медленные запросы
mysql&gt; SHOW VARIABLES WHERE Variable_name LIKE 'log%'
  OR Variable_name LIKE 'general_log%'
  OR Variable_name LIKE 'long%' OR Variable_name LIKE '%slow%'
  OR Variable_name = 'version' ;
</pre>
<p>Параметр <strong>log_output</strong>  может принимать значения: FILE или TABLE. Возможность вести журнал событий в таблице появилась с MySQL 5.1.</p>
<p>Изменить значения переменных можно как в файлах конфигурации <strong>my.cnf</strong> так и напрямую, например:</p>
<pre class="brush: sql;">mysql&gt; SET GLOBAL general_log_file='/tmp/mysql/general.log';
mysql&gt; SET GLOBAL general_log=ON;

# Переключение на таблицу
mysql&gt; set global log_output='TABLE';

# Запросы из таблицы
mysql&gt; select count(*) from mysql.general_log;

# Очищаем таблицу логов
mysql&gt; truncate mysql.general_log;

# Включение журналирования одновременно как в таблицу, так и в файл
mysql&gt; set global log_output='TABLE,FILE';

# Выключение журналирования и очищения таблицы
mysql&gt; set sql_log_off=0;
mysql&gt; truncate mysql.general_log;
</pre>
<p>Материалы по данному вопросу:</p>
<ul>
<li><a href="http://forge.mysql.com/wiki/Usability_Report_Table_Logs">Usability Report Table Logs</a></li>
<li><a href="http://mysql.mirrors-r-us.net/doc/refman/5.1/en/query-log.html">MySQL 5.11 Reference Manual :: 5.11.3. The General Query Log</a></li>
<li><a href="http://www.oreillynet.com/databases/blog/2007/05/hacking_mysql_table_logs.html">Hacking MySQL table logs</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://tigor.com.ua/blog/2008/07/25/mysql-general_log-file/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
