<?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://korchasa.ru/index.php/category/%d0%bc%d0%b5%d0%bb%d0%be%d1%87%d0%b8/feed/" rel="self" type="application/rss+xml" />
	<link>http://korchasa.ru</link>
	<description>Разработка, тестирование, запуск</description>
	<lastBuildDate>Mon, 24 May 2010 23:28:58 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.5</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Bulk update в MySQL</title>
		<link>http://korchasa.ru/index.php/2009/11/bulk-update-%d0%b2-mysql/</link>
		<comments>http://korchasa.ru/index.php/2009/11/bulk-update-%d0%b2-mysql/#comments</comments>
		<pubDate>Sun, 01 Nov 2009 02:28:57 +0000</pubDate>
		<dc:creator>korchasa</dc:creator>
				<category><![CDATA[Мелочи]]></category>
		<category><![CDATA[базы данных]]></category>
		<category><![CDATA[производительность]]></category>

		<guid isPermaLink="false">http://korchasa.ru/?p=251</guid>
		<description><![CDATA[Ревизия #2
В порыве пятничного отлынивания от работы, совместно с коллегой, родили нечто.
Нечто позволяет одним запросом обновлять неограниченное количество записей. Причем разные столбцы, на разные данные, в зависимости от уникального ключа.
Нечто имеет следующие недостатки:

требует уникального ключа
если строки с подходящим ключом нет, то она добавится
для построения требует знаний о типах полей таблицы
мускл на него ругается ворнингами
NULL таким [...]]]></description>
			<content:encoded><![CDATA[<p><span style="color: #c0c0c0;">Ревизия #2</span></p>
<p>В порыве пятничного отлынивания от работы, совместно с <a href="http://didyk.moikrug.ru/" target="_self">коллегой</a>, родили нечто.</p>
<p>Нечто позволяет одним запросом обновлять неограниченное количество записей. Причем разные столбцы, на разные данные, в зависимости от уникального ключа.</p>
<p>Нечто имеет следующие недостатки:</p>
<ul>
<li>требует уникального ключа</li>
<li>если строки с подходящим ключом нет, то она добавится</li>
<li>для построения требует знаний о типах полей таблицы</li>
<li>мускл на него ругается ворнингами</li>
<li>NULL таким образом вставить невозможно</li>
</ul>
<p><span id="more-251"></span></p>
<p>SQL:</p>
<pre><code class="SQL">CREATE TABLE  `bulk_update` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `int` int(11) NOT NULL DEFAULT '7',
  `str` varchar(5) NOT NULL DEFAULT 'def',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

INSERT INTO `bulk_update` (`id`, `int`, `str`)
  VALUES (1, 1, 'a'), (2, 2, 'b'), (3, 3, 'c');

INSERT INTO `bulk_update` (`id`, `int`, `str`)
  VALUES (1, 22, null), (2, null, 'bb')
  ON DUPLICATE KEY UPDATE
    `int` = IFNULL(NULLIF(VALUES(`int`), 0), `int`),
    `str` = IFNULL(NULLIF(VALUES(`str`), ''), `str`);

SELECT * FROM bulk_update;
+----+-----+-----+
| id |   int | str |
+----+-----+-----+
|  1 |   22 | a   |
|  2 |   2  | bb  |
|  3 |   3  | c   |
+----+-----+-----+</code></pre>
<p>Тесты скорости показали следующие результаты:</p>
<table border="0">
<tbody>
<tr>
<th>Обновляемых записей</th>
<th>По одному (qps)</th>
<th>Кучкой (qps)</th>
</tr>
<tr>
<td>10</td>
<td>2296</td>
<td>3620</td>
</tr>
<tr>
<td>100</td>
<td>3480</td>
<td>11097</td>
</tr>
<tr>
<td>1000</td>
<td>3959</td>
<td>18804</td>
</tr>
</tbody>
</table>
<p>Во время теста параллельно пускались три скрипта, делающие разнообразные селекты к таблице.</p>
<p>Тест, как всегда, <a href="http://korchasa.googlepages.com/multiple_updates.php">прилагается</a>.</p>
<p>В общем штука получилась интересная, но какая-то костылеподобная.</p>
<p>UPD: Теперь работает и для столбцов с NOT NULL и без оного.</p>
]]></content:encoded>
			<wfw:commentRss>http://korchasa.ru/index.php/2009/11/bulk-update-%d0%b2-mysql/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
