<?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/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>domas mituzas</title>
	<atom:link href="http://dom.as/feed/" rel="self" type="application/rss+xml" />
	<link>http://dom.as</link>
	<description></description>
	<lastBuildDate>Mon, 22 Apr 2013 14:47:27 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='dom.as' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://0.gravatar.com/blavatar/6e344c6e0cd7462eb056f8b98eb2cbcd?s=96&#038;d=http%3A%2F%2Fs2.wp.com%2Fi%2Fbuttonw-com.png</url>
		<title>domas mituzas</title>
		<link>http://dom.as</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://dom.as/osd.xml" title="domas mituzas" />
	<atom:link rel='hub' href='http://dom.as/?pushpress=hub'/>
		<item>
		<title>Hash of shame</title>
		<link>http://dom.as/2013/04/22/hash-of-shame/</link>
		<comments>http://dom.as/2013/04/22/hash-of-shame/#comments</comments>
		<pubDate>Mon, 22 Apr 2013 00:17:05 +0000</pubDate>
		<dc:creator>Domas Mituzas</dc:creator>
				<category><![CDATA[mysql]]></category>

		<guid isPermaLink="false">http://dom.as/?p=1664</guid>
		<description><![CDATA[I may retract this post, I may have been way too incorrect here, not sure yet. Hash maps were invented sixty years ago, apparently. MySQL reinvented them. Original idea was too fancy and too good, I guess. It allowed very &#8230; <a href="http://dom.as/2013/04/22/hash-of-shame/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=dom.as&#038;blog=190075&#038;post=1664&#038;subd=domasmituzas&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p><i>I may retract this post, I may have been way too incorrect here, not sure yet.</i></p>
<p><a href="http://en.wikipedia.org/wiki/Hash_table">Hash maps</a> were invented sixty years ago, apparently. MySQL reinvented them.</p>
<p>Original idea was too fancy and too good, I guess. It allowed very cheap access to data, if you knew a key, and it achieved that by having a hashing function, which is used to pick a slot, then going directly to that slot. It is used in your computer all the time. ALL THE TIME.</p>
<p>They are so fast and useful, that they are always treated as building blocks. There have been various iterations later, to support concurrency, hashing functions evolved, etc, but the premise was the same.</p>
<p>If we look at the dictionary, it is obvious that &#8220;hash&#8221; is:</p>
<blockquote><p><i>a mixture of jumbled incongruous things; a mess.</i></p></blockquote>
<p>Yes, MySQL, the whole concept is to have as messy as possible data distribution, so that there are no natural collisions. Because if there is a collision, then there is contention over the list sitting in a hash bucket, or a worker, ready to do the work, or some fancy shmancy high performance concurrent workflow.</p>
<p>But no, MySQL wants order, it does not want to have the hashing function messy, it will redefine the term and sixty years of industry practice. For example, given these inputs, it will calculate hash for them as close as possible (tested with <code>(gdb) print my_calc_hash(&amp;mapping_db_to_worker, "db100002", 8)</code>):</p>
<ul>
<li>db100002 - 0xace3c8bc</li>
<li>db100003 - 0xace3c8f3</li>
<li>db100004 - 0xace3c836</li>
</ul>
<p>It will decide, that for each change in byte it will change only one byte in the hashing function <s>(pretty much every other hashing function like CRC32, Adler, Fletcher, HeikkiFolding, MD5, SHA1 will have <strong>all</strong> bytes different )</s> (this was debunked by a commenter, I was completely wrong here).</p>
<p>Then MySQL will decide that resulting hash is still messy and will not look at different bytes, just map everything to exactly same slot.</p>
<p>Mark saw this on other place, his performance of 5.6 was not too good, and he investigated hash problems in <a href='http://bugs.mysql.com/bug.php?id=66473'>this bug report</a>. MySQL developers looked at it and filed a separate bug which still does not catch the whole essence &#8211; <a href="http://bugs.mysql.com/bug.php?id=68487">MDL lock is blah blah blah</a>. </p>
<p>No, MySQL, it is not related to any use case of your hashing implementation. This is a bug in your critical data structure code. You should be just happy that it is not used too much, only in two places, one that is on Mark&#8217;s radar, but other is in new flashy beautiful feature of MySQL 5.6 &#8211; Multi Threaded Slave. Or should I call it, Not-So-Multi-Threaded Slave. NSMTS.</p>
<p>P.S. On the upside, I can skip talking about MTS in my &#8220;high performance replication&#8221; talk at MySQL Conference next week \o/</p>
<p><b>Update:</b> It may be that MTS is not working because of other issues, checksum function is getting empty inputs. </p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/domasmituzas.wordpress.com/1664/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/domasmituzas.wordpress.com/1664/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=dom.as&#038;blog=190075&#038;post=1664&#038;subd=domasmituzas&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://dom.as/2013/04/22/hash-of-shame/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/c660a6eb3a4005232acb111303bef12c?s=96&#38;d=http%3A%2F%2Fs0.wp.com%2Fi%2Fmu.gif&#38;r=G" medium="image">
			<media:title type="html">domasmituzas</media:title>
		</media:content>
	</item>
		<item>
		<title>MySQL 5.6 @ Facebook development tree</title>
		<link>http://dom.as/2013/04/20/mysql-5-6-facebook-development-tree/</link>
		<comments>http://dom.as/2013/04/20/mysql-5-6-facebook-development-tree/#comments</comments>
		<pubDate>Sat, 20 Apr 2013 00:58:03 +0000</pubDate>
		<dc:creator>Domas Mituzas</dc:creator>
				<category><![CDATA[mysql]]></category>
		<category><![CDATA[5.6]]></category>

		<guid isPermaLink="false">http://dom.as/?p=1655</guid>
		<description><![CDATA[MySQL 5.6 @ Facebook development tree Steaphan is a hero (well, everyone else on database engineering team are too) and he is driving efforts to publish MySQL 5.6 changes we&#8217;re making to the open. Now they&#8217;re on the github (yet &#8230; <a href="http://dom.as/2013/04/20/mysql-5-6-facebook-development-tree/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=dom.as&#038;blog=190075&#038;post=1655&#038;subd=domasmituzas&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p><a title="MySQL 5.6 @ Facebook development tree" href="https://github.com/facebook/mysql-5.6">MySQL 5.6 @ Facebook development tree</a></p>
<p><a href="https://www.facebook.com/SteaphanGreene">Steaphan</a> is a hero (well, everyone else on database engineering team are too) and he is driving efforts to publish MySQL 5.6 changes we&#8217;re making to the open. Now they&#8217;re on the github (yet not in production, we&#8217;re in active testing though with our workloads).</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/domasmituzas.wordpress.com/1655/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/domasmituzas.wordpress.com/1655/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=dom.as&#038;blog=190075&#038;post=1655&#038;subd=domasmituzas&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://dom.as/2013/04/20/mysql-5-6-facebook-development-tree/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/c660a6eb3a4005232acb111303bef12c?s=96&#38;d=http%3A%2F%2Fs0.wp.com%2Fi%2Fmu.gif&#38;r=G" medium="image">
			<media:title type="html">domasmituzas</media:title>
		</media:content>
	</item>
		<item>
		<title>On performance schemas</title>
		<link>http://dom.as/2013/04/17/on-performance-schemas/</link>
		<comments>http://dom.as/2013/04/17/on-performance-schemas/#comments</comments>
		<pubDate>Wed, 17 Apr 2013 00:01:21 +0000</pubDate>
		<dc:creator>Domas Mituzas</dc:creator>
				<category><![CDATA[mysql]]></category>

		<guid isPermaLink="false">http://dom.as/?p=1652</guid>
		<description><![CDATA[You should probably read Marc Alff&#8217;s post about configuring Performance Schema in MySQL 5.6. We wrote another guide, how to start using user/table/index statistics first introduced in Google patch, now part of various MySQL branches and forks: Start MySQL<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=dom.as&#038;blog=190075&#038;post=1652&#038;subd=domasmituzas&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>You should probably read Marc Alff&#8217;s post about <a href="http://marcalff.blogspot.com/2013/04/on-configuring-performance-schema.html">configuring Performance Schema</a> in MySQL 5.6.</p>
<p>We wrote another guide, how to start using user/table/index statistics first introduced in Google patch, now part of various MySQL branches and forks:</p>
<ol>
<li>Start MySQL</li>
</ol>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/domasmituzas.wordpress.com/1652/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/domasmituzas.wordpress.com/1652/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=dom.as&#038;blog=190075&#038;post=1652&#038;subd=domasmituzas&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://dom.as/2013/04/17/on-performance-schemas/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/c660a6eb3a4005232acb111303bef12c?s=96&#38;d=http%3A%2F%2Fs0.wp.com%2Fi%2Fmu.gif&#38;r=G" medium="image">
			<media:title type="html">domasmituzas</media:title>
		</media:content>
	</item>
		<item>
		<title>The saddest bug of them all (SQL is dead?)</title>
		<link>http://dom.as/2013/04/16/the-saddest-bug-of-them-all-sql-is-dead/</link>
		<comments>http://dom.as/2013/04/16/the-saddest-bug-of-them-all-sql-is-dead/#comments</comments>
		<pubDate>Tue, 16 Apr 2013 23:52:22 +0000</pubDate>
		<dc:creator>Domas Mituzas</dc:creator>
				<category><![CDATA[mysql]]></category>
		<category><![CDATA[optimizer]]></category>

		<guid isPermaLink="false">http://dom.as/?p=1644</guid>
		<description><![CDATA[From time to time I will observe servers wasting lots of CPU when doing batch row operations. In perf top it will look like this: 8.24% mysqld [.] Arg_comparator::compare_int_unsigned() 7.17% mysqld [.] Item_cond_and::val_int() 4.37% mysqld [.] Item_field::val_int() 4.37% mysqld [.] &#8230; <a href="http://dom.as/2013/04/16/the-saddest-bug-of-them-all-sql-is-dead/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=dom.as&#038;blog=190075&#038;post=1644&#038;subd=domasmituzas&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>From time to time I will observe servers wasting lots of CPU when doing batch row operations. In <code>perf top</code> it will look like this:</p>
<pre>8.24% mysqld [.] Arg_comparator::compare_int_unsigned()
7.17% mysqld [.] Item_cond_and::val_int()
4.37% mysqld [.] Item_field::val_int()
4.37% mysqld [.] Item_cond_or::val_int()
2.90% mysqld [.] MYSQLparse(void*)
2.64% mysqld [.] Item::val_bool()</pre>
<p>Essentially if you construct queries like <code>(a=1 AND b=2) OR (a=3 AND b=4) ...</code>, at large enough batch size evaluating the WHERE will become far more expensive than anything else (yes, more expensive than decompressing rows or doing all the InnoDB magic and what not).</p>
<p>MySQL has awesome syntax that makes certain batch lookups much faster: WHERE a IN (1,2,3). It constructs a tree that then each row can be compared against and one does not have to iterate through lists of predicates to check whether the row returned by batch index lookups needs to be filtered away. One would think that the composite syntax that server has <code>(WHERE (a,b) IN ((1,2),(3,4)))</code> may help here.</p>
<p>Unfortunately, if you run a query using this syntax, a full table scan will be done, even if there&#8217;s a great index for that &#8211; even the syntax exists, none of sane ways to execute apply. Of course, there have to be bugs about that:</p>
<p><a href="http://bugs.mysql.com/bug.php?id=16247">Compound (cola,colb) IN ((x,y)) statements do not use indexes</a>. (filed by yours truly).</p>
<p>Well, it was closed by optimization lead (now at Maria), who decided, that this bug is a duplicate of another problem, (a,b,c)=(A,B,C). I probably should&#8217;ve contested there, but there might have been other people who&#8217;d do that? Sure there were, in 2007 Mark filed another bug:</p>
<p><a href="http://bugs.mysql.com/bug.php?id=31188">Optimizer does not do index range scans using predicates in IN lists</a></p>
<p>If one would look more closely, there&#8217;s this small exchange in 2010:</p>
<pre>[7 Jan 2010 21:35] Mark Callaghan
This is the same as http://bugs.mysql.com/bug.php?id=16247, 
but the author of this feature request is much more convincing.
[7 Jan 2010 21:36] Domas Mituzas
hehe.</pre>
<p>He wrote a <a href="https://www.facebook.com/note.php?note_id=243134480932">Facebook note</a> back then too.</p>
<p>Apparently Mark&#8217;s bug became the master bug for this problem, even if it arrived bit later, but, I can&#8217;t argue, he is far more convincing :-)<br />
There&#8217;s a bit of odd banter there, Harrison (ohi!) points out that it is documented (albeit incorrectly, Sergey Petrunia &#8211; ohi &#8211; notices) in the manual. No, it isn&#8217;t this exact issue that is noted in the manual.<br />
Duplicates are pouring in:<br />
<a href="http://bugs.mysql.com/bug.php?id=35819">Multi column IN does not use index</a>, says Peter Zaitsev (ohi!) in 2008<br />
<a href="http://bugs.mysql.com/bug.php?id=50571">MySQL not using an index when using tuples in IN clause</a>, says Shlomo (ohi!) in 2010<br />
There are few more.</p>
<p>Sinisa (ohi!) pronounces:</p>
<blockquote><p>In my humble opinion, this is still not a bug, but feature request. This feature request, however, should be very high on TODO list, as it would make a feature that is sorely missing, particularly since tuple equality expressions have been already optimized.</p></blockquote>
<p>Fast forward into 2013, even in 5.6 we still have to use expressions with exponential cost, <code>(a,b) IN ((</code> is causing full table scans and people are switching to NoSQLs, NewSQLs and OtherSQLs, because there&#8217;s no way to efficiently express batch predicates in MySQL (besides other reasons). Back in the day MySQL was ahead of everyone else with ease of use for simple expressions, but there have been nearly no changes since back in the day to make developer lives easier. Did you know that it may actually be faster to create a temporary table with all the values, then join against it, than actually to use any of existing SQL methods?</p>
<p>Where is MySQL innovation nowadays? In this exact case I guess you&#8217;re supposed to be memcached API (forget authorization, common interfaces, transactions and what not), solving this in SQL is too complicated.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/domasmituzas.wordpress.com/1644/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/domasmituzas.wordpress.com/1644/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=dom.as&#038;blog=190075&#038;post=1644&#038;subd=domasmituzas&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://dom.as/2013/04/16/the-saddest-bug-of-them-all-sql-is-dead/feed/</wfw:commentRss>
		<slash:comments>15</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/c660a6eb3a4005232acb111303bef12c?s=96&#38;d=http%3A%2F%2Fs0.wp.com%2Fi%2Fmu.gif&#38;r=G" medium="image">
			<media:title type="html">domasmituzas</media:title>
		</media:content>
	</item>
		<item>
		<title>on wikipedia and mariadb</title>
		<link>http://dom.as/2012/12/18/on-wikipedia-and-mariadb/</link>
		<comments>http://dom.as/2012/12/18/on-wikipedia-and-mariadb/#comments</comments>
		<pubDate>Tue, 18 Dec 2012 17:46:06 +0000</pubDate>
		<dc:creator>Domas Mituzas</dc:creator>
				<category><![CDATA[mysql]]></category>
		<category><![CDATA[wikitech]]></category>

		<guid isPermaLink="false">http://dom.as/?p=1635</guid>
		<description><![CDATA[There&#8217;s some media coverage about Wikipedia switching to MariaDB, I just wanted to point out that performance figures cited are somewhat incorrect and don&#8217;t attribute gains to correct authors. Proper performance evaluation should include not just MariaDB 5.5 but Oracle&#8217;s &#8230; <a href="http://dom.as/2012/12/18/on-wikipedia-and-mariadb/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=dom.as&#038;blog=190075&#038;post=1635&#038;subd=domasmituzas&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>There&#8217;s <a href="http://www.zdnet.com/wikipedia-moving-from-mysql-to-mariadb-7000008912/">some media coverage</a> about <a href="http://lists.wikimedia.org/pipermail/wikitech-l/2012-December/064994.html">Wikipedia switching to MariaDB</a>, I just wanted to point out that performance figures cited are somewhat incorrect and don&#8217;t attribute gains to correct authors.</p>
<p>Proper performance evaluation should include not just MariaDB 5.5 but Oracle&#8217;s MySQL 5.5 version too, because thats where most of performance development happened (multiple buffer pools, rollback segments, change buffering et al).</p>
<p>5.5 is faster for some workloads, 5.1-fb can outperform 5.5 in other workloads (ones with lots of IO), it is good to know that there&#8217;s beneficial impact from upgrading (though I&#8217;d wait for 5.6), but it is important to state that it is an effort from Oracle as well, not just MariaDB developers.</p>
<p>P.S. As far as I understand, decision to switch is political, and with 5.6 momentum right now it may not be the best one, 5.6 is going to rock :-)</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/domasmituzas.wordpress.com/1635/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/domasmituzas.wordpress.com/1635/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=dom.as&#038;blog=190075&#038;post=1635&#038;subd=domasmituzas&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://dom.as/2012/12/18/on-wikipedia-and-mariadb/feed/</wfw:commentRss>
		<slash:comments>20</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/c660a6eb3a4005232acb111303bef12c?s=96&#38;d=http%3A%2F%2Fs0.wp.com%2Fi%2Fmu.gif&#38;r=G" medium="image">
			<media:title type="html">domasmituzas</media:title>
		</media:content>
	</item>
		<item>
		<title>on seconds_behind_master sleuthing</title>
		<link>http://dom.as/2012/09/21/on-seconds_behind_master-sleuthing/</link>
		<comments>http://dom.as/2012/09/21/on-seconds_behind_master-sleuthing/#comments</comments>
		<pubDate>Fri, 21 Sep 2012 23:45:58 +0000</pubDate>
		<dc:creator>Domas Mituzas</dc:creator>
				<category><![CDATA[mysql]]></category>

		<guid isPermaLink="false">http://dom.as/?p=1579</guid>
		<description><![CDATA[With large enough infrastructure it gets a bit more and more complicated to detect whether an incident or a problem is real systems problem or a monitoring glitch. This is a story of one such investigation. With a sufficiently large &#8230; <a href="http://dom.as/2012/09/21/on-seconds_behind_master-sleuthing/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=dom.as&#038;blog=190075&#038;post=1579&#038;subd=domasmituzas&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>With large enough infrastructure it gets a bit more and more complicated to detect whether an incident or a problem is real systems problem or a monitoring glitch. This is a story of one such investigation.</p>
<p>With a sufficiently large set of machines, there&#8217;re multiple graphs/sets of data to look at to understand what is going on:</p>
<ul>
<li>Group average &#8211; the easiest to look at for long term trends or system-wide problems</li>
<li>Top-N chart &#8211; our favorite for dive-ins, looking only at top offender lines (quite often part of the offender lines end up matching tier baseline)</li>
<li>Percentiles chart &#8211; knowing best performers, medians, 99% or 99.9% behavior is incredibly useful to understand medium-term dynamics and can give lots of insight where to look for problems. Is way more complicated to collect though.</li>
</ul>
<p>Another very important property of data one looks at is collection frequency &#8211; though thousands of servers aggregated together into single chart will already provide smoothened view of what is going on, individual charts will always look way choppier, without any intermediate dots to show progression of metric. You will see that there&#8217;re lots of threads running, but it won&#8217;t explain how that built up &#8211; only longer term incidents averaged out over lots of machines will show that.</p>
<p>In our deployment, replication lag is very important metric of how well we&#8217;re doing &#8211; with faker in production it already means that machine (or machines) are in trouble, and usually that is either hardware trouble, or way too much workload from applications, and both problems need immediate actions.</p>
<p>It is even more interesting on pure flash machines &#8211; those are not supposed to lag at all, once they&#8217;re in production &#8211; unless something is really really wrong.</p>
<p>This is why I once I saw a group of flash-only machines reporting higher replication lag values, jumped to investigate. There could&#8217;ve been various reasons &#8211; e.g. long transactions increasing cost of write queries, and what not.</p>
<p>Looking at charts I saw that there&#8217;s some lag, that some machines spike to 1000+s lag values, and percentiles showed that only small amount of machines were hitting this. It was relatively interesting, that each of those machines would hit a lag spike and then behave normally afterwards again.</p>
<p>I tried to find a machine that was in high lag condition and check what is going on there. Listing machines with their lag values was relatively easy:</p>
<pre>pmysql "SHOW SLAVE STATUS" | cut -f 1,34 | sort -nr -k 2,2 | head</pre>
<p>What was odd, that each time I was running this, machines on the list were different. First thought in my mind was that some old transactions with old timestamps were showing up (that is usually a reason for odd Seconds_behind_master spikes), figuring out statements would&#8217;ve been piece of cake:</p>
<pre>pmysql "SELECT * FROM information_schema.processlist where 
    user='system user' and info is not null and time&gt;100"</pre>
<p>Unfortunately, even though &#8220;SHOW SLAVE STATUS&#8221; was always showing me machines with 100s+ lag, none of that came via processlist query.</p>
<p>The aha! moment came when I tried to look at binlog/relaylog values &#8211; every &#8220;lagging&#8221; machine was at one of two relay log positions &#8211; 298 or 308. So, I looked at timestamps of events in relay log positions:</p>
<pre>#120921 13:21:42 server id 22222  end_log_pos 106 
    Start: binlog v 4, server v 5.1.53-log created 120921 13:21:42
#120921 13:21:42 server id 4294967295  end_log_pos 151 
    Rotate to binary-logs.017880  pos: 81259576
#691231 16:00:00 server id 11111  end_log_pos 0 
    Rotate to binary-logs.017880  pos: 81259576
#120921 13:17:39 server id 11111  end_log_pos 0 
    Start: binlog v 4, server v 5.1.53-log created 120921 13:17:39
#120921 13:21:42 server id 11111  end_log_pos 81259647 
    Query ...</pre>
<p>First record was relay log header (format description event), next two were rotation events with bogus (-1 and 0) values for timestamp and server_id &#8211; and binary log positions. Then we suddenly have master&#8217;s binary log header which is taken from the beginning of the binary log, with the binlog creation timestamp in it, then we have a query from the middle of binary log, with proper timestamp on it.</p>
<p>For the whole duration of SQL thread acting on the first query server thought it was executing events from 13:17:29 and not 13:21:42. Seconds_behind_master was telling that the gross offense of 253s replication lag was being committed, and database users were suffering.</p>
<p>Fortunately, it was just a MySQL status variable glitch and data integrity was completely fine, but this reminds us how important is quality monitoring and internal metrics for large environments &#8211; and how easy it is to draw wrong conclusions otherwise.</p>
<p>P.S. Of course, <a href="http://bugs.mysql.com/bug.php?id=66921">a bug</a> was filed :)</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/domasmituzas.wordpress.com/1579/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/domasmituzas.wordpress.com/1579/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=dom.as&#038;blog=190075&#038;post=1579&#038;subd=domasmituzas&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://dom.as/2012/09/21/on-seconds_behind_master-sleuthing/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/c660a6eb3a4005232acb111303bef12c?s=96&#38;d=http%3A%2F%2Fs0.wp.com%2Fi%2Fmu.gif&#38;r=G" medium="image">
			<media:title type="html">domasmituzas</media:title>
		</media:content>
	</item>
		<item>
		<title>replication prefetching revisited</title>
		<link>http://dom.as/2012/09/04/faker/</link>
		<comments>http://dom.as/2012/09/04/faker/#comments</comments>
		<pubDate>Tue, 04 Sep 2012 10:59:27 +0000</pubDate>
		<dc:creator>Domas Mituzas</dc:creator>
				<category><![CDATA[facebook]]></category>
		<category><![CDATA[mysql]]></category>

		<guid isPermaLink="false">http://dom.as/?p=1576</guid>
		<description><![CDATA[Been a while since I wrote about replication work we did. Fake changes based approach was huge success, and now our prefetching has lots of coverage, where standard SELECTs cannot reach. We&#8217;re running our systems at replication pressure, where not &#8230; <a href="http://dom.as/2012/09/04/faker/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=dom.as&#038;blog=190075&#038;post=1576&#038;subd=domasmituzas&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>Been a while since I wrote about <a href="http://dom.as/2011/12/03/replication-prefetching/">replication work</a> we did. Fake changes based approach was huge success, and now our prefetching has lots of coverage, where standard SELECTs cannot reach. We&#8217;re running our systems at replication pressure, where not running faker immediately results in replication lag. On busier machines Python implementation started using quite some CPU and ended up occasionally hitting <a href="http://wiki.python.org/moin/GlobalInterpreterLock">GIL</a> issues.</p>
<p>So, <a href="http://bazaar.launchpad.net/~mysqlatfacebook/mysqlatfacebook/tools/files/head:/faker/">here&#8217;s the straightforward rewrite</a> of fake changes replication prefetcher, faker. It can run 100k statements a sec, if needed. To get it, you can run:</p>
<pre>bzr co lp:mysqlatfacebook/tools; cd faker</pre>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/domasmituzas.wordpress.com/1576/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/domasmituzas.wordpress.com/1576/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=dom.as&#038;blog=190075&#038;post=1576&#038;subd=domasmituzas&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://dom.as/2012/09/04/faker/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/c660a6eb3a4005232acb111303bef12c?s=96&#38;d=http%3A%2F%2Fs0.wp.com%2Fi%2Fmu.gif&#38;r=G" medium="image">
			<media:title type="html">domasmituzas</media:title>
		</media:content>
	</item>
		<item>
		<title>MySQL is bazillion times faster than MemSQL</title>
		<link>http://dom.as/2012/06/26/memsql-rage/</link>
		<comments>http://dom.as/2012/06/26/memsql-rage/#comments</comments>
		<pubDate>Tue, 26 Jun 2012 13:04:13 +0000</pubDate>
		<dc:creator>Domas Mituzas</dc:creator>
				<category><![CDATA[mysql]]></category>

		<guid isPermaLink="false">http://dom.as/?p=1568</guid>
		<description><![CDATA[I don&#8217;t like stupid benchmarks, as they waste my time. I don&#8217;t like stupid marketing, as it wastes my time too. Sometimes I succumb to those things, and now in return I want to waste your time a bit. So, &#8230; <a href="http://dom.as/2012/06/26/memsql-rage/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=dom.as&#038;blog=190075&#038;post=1568&#038;subd=domasmituzas&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>I don&#8217;t like stupid benchmarks, as they waste my time. I don&#8217;t like stupid marketing, as it wastes my time too. Sometimes I succumb to those things, and now in return I want to waste your time a bit.</p>
<p>So, this MemSQL thing, written by some smart guys has been making rounds in press and technical community. Centerpiece of all the communication was:</p>
<p style="padding-left:30px;"><em>&#8220;MemSQL, the database they have developed over the past year, is thirty times faster than conventional disk-based databases&#8221;</em></p>
<p>Though I usually understand that those claims don&#8217;t make any sense, I was wondering what did they do wrong. Apparently they got MySQL with default settings running and MemSQL with default settings running, then compared the two. They say it is a good benchmark, as it compares what users get just by installing standard packages.</p>
<p>That is already cheating, because systems are forced to work in completely different profiles. For example, memory used for data buffering, is essentially unbound on MemSQL, yet InnoDB has it limited to 128MB on 5.5 (and that is 16x the default setting used on 5.1).</p>
<p>For write benchmarks MemSQL will write out snapshot at 2G log mark, InnoDB is configured with 10MB transaction log, so it will start checkpointing pretty much immediately.</p>
<p>Still, for any benchmark, most important thing is durability. See, MemSQL claims that they support ACID, and durability is core part of that. MySQL&#8217;s InnoDB (I don&#8217;t assume other engines are usable) is durable by default, making sure that if it says that transaction returned &#8216;ok&#8217;, it is on disk and will be there after a crash. MemSQL is also &#8220;durable by default&#8221;, which means that it will write a transaction log, but it doesn&#8217;t really mean that it will hit the disk.</p>
<p>See, MemSQL also has &#8220;transaction-buffer&#8221; setting, which, in default &#8220;full durability mode&#8221; will asynchronously return &#8220;ok&#8221; until 128M buffer is full (or background log flusher thread writes it out). Essentially this is something similar to innodb_flush_log_at_trx_commit=2. In my opinion not durable.</p>
<p>What happens if you really enable full durability on MemSQL? <a href="http://p.defau.lt/?9eGKao3oab_lQWNoZO7DTw">Absolute sadness</a> does. Apparently each commit will wait for background thread to wake up and write out transaction log. How often does background thread wake up? Every 50ms. Well, it actually does time accounting magic, to flush every 50ms, and calls very exact sleep.</p>
<p><strong>Claim #1: </strong>MemSQL is 500x slower at durable transactions a second than InnoDB.</p>
<p>It is relatively easy to back that up &#8211; with decent RAID controller that has write-behind caching, InnoDB can easily sustain 10k transactions a second from a single thread, as it doesn&#8217;t sleep for 50ms between fsyncs. There is some commit grouping there, two threads will have 40tps, ten threads will have 200tps, but as I get to choose my own benchmark I claim that MemSQL is 500x slower at single-thread durable transaction rate.</p>
<p>Now that we established MySQL superiority (ha ha), let&#8217;s look at read performance. I sure agree, that it is where MemSQL should shine. I do agree, that its execution speeds for table scans are not bad &#8211; 8M rows scanned a second (for SELECT COUNT(*) query) from single thread is sure a great achievement.</p>
<p>To be honest, I didn&#8217;t want to spend my time in benchmarking what an in-memory database should excel at (I&#8217;m sure it does random point reads on skiplist just fine). Instead I decided to test my favorite query:</p>
<p style="padding-left:30px;">SELECT * FROM table ORDER BY id DESC LIMIT 5;</p>
<p>You know, the query that is all around the web &#8211; showing you heads of various lists. MySQL does that by pointing a cursor at an index position then walking record by record in index order. Not MemSQL, it will actually have to traverse whole table and sort it to return you the answer. Even &#8220;SELECT MAX(id)&#8221; does crawl whole table.</p>
<p><strong>Claim #2: </strong>MemSQL is thousand times slower than MySQL. Or million times slower. At simple read queries. <em>(I have been corrected on this &#8211; apparently indexes in MemSQL are unidirectional, so you have to define separate index for each direction you are going to read the table in).</em></p>
<p>Well, once we establish that MemSQL will have O(N) performance on some common operation, all we need is just find an N that is large enough ;-)</p>
<p>I don&#8217;t know how much we should be blaming MemSQL guys and how much that should be directed at journalists that were hyping on the technology. If we get back to ACID, we&#8217;d see that A for atomicity is done only at statement level and BEGIN/COMMIT are ignored. Isolation is only READ COMMITTED (difficult to have REPEATABLE READ with no real transactions). Durability is flawed, and I didn&#8217;t check C part. I got to admit, MemSQL FAQ states that &#8220;Yes, MemSQL supports fully ACID transactions&#8221;. This is on them, then.</p>
<p>The 80000 queries a second on MemSQL number isn&#8217;t anything impressive, compared to what modern MySQL can do (especially with HandlerSocket) &#8211; people are approaching million queries a sec there :-)</p>
<p>Though, definitely, for things that it is doing well, it is fastest MySQL protocol speaking thing at the moment, though it isn&#8217;t that far ahead of MySQL Cluster, and people talking to NDB are having also quite good performance (really amazing performance, that is).</p>
<p>I&#8217;m sure, that my both claims can be fixed with some engineering work. Write performance needs proper real time synching with group commit (there has been some great development in MySQL world about that lately too &#8211; though when binlog is involved things are way more complicated).</p>
<p>Read performance needs proper optimizations for most common patterns &#8211; index order reads, for example. Memory is fast, but not fast enough if high concurrency environment would need to do this over and over again. Even for what it does well, I&#8217;m somewhat sure that it wouldn&#8217;t overperform InnoDB 30x at in-memory workloads. I&#8217;m too lazy to benchmark today, but this &#8216;Claim #3&#8242; is not that difficult to prove :-)</p>
<p>Anyway, we wouldn&#8217;t need this post if there was a decent disclosure of behaviors and proper benchmarking. Now we get multiple conflicting claims that are way too easy to spot within few minutes of testing. Way too easy.</p>
<p>P.S. Harrison also has <a href="http://www.quora.com/SQL/What-benefits-does-MemSQL-offer-over-running-a-MySQL-database-on-ramdisk/answer/Harrison-Fisk">discussed this</a> on Quora</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/domasmituzas.wordpress.com/1568/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/domasmituzas.wordpress.com/1568/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=dom.as&#038;blog=190075&#038;post=1568&#038;subd=domasmituzas&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://dom.as/2012/06/26/memsql-rage/feed/</wfw:commentRss>
		<slash:comments>27</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/c660a6eb3a4005232acb111303bef12c?s=96&#38;d=http%3A%2F%2Fs0.wp.com%2Fi%2Fmu.gif&#38;r=G" medium="image">
			<media:title type="html">domasmituzas</media:title>
		</media:content>
	</item>
		<item>
		<title>On binlogs and datacenters</title>
		<link>http://dom.as/2012/06/06/on-binlogs-and-datacenters/</link>
		<comments>http://dom.as/2012/06/06/on-binlogs-and-datacenters/#comments</comments>
		<pubDate>Wed, 06 Jun 2012 12:32:56 +0000</pubDate>
		<dc:creator>Domas Mituzas</dc:creator>
				<category><![CDATA[mysql]]></category>
		<category><![CDATA[io]]></category>
		<category><![CDATA[replication]]></category>

		<guid isPermaLink="false">http://dom.as/?p=1562</guid>
		<description><![CDATA[Once MySQL is deployed inside a datacenter environment (i.e. forms a cloud ;-), major feature in it becomes replication. It is used to maintain hot copies, standby copies, read-only copies, invalidate external systems, replicate to external systems, etc. If this &#8230; <a href="http://dom.as/2012/06/06/on-binlogs-and-datacenters/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=dom.as&#038;blog=190075&#038;post=1562&#038;subd=domasmituzas&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>Once MySQL is deployed inside a datacenter environment (i.e. forms a cloud ;-), major feature in it becomes replication. It is used to maintain hot copies, standby copies, read-only copies, invalidate external systems, replicate to external systems, etc. If this functionality is broken, datacenter is broken &#8211; components are not synchronized anymore, invalidations not done, data not consistent.</p>
<p>From performance perspective, replication not working properly results in unusable slaves so load cannot be spread. This results in higher load on other machines, including master (especially on master, if environment needs stronger consistency guarantees).</p>
<p>Judging on replication importance in MySQL deployments, it should attract performance engineering as much as InnoDB and other critical pieces. Though slave replication performance is being increased in 5.6, master side is not (well, group commit may help a bit, but not as much).</p>
<p>The major problem here is LOCK_log.<del> It is a mutex that guards all MySQL log files</del> (<em>Update: that sentence is wrong, it is per-log-type  mutex, is not shared among different types, at is class private variable</em>) (general query log, binary log, etc) &#8211; only one read or write can happen to any of them. Other logs aside (their impact can be minimized), binary log finds this mutex extremely problematic, because:</p>
<ul>
<li>It stalls COMMITs</li>
<li>It stalls slave binary log reads</li>
</ul>
<p>Though one can argue, that once there&#8217;re less commits, there will be less binary log and that will result in some sort of equilibrium. Unfortunately, one doesn&#8217;t get anywhere close to decent efficiency, as there&#8217;re too many situations, when LOCK_log is kept for way too long:</p>
<ul>
<li>Slow binary log read (if they already got purged out of cache, highly likely)</li>
<li>Slow binary log write (if controller cache is saturated by page flush workload)</li>
<li>Slow memory allocation for larger events (on systems with malloc scalability issues)</li>
</ul>
<p>Saturating RAID controller cache isn&#8217;t that difficult &#8211; and even if one dedicates separate disks to a separate log disk array (what a waste!), it doesn&#8217;t mean that out of the shelf hardware will support supplying separate cache for that disk array. Without a separate dedicated cache or high priority log processing one ends up blocking until disks are available for a write.</p>
<p>Read efficiency is a concern here too &#8211; MySQL uses statically sized buffer of 8k for all binary log reads, which means that on highly pressured system read-ahead may not work, and there will be way more I/O operations/seeks, while holding a precious mutex. Even if the operation to read the 8k page from memory buffers is very fast, slave threads will be forced to wait for other, much slower operations (a lagging slave reading yesterday&#8217;s data? high write workload?) to finish.</p>
<p>If binary log writes are on a separate device one can inspect the utilization on <a title="iostat -x" href="http://dom.as/2009/03/11/iostat/">iostat</a>. Usually there will be only one write or read outstanding, so the busy percentage shows really well how contended this resource is. A double-digit number already says that operations aren&#8217;t instant, and replication slaves can be subjected to log starvation, that is &#8211; not replicating.</p>
<p>From operation side solution to this is somehow obtaining a dedicated cache or fast device for binary log writes. One can simply disable write cache for the InnoDB data partition and use lots of parallel InnoDB page write threads, so that they win the fight against read threads. Using flashcache or similar technology to absorb writes can be beneficial in this case.</p>
<p>On the other hand, MySQL can be changed not to have giant log mutex &#8211; binary logs are append-only structures, and just guarding tail and rotation events could be enough, with additional one or two atomic variables to make sure that readers are fine.</p>
<p>Also, having compressed binlogs on disk would reduce the I/O pressure caused by writes or reads, as well as there&#8217;s a possible gain from not having to recompress logs for each remote reader.</p>
<p>Then datacenter will be happy, and datacenter users even happier.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/domasmituzas.wordpress.com/1562/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/domasmituzas.wordpress.com/1562/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=dom.as&#038;blog=190075&#038;post=1562&#038;subd=domasmituzas&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://dom.as/2012/06/06/on-binlogs-and-datacenters/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/c660a6eb3a4005232acb111303bef12c?s=96&#38;d=http%3A%2F%2Fs0.wp.com%2Fi%2Fmu.gif&#38;r=G" medium="image">
			<media:title type="html">domasmituzas</media:title>
		</media:content>
	</item>
		<item>
		<title>MySQL is doomed?</title>
		<link>http://dom.as/2012/04/19/mysql-is-doomed/</link>
		<comments>http://dom.as/2012/04/19/mysql-is-doomed/#comments</comments>
		<pubDate>Thu, 19 Apr 2012 19:52:48 +0000</pubDate>
		<dc:creator>Domas Mituzas</dc:creator>
				<category><![CDATA[mysql]]></category>

		<guid isPermaLink="false">http://dom.as/?p=1555</guid>
		<description><![CDATA[Percona&#8217;s version of MySQL Conference this year was awesome, and there were some great keynotes there, I&#8217;ll high-light two of them. One was called &#8220;Future Perfect: The Road Ahead for MySQL&#8221; and had a vendor panel of &#8220;Industry leaders from &#8230; <a href="http://dom.as/2012/04/19/mysql-is-doomed/">Continue reading <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=dom.as&#038;blog=190075&#038;post=1555&#038;subd=domasmituzas&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>Percona&#8217;s version of MySQL Conference this year was awesome, and there were some great keynotes there, I&#8217;ll high-light two of them.</p>
<p>One was called <a href="http://www.percona.tv/percona-live/future-perfect-the-road-ahead-for-mysql">&#8220;Future Perfect: The Road Ahead for MySQL&#8221;</a> and had a vendor panel of &#8220;Industry leaders from HP, Amazon Web Services, McAfee, Clustrix, and Akiban discuss the future of MySQL&#8221;.</p>
<p>It went like this:</p>
<p style="padding-left:30px;">BaronTheModerator: &#8220;so, what is the future for MySQL?&#8221;<br />
HP Cloud: &#8220;Clouds!&#8221;<br />
Amazon Web Services: &#8220;Clouds and DynamoDB/RDS!&#8221;<br />
McAffee: &#8220;More Security!&#8221;<br />
Clustrix: &#8220;More Scaling!&#8221;<br />
Akiban: &#8220;More document stores!&#8221;</p>
<p style="padding-left:30px;">BaronTheModerator, &#8220;what do your customers ask for?&#8221;<br />
HP Cloud: &#8220;Clouds!&#8221;<br />
Amazon Web Services: &#8220;Clouds and DynamoDB/RDS!&#8221;<br />
&#8230;</p>
<p>After an hour of that I already knew a lot about road ahead for MySQL, much more than after pragmatic <a href="http://www.percona.tv/percona-live/plmce-2012-keynote-what-comes-next">&#8220;What Comes Next&#8221;</a>, which covered boring things like optimizing for future hardware, compression, bla bla.</p>
<p>Probably the most significant part of keynotes was Brian Aker&#8217;s disclosure of his impact on MySQL ecosystem in his<a href="http://www.percona.tv/percona-live/plmce-2012-keynote-the-new-mysql-cloud-ecosystem"> &#8220;The New MySQL Cloud Ecosystem&#8221;</a>. Actually, people should know that Brian actually coined the term &#8220;MySQL Ecosystem&#8221;. Brian remembered his days as MySQL&#8217;s Director of Architecture (05:16 in the video):</p>
<p style="padding-left:30px;">So, what I think we&#8217;ve now been entering for last couple years really is actually the cloud era. And we have glued some pieces of things&#8230; It&#8217;s funny, we&#8217;re talking about&#8230; you know&#8230; I&#8217;m looking at MySQL 5.5 and look at 5.6 and I&#8217;m like yep, I remember, thats the roadmaps I wrote, ha, glad to know, I&#8217;m curious what they gonna do after 5.6. Didn&#8217;t leave many.. eh.. Cliff Notes to what goes behi&#8230; after that.</p>
<p>This reveals that MySQL Community and Oracle customer base are actually locked in into a stagnant software product with no future. I think you should be worried. Heh.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/domasmituzas.wordpress.com/1555/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/domasmituzas.wordpress.com/1555/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=dom.as&#038;blog=190075&#038;post=1555&#038;subd=domasmituzas&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://dom.as/2012/04/19/mysql-is-doomed/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/c660a6eb3a4005232acb111303bef12c?s=96&#38;d=http%3A%2F%2Fs0.wp.com%2Fi%2Fmu.gif&#38;r=G" medium="image">
			<media:title type="html">domasmituzas</media:title>
		</media:content>
	</item>
	</channel>
</rss>
