<?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>Всякие интересные штучки для WEB-разработчика &#187; Mysql</title>
	<atom:link href="http://iphp.com.ua/archives/category/mysql/feed" rel="self" type="application/rss+xml" />
	<link>http://iphp.com.ua</link>
	<description>блог о технологиях web-разработки // all your base are belong to us</description>
	<lastBuildDate>Thu, 24 Jun 2010 05:23:12 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>UTF-8 и сортировка украинских букв в MySQL</title>
		<link>http://iphp.com.ua/archives/552</link>
		<comments>http://iphp.com.ua/archives/552#comments</comments>
		<pubDate>Thu, 24 Jun 2010 05:14:03 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Mysql]]></category>
		<category><![CDATA[utf-8]]></category>

		<guid isPermaLink="false">http://iphp.com.ua/?p=552</guid>
		<description><![CDATA[Для сортировки поля с украинскими символами collate (сравнение) должно быть utf8_unicode_ci. Например, если у поля collate установлено в utf8_general_ci то поля с первой буквой i будут вначале, перед буквой а (если сортировка по возрастанию). Один из вариантов исправления этого – сделать экспорт таблицы, добавить нужный collate и импортировать обратно. Например, есть таблица users, правильный вариант [...]]]></description>
			<content:encoded><![CDATA[<p>Для сортировки поля с украинскими символами collate (сравнение) должно быть <strong>utf8_unicode_ci</strong>. Например, если у поля collate установлено в utf8_general_ci то поля с первой буквой i будут вначале, перед буквой а (если сортировка по возрастанию).</p>
<p>Один из вариантов исправления этого – <strong>сделать экспорт таблицы, добавить нужный collate и импортировать обратно</strong>. Например, есть таблица users, правильный вариант команды создания таблицы может быть таким:</p>
<pre class="brush: sql;">
CREATE TABLE `users` (
`id` int(11) unsigned NOT NULL auto_increment,
`login` varchar(255) NOT NULL,
...
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE utf8_unicode_ci;
</pre>
<p>Если просто поменять collate через ALTER TABLE, то это не поможет – изменится только свойство collate, а не сами данные.</p>
]]></content:encoded>
			<wfw:commentRss>http://iphp.com.ua/archives/552/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Что нужно настроить в mySQL сразу после установки?</title>
		<link>http://iphp.com.ua/archives/456</link>
		<comments>http://iphp.com.ua/archives/456#comments</comments>
		<pubDate>Tue, 11 Aug 2009 23:08:33 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Mysql]]></category>

		<guid isPermaLink="false">http://iphp.com.ua/archives/456</guid>
		<description><![CDATA[Вольный перевод довольно старой статьи с MySQL Performance Blog о том, что лучше сразу же настроить после установки базовой версии mySQL. Удивительно, сколько народу устанавливает mySQL на свои сервера и оставляют его с настройками по умолчанию. Несмотря на то, что в mySQL существует довольно много настроек, которые Вы можете изменить, есть набор действительно очень важных [...]]]></description>
			<content:encoded><![CDATA[<p>Вольный перевод довольно старой статьи с MySQL Performance Blog о том, что лучше сразу же настроить после установки базовой версии mySQL.</p>
<p>Удивительно, сколько народу устанавливает mySQL на свои сервера и оставляют его с настройками по умолчанию.</p>
<p>Несмотря на то, что в mySQL существует довольно много настроек, которые Вы можете изменить, есть набор действительно очень важных характеристик, которые обязательно нужно оптимизировать под собственный сервер. Обычно после такой небольшой настройки производительность сервера заметно увеличивается.</p>
<ul>
<li><strong>key_buffer_size</strong> — крайне важная настройка при использовании MyISAM-таблиц. Установите её равной около 30-40% от доступной оперативной памяти, если используете только MyISAM. Правильный размер зависит от размеров индексов, данных и нагрузки на сервер — помните, что MyISAM использует кэш операционной системы (ОС), чтобы хранить данные, поэтому нужно оставить достаточно места в ОЗУ под данные, и данные могут занимать значительно больше места, чем индексы. Однако обязательно проверьте, чтобы всё место, отводимое директивой <em>key_buffer_size</em> под кэш, постоянно использовалось — нередко можно видеть ситуации, когда под кэш индексов отведено 4 ГБ, хотя общий размер всех .MYI-файлов не превышает 1 ГБ. Делать так совершенно бесполезно, Вы только потратите ресурсы. Если у Вас практически нет MyISAM-таблиц, то <em>key_buffer_size</em> следует выставить около 16-32 МБ — они будут использоваться для хранения в памяти индексов временных таблиц, создаваемых на диске.</li>
<li><strong>innodb_buffer_pool_size</strong> — не менее важная настройка, но уже для InnoDB, обязательно обратите на неё внимание, если собираетесь использовать в основном InnoDB-таблицы, т.к. они значительно более чувствительны к размеру буфера, чем MyISAM-таблицы. MyISAM-таблицы в принципе могут неплохо работать даже с большим количеством данных и при стандартном значении <em>key_buffer_size</em>, однако mySQL может сильно «тормозить» при неверном значении <em>innodb_buffer_pool_size</em>. InnoDB использует свой буфер для хранения и индексов, и данных, поэтому нет необходимости оставлять память под кэш ОС — устанавливайте <em>innodb_buffer_pool_size</em> в 70-80% доступной оперативной памяти (если, конечно, используются только InnoDB-таблицы). Относительно максимального размера данной опции — аналогично <em>key_buffer_size</em> — не стоит увлекаться, нужно найти оптимальный размер, найдите лучшее применение доступной памяти.</li>
<li><strong>innodb_additional_mem_pool_size</strong> — данная опция практически никак не влияет на производительность mySQL, однако рекомендую оставлять для InnoDB около 20 МБ (или чуть больше) под различные внутренние нужды.</li>
<li><strong>innodb_log_file_size</strong> — крайне важная настройка в условиях баз данных с частыми операциями записи в таблицы, в особенности при больших объёмах. Б<em>о</em>льшие размеры увеличивают быстродействие, однако будьте осторожны — увеличится и время восстановления данных. Я обычно выставляю значение около 64-512 МБ в зависимости от размера сервера.</li>
<li><strong>innodb_log_buffer_size</strong> — стандартное значение данной опции вполне подойдёт для большинства систем со средним количеством операций записи и небольшими транзакциями. Если же в Вашей системе бывают всплески активности, или Вы активно работаете с BLOB-данными, то рекомендую немного увеличить значение <em>innodb_log_buffer_size</em>. Однако не переусердствуйте — слишком большое значение будет пустой тратой памяти: буфер сбрасывается каждую секунду, поэтому Вам не понадобится больше места, чем требуется в течение этой секунды. Рекомендуемое значение — около 8-16 МБ, а для небольших баз — и того меньше.</li>
<li><strong>innodb_flush_log_at_trx_commit</strong> — жалуетесь, что InnoDB работает в 100 раз медленнее MyISAM? Вероятно, Вы забыли про настройку <em>innodb_flush_log_at_trx_commit</em>. Значение по умолчанию «1» означает, что каждая UPDATE-транзакция (или аналогичная команда вне транзакции) должна сбрасывать буфер на диск, что достаточно ресурсоёмко. Большинство приложений, в особенности ранее использовавшие таблицы MyISAM, будут хорошо работать со значением «2» (т.е. «не сбрасывать буфер на диск, только в кэш ОС»). Лог, однако, всё равно будет сбрасываться на диск каждые 1-2 секунды, поэтому в случае аварии Вы потеряете максимум 1-2 секунды обновлений. Значение «0» повысит производительность, но Вы рискуете потерять данные даже при аварийной остановке mySQL-сервера, в то время как при установке значение <em>innodb_flush_log_at_trx_commit</em> в «2» Вы потеряете данные только при аварии всей операционной системы.</li>
<li><strong>table_cache</strong> — открытие таблиц может быть весьма ресурсоёмко. К примеру, MyISAM-таблицы помечают заголовки .MYI файлов как «используемые в текущий момент». Обычно не рекомендуется открывать таблицы слишком часто, поэтому лучше, чтобы кэш был достаточных размеров, чтобы держать все Ваши таблицы открытыми. Для этого используется некоторое количество ресурсов ОС и оперативной памяти, однако это обычно не является существенной проблемой для современных серверов. Если у Вас несколько сотен таблиц, то стартовым значением для опции <em>table_cache</em> может быть«1024» (помните, что каждое соединение требует свой собственный дескриптор). Если у Вас ещё больше таблиц или очень много соединений — увеличьте значение параметра. Я видел mySQL сервера со значением <em>table_cache</em> равной 100 000.</li>
<li><strong>thread_cache</strong> — создание/уничтожение потоков также является ресурсоёмкой операцией, которая происходит при каждой установке соединения и каждом разрыве соединения. Я обычно выставляю эту опцию равную 16. Если у Вашего приложения могут быть скачки количество конкурентных соединений и по переменной <strong>Threads_Created</strong> виден быстрый рост количества потоков, то стоит увеличить значение <em>thread_cache</em>. Цель — не допускать создания новых потоков в условиях нормального функционирования сервера.</li>
<li><strong>query_cache_size</strong> — если Ваше приложение много и часто читает данные, и при этом у Вас нет кэша на уровне приложения, эта опция может очень помочь. Не ставьте здесь слишком большое значение, так как обслуживание большого кэша запросов будет само по себе затратным. Рекомендуемое значение — от 32 до 512 МБ. Не забудьте проверить, насколько хорошо используется кэш запросов — в некоторых условиях (при небольшом количестве хитов в кэше, т.е. когда практически не выбираются одинаковые данные) использование большого кэша может ухудшить производительность.</li>
</ul>
<p>Как Вы можете видеть, это — глобальные настройки. Эти переменные зависят от «железа» сервера и используемых движков mySQL, в то время как сессионные переменные обычно настраиваются специально под конкретные задачи. Если Вы в основном используете простые запросы, то нет никакой необходимости увеличивать значение <strong>sort_buffer_size</strong>, даже если у Вас есть лишние 64 ГБ оперативной памяти. Более того, большие значения кэшей могут только ухудшить производительность сервера. Сессионные переменные лучше оставить на потом, для тонкой настройки сервера.</p>
<p>PS: инсталляция mySQL идёт с несколькими предустановленными файлами my.cnf, рассчитанными под разную нагрузку. Если Вам некогда настраивать сервер вручную, то обычно лучше использовать их, чем стандартный конфигурационный файл, выбрав тот, что больше подойдёт под нагрузку Вашего сервера.</p>
]]></content:encoded>
			<wfw:commentRss>http://iphp.com.ua/archives/456/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MySQL Storage engines</title>
		<link>http://iphp.com.ua/archives/444</link>
		<comments>http://iphp.com.ua/archives/444#comments</comments>
		<pubDate>Fri, 24 Jul 2009 01:32:01 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Mysql]]></category>

		<guid isPermaLink="false">http://iphp.com.ua/archives/444</guid>
		<description><![CDATA[Ликбез по движкам MySQL На сегодняшний день MySQL поддерживает несколько движков. Наиболее популярные это MyISAM, InnoDB, но рассмотрим и другие. Получить список поддерживаемых движков вашего сервера можно командой SHOW ENGINES mysql&#62; SHOW ENGINES; +------------+---------+----------------------------------------------------------------+ &#124; Engine &#124; Support &#124; Comment &#124; +------------+---------+----------------------------------------------------------------+ &#124; MyISAM &#124; YES &#124; Default engine as of MySQL 3.23 with great [...]]]></description>
			<content:encoded><![CDATA[<p>Ликбез по движкам MySQL   <br />На сегодняшний день MySQL поддерживает несколько движков. Наиболее популярные это MyISAM, InnoDB, но рассмотрим и другие. Получить список поддерживаемых движков вашего сервера можно командой SHOW ENGINES</p>
<pre>mysql&gt; SHOW ENGINES;
+------------+---------+----------------------------------------------------------------+
| Engine     | Support | Comment                                                        |
+------------+---------+----------------------------------------------------------------+
| MyISAM     | YES     | Default engine as of MySQL 3.23 with great performance         |
| MEMORY     | YES     | Hash based, stored in memory, useful for temporary tables      |
| HEAP       | YES     | Alias for MEMORY                                               |
| MERGE      | YES     | Collection of identical MyISAM tables                          |
| MRG_MYISAM | YES     | Alias for MERGE                                                |
| ISAM       | NO      | Obsolete storage engine, now replaced by MyISAM                |
| MRG_ISAM   | NO      | Obsolete storage engine, now replaced by MERGE                 |
| InnoDB     | DEFAULT | Supports transactions, row-level locking, and foreign keys     |
| INNOBASE   | YES     | Alias for INNODB                                               |
| BDB        | YES     | Supports transactions and page-level locking                   |
| BERKELEYDB | YES     | Alias for BDB                                                  |
| NDBCLUSTER | NO      | Clustered, fault-tolerant, memory-based tables                 |
| NDB        | NO      | Alias for NDBCLUSTER                                           |
| EXAMPLE    | NO      | Example storage engine                                         |
| ARCHIVE    | YES     | Archive storage engine                                         |
| CSV        | NO      | CSV storage engine                                             |
| FEDERATED  | YES     | Federated MySQL storage engine                                 |
| BLACKHOLE  | YES     | /dev/null storage engine (anything you write to it disappears) |
+------------+---------+----------------------------------------------------------------+</pre>
<p><span id="more-444"></span></p>
<p><a href="http://webiteam.ru/2009/03/mysql-storage-engines/#myisam">MyISAM Storage engine</a></p>
<p><a href="#innodb">InnoDB Storage engine</a></p>
<p><a href="#archive">Archive Storage engine</a></p>
<p><a href="#memory">Memory Storage engine</a></p>
<p><a href="#merge">Merge Storage engine</a></p>
<p><a href="#bdb">BDB Storage engine</a></p>
<p><a href="#ndb">NDB Storage engine</a></p>
<p><a href="#federated">FEDERATED Storage engine</a></p>
<p><a href="#blackhole">BLACKHOLE Storage engine</a></p>
<p><a href="#falcon">Falcon Storage engine</a></p>
<p><a href="#maria">Maria Storage engine</a></p>
<hr />
<p><a name="myisam"></a></p>
<p><strong>MyISAM</strong></p>
<p><a href="http://webiteam.ru/go/?http://www.mysql.ru/docs/man/MyISAM.html">Подробней о MyISAM</a></p>
<p>Движок по умолчанию. Не поддерживает транзакций, средняя надежность хранения данных. Превосходная производительность чтения данных (через SELECT). Блокирует всю таблицу при записи в неё данных, отчего маленькая производительность при частых записях. Распространённый движок.</p>
<p>В версии MySQL 6.* MyISAM планируется заменить на движок Maria.</p>
<p>Maria &#8211; это расширенная версия MyISAM, которая поддерживает весь основной функционал MyISAM и в дополнение к этому предлагает: поддержку восстановления данных после сбоев (data auto-recovery, crash safe), полное логирование (включая операции CREATE, DROP, RENAME и TRUNCATE) и новый формат строк PAGE. Более подробно <a href="http://www.realcoding.net/article/view/4871">тут</a>.</p>
<p><strong>Примечания:</strong></p>
<ul>
<li>Таблицы могут быть повреждены. Ежедневно архивируйте данные или установите еще один MySQL сервер для выполнения репликаций. </li>
<li>Включите авто-восстановление (auto-repair) в настройках Вашего сервера (my.cnf):<br />
    <br />myisam-recover=backup,force</p>
<p>или рассмотрите возможность выполнения ежедневной автоматической проверки таблиц баз данных. </li>
<li>Конкурирующие записи полностью блокируют таблицы. Переключите все, что возможно, на оффлайн обработку записей сериями, что-бы не загружать движок сервера баз данных. (Оффлайн обработка &#8211; золотое правило, применимое для всех типов таблиц) </li>
<li>Таблица MyISAM может быть сжата стандартой утилитой <em>myisampack</em>. Сжатые таблицы MyISAM поддерживают только чтение.Объём не сжатой таблицы:
<pre>+--------------+---------+---------------+------------+
| table_name   | engine  | total_size_mb | table_rows |
+--------------+---------+---------------+------------+
| test_myisam  | MyISAM  |          6.46 |     112050 |
+--------------+---------+---------------+------------+</pre>
<p>Объём сжатой таблицы:</p>
<pre>C:\Program Files\MySQL\MySQL Server 5.0\data\gim&gt;..\..\bin\myisampack test_myisam.MYI
Compressing test_myisam.MYD: (112050 records)
- Calculating statistics
- Compressing file
67.76%
+--------------+---------+---------------+------------+
| table_name   | engine  | total_size_mb | table_rows |
+--------------+---------+---------------+------------+
| test_myisam  | MyISAM  |          2.08 |     112050 |
+--------------+---------+---------------+------------+</pre>
</li>
</ul>
<p><a name="innodb"></a></p>
<p><strong>InnoDB</strong></p>
<p><a href="http://webiteam.ru/go/?http://www.mysql.ru/docs/man/InnoDB.html">Подробней о InnoDB</a></p>
<p>Транзакционный тип движка, применяемый при интенсивных операциях записи, благодаря возможности блокировки уровня строк таблицы. Великолепная восстанавливаемость и высокая надежность хранения данных. Поддерживает внешние ключи. Движок InnoDB был приобретен Oracle в 2005 году (под GPL).</p>
<p><strong>Примечания:</strong></p>
<ul>
<li>Поддержка ACID транзакций. Встроенная отказоустойчивость данных, равная надежности 99.999%. Блокировка уровня строк (сравните с полной блокировкой всей таблицы в MyISAM) означает обеспечение быстрой записи конкурирующих операций. </li>
<li>Выполнение “SELECT Count(*) FROM table” без индексов выполняется в InnoDB очень медленно и требует сканирования всей таблицы. (Для MyISAM эта операция ничего не стоит, потому что он хранит внешние записи счетчиков для каждой таблицы).<br />
    <br />Если Вам часто необходима операция “SELECT COUNT(*)” на таблицах InnoDB, создайте MySQL триггер на вставку/удаление, который будет увеличивать/уменьшать счетчик, когда данные добавляются или удаляются из таблицы. </li>
<li>Резервирование (бакапирование)<br />
    <br />Простое архивирование всех файлов таблиц для InnoDB невозможно.</p>
<p>MySQLDump резервирует InnoDB очень медленно. (Если Вы настаиваете на таком резервировании, включите флаг: –opt –compress)</p>
<p>Быстрое жизнеспособное резервирование, которое так-же может быть использовано как новая “ведомая” (slave) машина, это InnoDB Hot Backup. </li>
<li>Восстановление<br />
    <br />В InnoDB встроена поддержка восстановления, которая работает в 99% случаев автоматически. Никогда не трогайте .frm или .ibd файлы в надежде “помочь” восстановлению базы данных. Если встроенное восстановление не сработало, переключайтесь на “ведомый” сервер и восстанавливайте основной из архивов. </li>
<li>InnoDB меньше, чем MyISAM, прощает выполнение запросов построенных не на индексах. InnoDB отправит Вас в “школу”, что-бы быть уверенным, что каждый запрос или обновление будет запущено на индексах. Выполните непроиндексированный запрос и Вы поплатитесь за это временем исполнения. </li>
<li>Никогда не изменяйте my.cnf InnoDB лог файл, когда запущен сервер баз данных. Вы разрушите последовательный лог-номер (log sequence number) оставшись без возможность восстановления. </li>
<li>Поддерживает внешние ключи. </li>
<li>Считается, что InnoDB медленнее чем MyISAM, кто так считает просто не умеет его(InnoDB) готовить. Дело в том, что движок InnoDB сильно повязан на оперативной памяти &#8211; чем больше оперативной памяти ему дашь, тем быстрее он будет работать, что не наблюдается у MyISAM. Стоит обратить внимание на параметр innodb_buffer_pool_size, по умолчанию он установлен 8 мегабайт, это ничтожно мало, как минимум рекомендуется 1 гигабайт. Подробней о настройках InnoDB можно найти <a href="http://www.mysqlperformanceblog.com/2007/11/03/choosing-innodb_buffer_pool_size/">на блоге Зайцева</a>. Народ добивался скорости быстрее чем у MyISAM, выделив, в сумме на InnoDB 16 гигабайт </li>
</ul>
<p><a name="archive"></a></p>
<p><strong>ARCHIVE</strong></p>
<p><a href="http://webiteam.ru/go/?http://dev.mysql.com/tech-resources/articles/storage-engine.html">Подробней о ARCHIVE</a></p>
<p>Используется для хранения больших объемов данных.</p>
<p><strong>Примечание:</strong></p>
<ul>
<li>Сильно сжимает информацию. </li>
<li>Не поддерживает операторы DELETE и UPDATE (только INSERT и SELECT). </li>
<li>Не поддерживает индексы (в ближайшем будущем обещают добавить поддержку индексов). </li>
<li>Обычно медленнее чем другие движки. </li>
</ul>
<p><strong>Тест драйв:</strong></p>
<p>Для теста бралась таблица с чуть более 100 000 записями, Windows XP, laptop Pentium M 2.00 GHz processor, 1GB RAM, running MySQL 5.0.10 beta.</p>
<p>Тест на создание (тест CREATE):</p>
<pre>mysql&gt; CREATE TABLE test_myisam ENGINE=myisam AS SELECT * FROM client_transaction_hist;
Query OK, 112050 rows affected (1.06 sec)
Records: 112050  Duplicates: 0  Warnings: 0&#160;&#160; mysql&gt; CREATE TABLE test_innodb ENGINE=innodb AS SELECT * FROM client_transaction_hist;
Query OK, 112050 rows affected (3.72 sec)
Records: 112050  Duplicates: 0  Warnings: 0&#160;&#160; mysql&gt; CREATE TABLE test_archive ENGINE=archive AS SELECT * FROM client_transaction_hist;
Query OK, 112050 rows affected (1.92 sec)
Records: 112050  Duplicates: 0  Warnings: 0</pre>
<p>Подсчитаем объёмы таблиц</p>
<pre>mysql&gt; SELECT  table_name table_name,
    -&gt;         engine,
    -&gt;         ROUND(data_length/1024/1024,2) total_size_mb,
    -&gt;         table_rows
    -&gt; FROM   information_schema.tables
    -&gt; WHERE  table_schema = 'gim' and
    -&gt;        table_name like 'test%'
    -&gt; ORDER BY 3;
+--------------+---------+---------------+------------+
| table_name   | engine  | total_size_mb | table_rows |
+--------------+---------+---------------+------------+
| test_archive | ARCHIVE |          1.64 |     112050 |
| test_myisam  | MyISAM  |          6.46 |     112050 |
| test_innodb  | InnoDB  |          9.52 |     112050 |
+--------------+---------+---------------+------------+</pre>
<p>Соответственно даже после сжатия MyISAM таблицы Archive будет показывать лучший вариант.</p>
<pre>+--------------+---------+---------------+------------+
| table_name   | engine  | total_size_mb | table_rows |
+--------------+---------+---------------+------------+
| test_archive | ARCHIVE |          1.64 |     112050 |
| test_myisam  | MyISAM  |          2.08 |     112050 |
| test_innodb  | InnoDB  |          9.52 |     112050 |
+--------------+---------+---------------+------------+</pre>
<p>Не всегда ARCHIVE медленный, чем больше строк тем лучший он может показать результат. На примере теста вставки (тест INSERT) 1 000 000 строк</p>
<pre>mysql&gt; CREATE TABLE insert_test (c1 int, c2 varchar(20)) engine=myisam;
Query OK, 0 rows affected (0.00 sec)&#160;&#160; mysql&gt; DROP PROCEDURE test_insert;
Query OK, 0 rows affected (0.00 sec)&#160;&#160; mysql&gt; delimiter //
mysql&gt; create procedure test_insert()
    -&gt; begin
    -&gt; declare v_ctr tinyint;
    -&gt; set v_ctr = 0;
    -&gt; while v_ctr &amp;lt; 1000000
    -&gt; do
    -&gt;     insert into insert_test values (1,'testing insert');
    -&gt;     set v_ctr = v_ctr + 1;
    -&gt; end while;
    -&gt; end
    -&gt; //
Query OK, 0 rows affected (0.00 sec)&#160;&#160; mysql&gt; delimiter ;
mysql&gt; CALL test_insert();
Query OK, 1 row affected (33.06 sec)&#160;&#160; mysql&gt; TRUNCATE TABLE insert_test;
Query OK, 0 rows affected (0.01 sec)&#160;&#160; mysql&gt; ALTER TABLE insert_test engine=archive;
Query OK, 0 rows affected
Records: 0  Duplicates: 0  Warnings: 0&#160;&#160; mysql&gt; CALL test_insert();
Query OK, 1 row affected (21.42 sec)</pre>
<p>Archive показал результат, луче быстрого MyISAM’a.<br />
  <br />Другой подход заключается что бы загрузить стандартные таблицы MyISAM, а затем выполнить сжатие (тест ALTER TABLE)</p>
<pre>mysql&gt; ALTER TABLE myisam_insert ENGINE=archive;
Query OK, 3000000 rows affected, 0 warning (8.84 sec)
Records: 3000000  Duplicates: 0  Warnings: 0</pre>
<p>Тест на сканирование (тест SELECT COUNT)</p>
<pre>mysql&gt; SELECT COUNT(*) FROM test_myisam WHERE client_id = 50;
+----------+
| count(*) |
+----------+
|       24 |
+----------+
1 row in set (0.25 sec)&#160;&#160; mysql&gt; SELECT COUNT(*) FROM test_innodb WHERE client_id = 50;
+----------+
| count(*) |
+----------+
|       24 |
+----------+
1 row in set (0.59 sec)&#160;&#160; mysql&gt; SELECT COUNT(*) FROM test_archive WHERE client_id = 50;
+----------+
| count(*) |
+----------+
|       24 |
+----------+
1 row in set (0.41 sec)</pre>
<p>Тут Archive оказался медленее MyISAM, но быстрее InnoDB.<br />
  <br />Так же не стоит забывать, что Archive поддерживается MySQL Query Cache.</p>
<p>Теперь проверим на 3 000 000 записей:</p>
<pre>mysql&gt; SELECT COUNT(*) FROM myisam_insert WHERE c1 = 1;
+----------+
| count(*) |
+----------+
|  3000000 |
+----------+
1 row in set (1.05 sec)&#160;&#160; mysql&gt; SELECT COUNT(*) FROM archive_insert WHERE c1 = 1;
+----------+
| count(*) |
+----------+
|  3000000 |
+----------+
1 row in set (2.20 sec)&#160;&#160; mysql&gt; FLUSH STATUS;
Query OK, 0 rows affected (0.00 sec)&#160;&#160; mysql&gt; SELECT COUNT(*) FROM archive_insert WHERE c1 = 1;
+----------+
| count(*) |
+----------+
|  3000000 |
+----------+
1 row in set (0.00 sec)&#160;&#160; mysql&gt; SHOW STATUS LIKE 'qcache_hits';
+-------------------------+----------+
| Variable_name           | Value    |
+-------------------------+----------+
| Qcache_hits             | 1        |
+-------------------------+----------+</pre>
<p><a name="memory"></a></p>
<p><strong>MEMORY aka HEAP</strong></p>
<p><a href="http://webiteam.ru/go/?http://www.mysql.ru/docs/man/HEAP.html">Подробней о MEMORY</a></p>
<p>Все в памяти. Очень быстрый поиск данных, однако все они хранятся только в памяти и будут потеряны при остановке сервера. Великолепно подходит для временных таблиц.</p>
<p><strong>Примечания:</strong></p>
<ul>
<li>Этот тип таблиц предлагает супер быстрый возврат данных, который работает только для небольших временных таблиц.<br />
    <br />Если загружаете слишком большие объемы данных в Memory таблицы, MySQL начинает свопировать информацию на диск и тем самым Вы теряете все преимущества Memory движка. </li>
<li>Таблицы не располагают многими возможностями обычных таблиц. Они не могут иметь столбцы типа BLOB или TEXT. Нельзя использовать флаг AUTO_INCREMENT. </li>
<li>Можно создавать индексы, но нельзя индексировать столбцы, допускающие значения NULL. Индексы используются только в операциях = и &lt;=&gt; . </li>
<li>Записи таблиц имеют фиксированную длину. Для столбцов типа VARCHAR сразу выделяется максимальное число байтов. Поскольку память — ограниченный ресурс, можно задать предельное количество записей в резидентной таблице.<br />
    <br />Для этого предназначена опция max_rows инструкции CREATE TABLE. Серверная переменная max_heap_table_size задает максимальный объем памяти, занимаемой всеми резидентными таблицами.</p>
<p>С версии MySQL 5.1 будет включена поддержка VARCHAR. </li>
</ul>
<p><a name="merge"></a></p>
<p><strong>MERGE aka MRG_ISAM</strong></p>
<p><a href="http://webiteam.ru/go/?http://www.mysql.ru/docs/man/MERGE.html">Подробней о MERGE</a></p>
<p>Коллекция MyISAM таблиц логически объединенных вместе для единого представления. В таблице типа Merge группируется несколько таблиц MyISAM одинаковой структуры. Программа MySQL создает файл с расширением .MRG, в котором содержится список таблиц. При доступе к объединенной таблице программа обращается к каждой таблице из списка. Если в списке всего одна таблица, то создается только ее псевдоним. Если же таблиц две или более, их записи трактуются так, будто они находятся в одной таблице. С функциональной точки зрения объединенная таблица обладает всеми свойствами обычной таблицы.</p>
<p><strong>Примечания:</strong></p>
<ul>
<li>Объединенная таблица создается очень быстро, так как требуется всего лишь сформировать список имен исходных таблиц. В случае уничтожения такой таблицы удаляется лишь MRG-файл, но не исходные таблицы. </li>
<li>В них нельзя вставлять записи, поскольку программа MySQL не имеет возможности определить, в какую из исходных таблиц они должны быть помещены. </li>
<li>При работе с такими таблицами задействуется большее число файловых дескрипторов, так как программе приходится открывать каждую исходную таблицу в отдельности. Следовательно, извлечение данных из объединенных таблиц осуществляется медленнее, чем из таблиц других типов. Даже если дескрипторы индексных файлов совместно используются несколькими потоками, все равно приходится читать индексный файл каждой исходной таблицы. </li>
</ul>
<p><strong>Примеры:</strong></p>
<pre>CREATE TABLE t1 (a INT AUTO_INCREMENT PRIMARY KEY, message CHAR(20));
CREATE TABLE t2 (a INT AUTO_INCREMENT PRIMARY KEY, message CHAR(20));
INSERT INTO t1 (message) VALUES (&quot;Testing&quot;),(&quot;table&quot;),(&quot;t1&quot;);
INSERT INTO t2 (message) VALUES (&quot;Testing&quot;),(&quot;table&quot;),(&quot;t2&quot;);
CREATE TABLE total (a INT NOT NULL, message CHAR(20), KEY(a))
TYPE=MERGE UNION=(t1,t2) INSERT_METHOD=LAST;</pre>
<p>Не создавайте UNIQUE или PRIMARY KEY в таблице total если не уверенны что ключ будет уникальным.</p>
<pre>mysql&gt; SELECT * FROM total;
+---+---------+
| a | message |
+---+---------+
| 1 | Testing |
| 2 | table   |
| 3 | t1      |
| 1 | Testing |
| 2 | table   |
| 3 | t2      |
+---+---------+</pre>
<p><a name="bdb"></a></p>
<p><strong>BDB aka BERKELEYDB</strong></p>
<p><a href="http://webiteam.ru/go/?http://www.mysql.ru/docs/man/BDB.html">Подробней о BDB</a></p>
<p>Смесь MyISAM и InnoDB. С функциональной точки зрения таблицы BDB ведут себя аналогично таблицам MyISAM. Нет никаких ограничений на число столбцов или индексов. Во всём основном BDB как InnoDB: поддерживает тразакции, команда SELECT COUNT(*) FROM table_name выполняется медленно и тп. Однако BDB уступает в самовосстановлении данных InnoDB. Не смотря на все его большие возможности, BDB не получило распространение.</p>
<p><strong>!</strong> В ближайшем будущем (точнее с MySQL 5.1) поддержка этого движка прекратится. (<a href="http://webiteam.ru/go/?http://dev.mysql.com/doc/refman/5.1/en/news-5-1-12.html">источник</a>)</p>
<p><strong>Примечания:</strong></p>
<ul>
<li>Для таблиц BDB обязательно наличие первичного ключа. Если он не задан, MySQL самостоятельно создаст внутренний первичный ключ, охватывающий первые пять байтов каждой записи. </li>
<li>В BDB таблицы блокируются на уровне страниц. Страница — это совокупность последовательно расположенных записей таблицы. Страничные блокировки необходимы, когда MySQL сканирует таблицу, а также при удалении, вставке и обновлении записей. </li>
<li>Блокировки таблиц BDB могут приводить к возникновению тупиков, т.е. взаимоблокировок. В подобной ситуации одна или несколько транзакций отменяется. Это следует учитывать при написании приложений. Инструкция, которая приводит к автоматической отмене транзакции, возвращает сообщение об ошибке. Транзакции отменяются также в случае нехватки места в файловой системе. </li>
</ul>
<p><a name="ndb"></a></p>
<p><strong>NDB aka NDBCluster</strong></p>
<p><a href="http://webiteam.ru/go/?http://www.botik.ru/%7Erldp/mysql/cluster/cluster.htm">Подробней о NDB</a></p>
<p>Кластерный движок &#8211; данные автоматически разделяются и реплицируются по различным машинам, именуемым &#8211; дата узлы. Применяется для приложений, которые требуют высокой производительности с наивысшей степенью доступности. NDB хорошо работает на системах требующих высокой отдачи на операциях чтения. Для “тяжелых” приложений требующих активной записи в конкурирующей среде рассмотрите вариант с InnoDB.</p>
<p><a name="federated"></a></p>
<p><strong>FEDERATED</strong></p>
<p><a href="http://webiteam.ru/go/?http://dev.mysql.com/doc/refman/5.1/en/federated-description.html">Подробней о FEDERATED</a></p>
<p>Позволяет “монтировать” удалённую таблицу на локальном сервере. По сути, скопировать содержимое.</p>
<p><strong>Примечания:</strong></p>
<ul>
<li>Для создания FEDERATED таблицы необходимо существование удалённой таблицы. </li>
<li>Нельзя использовать ALTER TABLE. </li>
<li>Не поддерживает тразакции. </li>
<li>FEDERATED таблице не известно о каких-либо структурных изменениях, которые могут произойти в удалённой таблице. Можете схлопотать ошибки во время выполнения. </li>
</ul>
<p><strong>Примеры:</strong></p>
<p>Таблица на удалённом сервере.</p>
<pre>CREATE TABLE `City` (
  `ID` int(11) NOT NULL auto_increment,
  `Name` char(35) NOT NULL default '',
  `CountryCode` char(3) NOT NULL default '',
  `District` char(20) NOT NULL default '',
  `Population` int(11) NOT NULL default '0',
  PRIMARY KEY  (`ID`)
) ENGINE=MyISAM;</pre>
<p>Таблица на локальном сервере</p>
<pre>CREATE TABLE `City` (
  `ID` int(11) NOT NULL auto_increment,
  `Name` char(35) NOT NULL default '',
  `CountryCode` char(3) NOT NULL default '',
  `District` char(20) NOT NULL default '',
  `Population` int(11) NOT NULL default '0',
  PRIMARY KEY  (`ID`)
) ENGINE = FEDERATED
connection='mysql://user:pass@remote.com:3306/world/City';</pre>
<pre>SELECT * FROM City WHERE ID = 1;&#160;&#160; +----+-------+-------------+----------+------------+
| ID | Name  | CountryCode | District | Population |
+----+-------+-------------+----------+------------+
|  1 | Kabul | AFG         | Kabol    |    1780000 |
+----+-------+-------------+----------+------------+</pre>
<p><a name="blackhole"></a></p>
<p><strong>BLACKHOLE aka /dev/null engine</strong></p>
<p><a href="http://webiteam.ru/go/?http://dev.mysql.com/doc/refman/5.0/en/blackhole-storage-engine.html">Подробней о BLACKHOLE</a></p>
<p>BLACKHOLE действует как черная дыра. Она принимает данные, но не сохраняет их. Поиски всегда возвращают пустой результат.</p>
<p><strong>Примечания:</strong></p>
<ul>
<li>Поддерживает все виды индексов. </li>
<li>Не сохраняет данные, однако ведёт двоичный журнал (binary log) действий, если, конечно, он включен.<br />
    <br />Это может быть полезно в <a href="http://webiteam.ru/go/?http://dev.mysql.com/doc/refman/5.0/en/blackhole-storage-engine.html">качестве репликации или фильтра</a>.</p>
<p>Другие возможные использования BLACKHOLE:</p>
<p>- Проверка синтаксиса файла дампа.</p>
<p>- Измерение непроизводительных(?) затрат, сравнивая показатели BLACKHOLE с учетом и без учета двоичного логирования.</p>
<p>- Может использоваться для нахождения критических параметров эффективности комманд, не связанных с типом движка непосредственно. </li>
</ul>
<p><strong>Примеры:</strong></p>
<pre>mysql&gt; CREATE TABLE test(i INT, c CHAR(10)) ENGINE = BLACKHOLE;
Query OK, 0 rows affected (0.03 sec)&#160;&#160; mysql&gt; INSERT INTO test VALUES(1,'record one'),(2,'record two');
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0&#160;&#160; mysql&gt; SELECT * FROM test;
Empty set (0.00 sec)</pre>
<p><a name="falcon"></a></p>
<p><strong>Falcon</strong></p>
<p><a href="http://webiteam.ru/go/?http://sqlinfo.ru/articles/info/4.html">Подробней о Falcon</a></p>
<p>Появится в MySQL 5.2. В настоящее время (5.2.0-alpha), движок находится в состоянии alpha. Функциональный и быстрый движок.</p>
<ul>
<li>полная поддержка транзакций (full ACID) </li>
<li>поддержка ссылочной целостности таблиц </li>
<li>хранение всех типов данных MySQL </li>
<li>оптимизации для работы с большим количеством оперативной памяти </li>
<li>полная мультиверсионность, позволяющая уменьшить, а иногда полностью устранить необходимость в блокировках </li>
<li>сжатие данных </li>
<li>алгоритмы работы с диском </li>
</ul>
<p>Впоследствии вполне сможет стать хорошей заменой для InnoDB.</p>
<p><a name="maria"></a></p>
<p><strong>Maria</strong></p>
<p><a href="http://webiteam.ru/go/?http://forge.mysql.com/wiki/Maria_Preview">Подробней о Maria</a></p>
<p>Новый MySQL движок для хранения данных. Maria представляет собой расширенную версию хранилища MyISAM, с добавлением средств сохранения целостности данных после краха.</p>
<p><strong>Примечания:</strong></p>
<ul>
<li>В случае краха производится откат результатов выполнения текущей операции или возврат в состояние до команды LOCK TABLES. Реализация через ведение лога операций; </li>
<li>Возможность восстановления состояния из любой точки в логе операций, включая поддержку CREATE/DROP/RENAME/TRUNCATE. Может быть использовано для создания инкрементальных бэкапов, через периодическое копирование лог файла. </li>
<li>Поддержка всех форматов столбцов MyISAM, расширена новым форматом “rows-in-block”, использующим страничный механизм хранения данных, при котором данные в столбцах могут кэшироваться; </li>
<li>В будущем будет реализовано два режима: транзакционный и без отражения в логе транзакций, для не критичных данных. </li>
<li>В Maria размер страницы данных равен 8Кб (в MyISAM 1Кб), что позволяет достичь более высокой производительности для индексов по полям фиксированного размера, но медленнее в случае индексирования ключей переменной длинны. </li>
<li>Недостатки которые планируется устранить: неэффективная работа со столбцами, данные в которых занимают менее 25 байт; Maria 1.0 поддерживает один поток записи или много на чтение (в MyISAM &#8211; один на запись _и_ много на чтение (concurrent insert)); нет поддержки INSERT DELAYED. </li>
</ul>
<hr />Резюмируя, приведём наиболее подходящие движки хранения для различных задач: </p>
<ul>
<li>Поисковый движок &#8211; NDB кластер </li>
<li>Логирование веб статистики &#8211; Обычные файлы для логирования с оффлайновым обработчиком и записью всей статистики в InnoDB таблицы </li>
<li>Финансовые транзакции &#8211; InnoDB </li>
<li>Сессионные данные &#8211; MyISAM или NDB кластер </li>
<li>Локальные расчеты &#8211; HEAP </li>
<li>Словари &#8211; MyISAM </li>
</ul>
<p>Полезные ссылки:<br />
  <br />http://mysqlinfo.ru/anything_VidiTablicISposobIhHraneniya.htm</p>
<p>http://dev.mysql.com/tech-resources/articles/storage-engine.html</p>
<p>http://dev.mysql.com/doc</p>
<p>http://www.mysql.ru/docs/man/</p>
]]></content:encoded>
			<wfw:commentRss>http://iphp.com.ua/archives/444/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Проверка и оптимизация всех MySQL бд одной командой</title>
		<link>http://iphp.com.ua/archives/408</link>
		<comments>http://iphp.com.ua/archives/408#comments</comments>
		<pubDate>Wed, 17 Jun 2009 23:14:13 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Mysql]]></category>

		<guid isPermaLink="false">http://iphp.com.ua/?p=408</guid>
		<description><![CDATA[Есть хорошая MySQL утилита, называется mysqlcheck, с помощью этой утилиты можно выполнить сразу несколько полезных операций над всеми MySQL базами данных. Команду нужно запускать от суперпользователя root. Восстановление &#38; Оптимизация mysqlcheck -Aor Только ввостановление mysqlcheck -Ar Только оптимизация mysqlcheck -Ao Описание аргументов: -A &#8211; Проверить на ошибки все Mysql базы данных -r &#8211; Отремонтировать все Mysql [...]]]></description>
			<content:encoded><![CDATA[<div>
<p>Есть хорошая MySQL утилита, называется mysqlcheck, с помощью этой утилиты можно выполнить сразу несколько полезных операций над всеми MySQL базами данных. Команду нужно запускать от суперпользователя root.</p>
<h3>Восстановление &amp; Оптимизация</h3>
<div>
<div>
<pre style="font-family: monospace;">mysqlcheck -Aor</pre>
</div>
</div>
<h3>Только ввостановление</h3>
<div>
<div>
<pre style="font-family: monospace;">mysqlcheck -Ar</pre>
</div>
</div>
<h3>Только оптимизация</h3>
<div>
<div>
<pre style="font-family: monospace;">mysqlcheck -Ao</pre>
</div>
</div>
<p><strong><span style="color: #993300;">Описание аргументов</span></strong>:<br />
<strong>-A</strong> &#8211; Проверить на ошибки все Mysql базы данных<br />
<strong>-r</strong> &#8211; Отремонтировать все Mysql базы данных<br />
<strong>-o</strong> &#8211; Оптимизировать все Mysql базы данных</div>
]]></content:encoded>
			<wfw:commentRss>http://iphp.com.ua/archives/408/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MySQL: utf8_unicode_ci или utf8_general_ci?</title>
		<link>http://iphp.com.ua/archives/384</link>
		<comments>http://iphp.com.ua/archives/384#comments</comments>
		<pubDate>Sun, 22 Mar 2009 05:36:08 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Mysql]]></category>
		<category><![CDATA[utf-8]]></category>

		<guid isPermaLink="false">http://iphp.com.ua/?p=384</guid>
		<description><![CDATA[Какую таблицу из двух выбрать для своей базы данных в случае использования UTF? utf8_general_ci Убирает все акценты и приводит к верхнему регистру: ÀÁÅåāă = A, ü = U. Не очень точно отрабатывает при сортировках. Иногда полезно при поиске. Быстрее utf8_unicode_ci. Подходит для Русского. При использовании Белорусского и Украинского сортировка будет не верной. utf8_unicode_ci Довольно точно [...]]]></description>
			<content:encoded><![CDATA[<p>Какую таблицу из двух выбрать для своей базы данных в случае использования UTF?</p>
<p><strong>utf8_general_ci</strong><br />
Убирает все акценты и приводит к верхнему регистру: ÀÁÅåāă = A, ü = U.<br />
Не очень точно отрабатывает при сортировках. Иногда полезно при поиске. Быстрее utf8_unicode_ci.</p>
<p>Подходит для Русского. При использовании Белорусского и Украинского сортировка будет не верной.</p>
<p><strong>utf8_unicode_ci</strong><br />
Довольно точно при сортировке и поиске. Например, ß (немецкий эсцет) будет при сортировке располагаться рядом с ss, как ему и положено. Медленнее utf8_general_ci.</p>
<p>Замечательно подходит для Русского, Белорусского и Украинского.</p>
<p><strong>Итог</strong><br />
Если проект исключительно русскоязычный и скорость поиска и сравнения критична — можно остановится на utf8_general_ci. Если же есть планы по поддержке большего количества языков — лучше использовать utf8_unicode_ci.</p>
<p>Полные таблички <a href="http://www.collation-charts.org/mysql60/mysql604.utf8_unicode_ci.european.html">utf8_unicode_ci</a> и <a href="http://www.collation-charts.org/mysql60/mysql604.utf8_general_ci.european.html">utf8_general_ci</a> (там, кстати, <a href="http://www.collation-charts.org/mysql60/">и все остальные есть</a>).</p>
]]></content:encoded>
			<wfw:commentRss>http://iphp.com.ua/archives/384/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MySQL: How do you set up master-master replication in MySQL?</title>
		<link>http://iphp.com.ua/archives/378</link>
		<comments>http://iphp.com.ua/archives/378#comments</comments>
		<pubDate>Fri, 20 Mar 2009 04:53:19 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Mysql]]></category>

		<guid isPermaLink="false">http://iphp.com.ua/?p=378</guid>
		<description><![CDATA[Setting up master-master replication in MySQL is very similar to how we set up master/slave replication. There is obviously pros and cons about using master/master replication. But this is not a post which discuses advantages and disadvantages for using master/master replication. One of the differences between master/master set up and master/slave is that in master/master [...]]]></description>
			<content:encoded><![CDATA[<p>Setting up master-master replication in MySQL is very similar to how we set up master/slave replication. There is obviously pros and cons about using master/master replication. But this is not a post which discuses advantages and disadvantages for using master/master replication. One of the differences between master/master set up and master/slave is that in master/master set up, you have true redundancy. If one server dies, second server can take all the inserts/selects. In master/slave setup, if master dies, you will have to go through steps to make slave become the master. Master/master set up we are going to set up is essentially master/slave and slave/master. Meaning, if you had two servers, db0 and db1, your setup will be db0(master)/db1(slave) and also db0(slave)/db1(master). Here are some assumptions:</p>
<pre class="brush: cpp;">
Master1 server ip: 10.0.0.1
Master2 server ip: 10.0.0.2
Slave username: slaveuser
Slave pw: slavepw
Your data directory is: /usr/local/mysql/var/
</pre>
<p><span id="more-378"></span><br />
Let us go through the steps you must take on Master1 to enable it to act as master and slave by using following configuration which goes under [mysqld] section:</p>
<p># let&#8217;s make it so auto increment columns behave by having different increments on both servers</p>
<pre class="brush: cpp;">
auto_increment_increment=2
auto_increment_offset=1
# Replication Master Server
# binary logging is required for replication
log-bin=master1-bin
binlog-ignore-db=mysql
binlog-ignore-db=test
# required unique id between 1 and 2^32 - 1
server-id = 1
#following is the slave settings so this server can connect to master2
master-host = 10.0.0.2
master-user = slaveuser
master-password = slavepw
master-port = 3306
</pre>
<p>Following is the configuration which goes on master2 under [mysqld] section:</p>
<pre class="brush: cpp;">
# let's make it so auto increment columns behave by having different increments on both servers
auto_increment_increment=2
auto_increment_offset=2
# Replication Master Server
# binary logging is required for replication
log-bin=master2-bin
binlog-ignore-db=mysql
binlog-ignore-db=test
# required unique id between 1 and 2^32 - 1
server-id = 2
#following is the slave settings so this server can connect to master2
master-host = 10.0.0.1
master-user = slaveuser
master-password = slavepw
master-port = 3306
</pre>
<p>On master1 server, go to mysql> prompt and add the appropriate user:</p>
<pre class="brush: cpp;">
mysql&gt; grant replication slave on *.* to slaveuser@'10.0.0.2' identified by 'slavepw';
</pre>
<p>On master2 server do the same but allow right ip:</p>
<pre class="brush: cpp;">
mysql&gt; grant replication slave on *.* to slaveuser@'10.0.0.1' identified by 'slavepw';
</pre>
<p>Restart both of the master servers and check slave status:</p>
<pre class="brush: cpp;">
mysql&gt; show slave status;
</pre>
<p>That is all you have to do to set up the replication. Of course there are a lot more configuration options but this should get your replication going and you can tweak from here on.</p>
]]></content:encoded>
			<wfw:commentRss>http://iphp.com.ua/archives/378/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MySQL Performance Tuning Primer Script</title>
		<link>http://iphp.com.ua/archives/362</link>
		<comments>http://iphp.com.ua/archives/362#comments</comments>
		<pubDate>Thu, 05 Mar 2009 23:54:41 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Mysql]]></category>

		<guid isPermaLink="false">http://iphp.com.ua/?p=362</guid>
		<description><![CDATA[MySQL Performance Tuning Primer Script http://www.day32.com/MySQL/ http://www.day32.com/MySQL/tuning-primer.sh This script takes information from &#8220;SHOW STATUS LIKE&#8230;&#8221; and &#8220;SHOW VARIABLES LIKE&#8230;&#8221; to produce sane recomendations for tuning server variables. It is compatable with all versions of MySQL 3.23 and higher (including 5.1). Matthew Montgomery has created a script called MySQL performance tuning primer script that generates recomendations [...]]]></description>
			<content:encoded><![CDATA[<p>MySQL Performance Tuning Primer Script<br />
<a href="http://www.day32.com/MySQL/">http://www.day32.com/MySQL/</a><br />
<a href="http://www.day32.com/MySQL/tuning-primer.sh">http://www.day32.com/MySQL/tuning-primer.sh</a></p>
<p>This script takes information from &#8220;SHOW STATUS LIKE&#8230;&#8221; and &#8220;SHOW VARIABLES LIKE&#8230;&#8221;<br />
to produce sane recomendations for tuning server variables.<br />
It is compatable with all versions of MySQL 3.23 and higher (including 5.1).</p>
<p><span id="more-362"></span></p>
<p>Matthew Montgomery has created a script called MySQL performance tuning primer script that generates recomendations for tuning MySQL server variables like:<br />
<em>Slow Query Log<br />
Max Connections<br />
Worker Threads<br />
Key Buffer<br />
Query Cache<br />
Sort Buffer<br />
Joins<br />
Temp Tables<br />
Table (Open &amp; Definition) Cache<br />
Table Locking<br />
Table Scans (read_buffer)<br />
Innodb Status</em></p>
<p>It&#8217;s designed to work on Linux, Solaris, FreeBSD, MacOS and possible on other UNIX based systems using MySQL server version 3.23+ (including 5.1).</p>
<p>First, you need to grab a copy of this script:<br />
wget <a href="http://www.day32.com/MySQL/tuning-primer.sh">http://www.day32.com/MySQL/tuning-primer.sh</a></p>
<p>Before you continue, make sure your MySQL server has at least 48 hours uptime. It&#8217;s very important for the script in order to adjust variables corectly.</p>
<p>Running this script is like any other Unix shell script :<br />
<strong>sh ./tuning-primer.sh [mode]</strong></p>
<p><strong>Available Modes</strong>:<br />
all : perform all checks (default)<br />
prompt : prompt for login credintials and socket and execution mode<br />
mem, memory : run checks for tunable options which effect memory usage<br />
disk, file : run checks for options which effect i/o performance or file handle limits<br />
innodb : run InnoDB checks<br />
misc : run checks for that don&#8217;t categorise well Slow Queries, Binary logs, Used Connections and Worker Threads</p>
<p>Read carefully then adjust MySQL server configuration file (usually /etc/my.cnf) and restart MySQL server. It is a good practice to backup your server configuration file before. After few days run again the script and take note of what it says. Tweak again the server if necessary.</p>
<p>Remember, this optimization script only takes care of some server variables and it does not teach you how to use proper indexes and table definitions.</p>
]]></content:encoded>
			<wfw:commentRss>http://iphp.com.ua/archives/362/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MySQL performance tuning</title>
		<link>http://iphp.com.ua/archives/356</link>
		<comments>http://iphp.com.ua/archives/356#comments</comments>
		<pubDate>Thu, 05 Mar 2009 23:51:31 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Mysql]]></category>

		<guid isPermaLink="false">http://iphp.com.ua/?p=356</guid>
		<description><![CDATA[This document serves as a starting point for MySQL performance tuning. This document is a combination of research and experience. When I started this document, I utilized a great Google video [1] as a reference for the document structure and many bullet items. I would suggest watching this video. I then filled in a few [...]]]></description>
			<content:encoded><![CDATA[<p>This document serves as a starting point for MySQL performance tuning. This document is a combination of research and experience. When I started this document, I utilized a great Google video [1] as a reference for the document structure and many bullet items. I would suggest watching this video. I then filled in a few blanks, and combined a few other articles into this overview.</p>
<p>You may also want to check out this good article from MySQL on performance tuning.. Now onto the show..</p>
<p><strong>Benchmarking</strong></p>
<p>As with all improvement activities, it is better to start with a known problem area that is able to be defined, or an activity where improvement will provide maximum benefit (the 80/20 rule works everywhere). Nobody can really grasp an intangible goal like “we want to achieve excellence” [4].</p>
<p>The following are decent guidelines to start with [1]:<br />
» Target. You must have a target.<br />
» Establish a baseline.<br />
» Change only one thing at a time (if possible).<br />
» Record Everything, you will need it at some point.<br />
» Optionally disable query_cache, by setting query_cache_size = 0 for benchmarking.</p>
<p><span id="more-356"></span></p>
<p>In addition, the following benchmarking utilities may prove to be useful [5]:<br />
» Super Smack &#8211; <a href="http://vegan.net/tony/supersmack/">http://vegan.net/tony/supersmack/</a></p>
<p>Super Smack is a benchmarking, stress testing, and load generation tool for MySQL (and PostgreSQL). Super Smack was originally written by Sasha Pachev, and then hosted and maintained by Jeremy Zawodny.<br />
» SysBench &#8211; <a href="http://sysbench.sourceforge.net/">http://sysbench.sourceforge.net/</a></p>
<p>SysBench is a modular, cross-platform and multi-threaded benchmark tool for evaluating OS parameters that are important for a system running a database under intensive load.<br />
» mybench &#8211; <a href="http://jeremy.zawodny.com/mysql/mybench/">http://jeremy.zawodny.com/mysql/mybench/</a></p>
<p>mybench is a simple benchmarking framework for MySQL, written in Perl. It consists of a module (MyBench.pm) and an example script (bench_example) that you should customize to suit your needs.</p>
<p><strong>Profiling concepts</strong><br />
» Be familiar with the Explain command and access types in the explain command.<br />
» Use slow query log and mysqldumpslow command to help you determine where problems really exists.<br />
» Low hanging fruit. Tackle stuff that is getting you the best ROI on your time.<br />
» Use MyTOP by Jeremy Zawodny<br />
» Use tuning-primer.sh &#8211; <a href="http://www.day32.com/MySQL/">http://www.day32.com/MySQL/</a></p>
<p><strong>Sources of problem</strong><br />
» Poor indexes<br />
» Inefficient or Bloated schema design.<br />
» Bad coding practices, using joins is typically more efficient than subqueries.<br />
» Server variables<br />
» Tuning parameters help but are specific to scenario OLTP, OLAP, memory, system Architecture, storage engine. Meaning, no one size fits all solution really exists. However, you can tune based on some recommendations from other parameters.<br />
» Tweak one thing, rerun benchmarks..<br />
» Server and network bottlenecks</p>
<p><strong>Index Guidelines</strong><br />
» Poor or missing indexes are the fastest way to kill a system.<br />
» Look for covering index opportunities.<br />
» MySQL gets all info from index records, and uses it to complete the query, without having to go into the data records.<br />
» Ensure good selectivity on index fields.<br />
» Make sure you look at selectivity, or cardinality (unique values / total values in table). [ cardinality of 1 is the best case ].<br />
» Multi-column indexes, pay attention to order of fields.<br />
» As database grows ensure distribution is good. Know how your data changes over time. Re-analyze your data and distribution of indexes over time.<br />
» Remove redundant indexes for faster write performance.</p>
<p><strong>System tuning</strong><br />
» Be aware of global vs threaded parameters, key buffers size, global. Sort buffer size, per thread.<br />
» Make small changes (preferably single), retest.<br />
» System parameter tuning is often a quick, temporary solution to a larger issue.<br />
» Query_cache, off by default.<br />
» read intensive applications, turn query_cache on.<br />
» Key_buffer_size != innodb_buffer_pool_size<br />
» innodb_buffer_pool_size about 50-90% of total memory suggested typically.<br />
» Ensure you have analyzed and optimized your tables.</p>
<p>You may also be surprised at just what an effect optimizing a MyISAM table that has dynamic rows will do.. use the ‘optimize table’ SQL command</p>
<p><strong>Parameters</strong></p>
<p>table_cache</p>
<blockquote><p>Opening tables can be expensive. For example MyISAM tables mark MYI header to mark table as currently in use. You do not want this to happen so frequently and it is typically best to size your cache so it is large enough to keep most of your tables open. Use the tuning-primer.sh (<a href="http://www.day32.com/MySQL/">http://www.day32.com/MySQL/</a>) script to evaluate the current value.</p></blockquote>
<p>query_cache_size</p>
<blockquote><p>If your application is read intensive and you do not have application level caches this can be great help. Use the tuning-primer script to evaluate the size after you enable it. A good starting point may be 8M.</p>
<p>The query_cache_size will be aligned to the nearest 1024 byte block. The value reported may therefore be different from the value that you set.</p>
<p>If the query cache size is greater than 0, then query_cache_type variable influences how it works. This variable can be set to the following values:</p></blockquote>
<p>query_cache_type</p>
<blockquote><p>* A value of 0 or OFF prevents caching or retrieval of cached results.<br />
* A value of 1 or ON allows caching except of those statements that begin with SELECT SQL_NO_CACHE.<br />
* A value of 2 or DEMAND causes caching of only those statements that begin with SELECT SQL_CACHE.</p></blockquote>
<p>thread_cache</p>
<blockquote><p>mysql&gt; SHOW STATUS LIKE ‘Thread%’;<br />
mysq&gt; show status like ‘Connections’;Threads_created details the number of threads that have been created since the MySQL server started, and Connections is the total number of client connections to the MySQL server since startup. To work out the thread cache hit ratio, we use this calculation:</p>
<p>100 &#8211; ((Threads_created / Connections) * 100)<br />
100 &#8211; ((10 / 78298) * 100) = ~99.987 Thread cache hit ratio</p>
<p>The ideal situation is to get Threads_created as close as possible to thread_cache_size &#8211; no new connections having to wait for new thread allocation &#8211; staying as close to around a 99% hit ratio as you can.</p>
<p>mysql&gt; show status like ‘Select_full_join’;</p>
<p>The number of joins that do not use indexes. If this value is not 0, you should carefully check the indexes of your tables.<br />
ratio of disk tmp tables vrs in memory tmp tables (tmp_table_size)</p></blockquote>
<p>Handler_read_rnd</p>
<blockquote><p>mysql&gt; show status like ‘Handler_read_rnd%’;</p>
<p>The number of requests to read a row based on a fixed position. This value is high if you are doing a lot of queries that require sorting of the result. You probably have a lot of queries that require MySQL to scan entire tables or you have joins that don’t use keys properly.</p></blockquote>
<p>Handler_read_rnd_next</p>
<blockquote><p>The number of requests to read the next row in the data file. This value is high if you are doing a lot of table scans. Generally this suggests that your tables are not properly indexed or that your queries are not written to take advantage of the indexes you have.</p></blockquote>
<p>key_buffer_size</p>
<blockquote><p>Very important if you use MyISAM tables. key_buffer_size is important for MyISAM temporary tables performance to avoid OS writes, see this page for more detail. Again, evaluate the value using the tuning-primer.sh script.</p></blockquote>
<p>innodb_buffer_pool_size</p>
<blockquote><p>This is very important variable to tune if you’re using Innodb tables. Innodb tables are much more sensitive to buffer size compared to MyISAM.</p></blockquote>
<p>innodb_additional_mem_pool_size</p>
<blockquote><p>This one does not really affect performance too much, at least on OS with decent memory allocators. Still you might want to have it 20MB (sometimes larger) so you can see how much memory Innodb allocates for misc needs.</p></blockquote>
<p>innodb_log_file_size</p>
<blockquote><p>Very important for write intensive workloads especially for large data sets. Larger sizes offer better performance but increase recovery times so be careful. I normally use values 64M-512M depending on server size.</p></blockquote>
<p>innodb_log_buffer_size</p>
<blockquote><p>Default for this one is kind of OK for many workloads with medium write load and shorter transactions. If you have update activity spikes however or work with blobs a lot you might want to increase it. Do not set it too high however as it would be waste of memory &#8211; it is flushed every 1 sec anyway so you do not need space for more than 1 sec worth of updates. 8MB-16MB are typically enough. Smaller installations should use smaller values.</p></blockquote>
<p>innodb_flush_logs_at_trx_commit</p>
<blockquote><p>Default value of 1 will mean each update transaction commit (or each statement outside of transaction) will need to flush log to the disk which is rather expensive, especially if you do not have Battery backed up cache. Many applications, especially those moved from MyISAM tables are OK with value 2 which means do not flush log to the disk but only flush it to OS cache. The log is still flushed to the disk each second so you normally would not loose more than 1-2 sec worth of updates. Value 0 is a bit faster but is a bit less secure as you can lose transactions even in case MySQL Server crashes. Value 2 only cause data loss with full OS crash.</p></blockquote>
<p>OPTIMIZE TABLE should be used if you have deleted a large part of a table or if you have made many changes to a table with variable-length rows (tables that have VARCHAR, VARBINARY, BLOB, or TEXT columns).</p>
<p>References</p>
<p>1. Performance Tuning Best Practices for MySQL, Google TechTalks April 28, 2006. <a href="http://video.google.com/videoplay?docid=2524524540025172110">http://video.google.com/videoplay?docid=2524524540025172110</a></p>
<p>2. [HowTo] Optimising MYSQL, 01-20-2005, 03:59 AM. <a href="http://interworx.info/forums/showthread.php?p=2346">http://interworx.info/forums/showthread.php?p=2346</a></p>
<p>3. Kaiser’s 7-Step Benchmarking Process. <a href="http://www.kaiserassociates.com/about/bench_7step.html">http://www.kaiserassociates.com/about/bench_7step.html</a></p>
<p>4. How do you identify a suitable activity to benchmark? <a href="http://www.quality.co.uk/benchadv.htm">http://www.quality.co.uk/benchadv.htm</a></p>
<p>5. MySQL Benchmarking. <a href="http://mysqldatabaseadministration.blogspot.com/2006/08/mysql-benchmarking-1.html">http://mysqldatabaseadministration.blogspot.com/2006/08/mysql-benchmarking-1.html</a></p>
]]></content:encoded>
			<wfw:commentRss>http://iphp.com.ua/archives/356/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Продвинутый EXPLAIN в MySQL — SHOW PROFILES</title>
		<link>http://iphp.com.ua/archives/192</link>
		<comments>http://iphp.com.ua/archives/192#comments</comments>
		<pubDate>Fri, 05 Dec 2008 01:10:15 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Mysql]]></category>

		<guid isPermaLink="false">http://iphp.com.ua/?p=192</guid>
		<description><![CDATA[Не удивительно, что пока мало кто знает о такой замечательной штуке в MySQL, как профайлинг запросов. Т.к. существует она лишь в 5.0.37+ и 6.0 ветках, в 5.1 её нет. Как известно, EXPLAIN не всегда дает верную информацию о поведении того или иного запроса, т.к. он его не выполняет. Однако профайлинг работает иначе, записывая отрезки времени, [...]]]></description>
			<content:encoded><![CDATA[<p>Не удивительно, что пока мало кто знает о такой замечательной штуке в MySQL, как профайлинг запросов. Т.к. существует она лишь в 5.0.37+ и 6.0 ветках, в 5.1 её нет.<br />
Как известно, EXPLAIN не всегда дает верную информацию о поведении того или иного запроса, т.к. он его не выполняет. Однако профайлинг работает иначе, записывая отрезки времени, нагрузки на CPU, IO операций, MEMORY итп на всех этапах выполнения запроса.<br />
Смешно, профайлинг в MySQL доступен с 27 февраля 2007 года…</p>
<p><a title="Using the New MySQL Query Profiler" href="http://dev.mysql.com/tech-resources/articles/using-new-query-profiler.html" target="_blank">Подробности тут.</a></p>
]]></content:encoded>
			<wfw:commentRss>http://iphp.com.ua/archives/192/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Чистим бинарные логи в mysql</title>
		<link>http://iphp.com.ua/archives/164</link>
		<comments>http://iphp.com.ua/archives/164#comments</comments>
		<pubDate>Sun, 16 Nov 2008 03:11:04 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Mysql]]></category>

		<guid isPermaLink="false">http://iphp.com.ua/?p=164</guid>
		<description><![CDATA[можно воспользоваться простой командой в mysql: RESET MASTER которая аккуратно подчистит логи сделает ваши нервы мягкими и шелковистыми. Можно поставить в еженедельный cron.]]></description>
			<content:encoded><![CDATA[<p>можно воспользоваться простой командой в mysql:</p>
<pre class="brush: cpp;">
RESET MASTER
</pre>
<p>которая аккуратно подчистит логи сделает ваши нервы мягкими и шелковистыми.</p>
<p>Можно поставить в еженедельный cron.</p>
]]></content:encoded>
			<wfw:commentRss>http://iphp.com.ua/archives/164/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
