<?xml version="1.0" encoding="UTF-8"?>

<rss version='2.0' 
     xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule"
     xmlns:doap="http://usefulinc.com/ns/doap#"
     xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">

    <channel>
        <!-- This XML Feed shows details for the page InnoDB 
             and everything recently tagged InnoDB -->
        <creativeCommons:license>http://creativecommons.org/licenses/by-sa/2.5/
          </creativeCommons:license>
        <title>InnoDB on SWiK</title>
        <doap:name>InnoDB</doap:name>
        <doap:description></doap:description>
        <description></description> 
	  <!-- see doap:description for full description -->
        <link>http://swik.net/InnoDB</link>
        <doap:homepage></doap:homepage>
        
        <pubDate></pubDate>
        <lastBuildDate></lastBuildDate>
            
        <item>
            <title>Notes from land of I/O</title>
            <link>http://swik.net/MySQL/Planet+MySQL/Notes+from+land+of+I%2FO/cb6k3</link>
            <description>&lt;p&gt;A discussion on IRC sparkled some interest on how various I/O things work in Linux. I wrote small microbenchmarking &lt;a href=&quot;http://noc.wikimedia.org/~midom/raidbench.c.txt&quot;&gt;program&lt;/a&gt; (where all configuration is in source file, and I/O modes can be changed by editing various places in code ;-), and started playing with performance.&lt;/p&gt;
&lt;p&gt;The machine for this testing was RAID10 16disk box with 2.6.24 kernel, and I tried to understand how O_DIRECT works, and how fsync() works and ended up digging into some other stuff.&lt;/p&gt;
&lt;p&gt;My notes for now are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;O_DIRECT serializes writes to a file on ext2, ext3, jfs, so I got at most 200-250w/s.&lt;/li&gt;
&lt;li&gt;xfs allows parallel (and out-of-order, if that matters) DIO, so I got 1500-2700w/s (depending on file size - seek time changes.. :) of random I/O without write-behind caching. There are few outstanding bugs that lock this down back to 250w/s (&lt;i&gt;#xfs@freenode: &amp;#8220;yeah, we drop back to taking the i_mutex in teh case where we are writing beyond EOF or we have cached pages&amp;#8221;&lt;/i&gt;, so
&lt;pre&gt;posix_fadvise(fd, 0, filesize, POSIX_FADV_DONTNEED)&lt;/pre&gt;
&lt;p&gt;helps).&lt;/li&gt;
&lt;li&gt;fsync(),sync(),fdatasync() wait if there are any writes, bad part - it can wait forever. Filesystems people say thats a bug - it shouldn&amp;#8217;t wait for I/O that happened after sync being called. I tend to believe, as it causes stuff like InnoDB semaphore waits and such. &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Of course, having write-behind caching at the controller (or disk, *shudder*) level allows filesystems to be lazy (and benchmarks are no longer that different), but having the upper layers work efficiently is quite important too, to avoid bottlenecks. &lt;/p&gt;
&lt;p&gt;It is interesting, that write-behind caching isn&amp;#8217;t needed that much anymore for random writes, once filesystem parallelizes I/O, even direct, nonbuffered one. &lt;/p&gt;
&lt;p&gt;Anyway, now that I found some of I/O properties and issues, should probably start thinking how they apply to the upper layers like InnoDB.. :)&lt;/p&gt;</description>
            
            <pubDate>Mon, 11 Aug 2008 05:13:18 -0700</pubDate>
        </item>
            
        <item>
            <title>Why You Want to Switch to MySQL 5.1</title>
            <link>http://swik.net/MySQL/Planet+MySQL/Why+You+Want+to+Switch+to+MySQL+5.1/cb32s</link>
            <description>&lt;p&gt;In two words:  online operations.  In a paragraph:  Forget partitioning, row-based replication and events.  The big reasons most people are going to salivate over 5.1, and probably start plans to upgrade now, are the online operations:  &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;A HREF=&quot;http://dev.mysql.com/doc/refman/5.1/en/alter-table.html&quot;&gt;online ALTER TABLE&lt;/a&gt; for column rename, column default value change, and adding values to the end of an ENUM/SET&lt;/li&gt;
&lt;li&gt;&lt;A HREF=&quot;http://dev.mysql.com/doc/refman/5.1/en/log-tables.html&quot;&gt;Online, table-based logging&lt;/A&gt;.  No more need to restart your server to enable or change the general or slow query logs.  You can have the standard file-based output or choose a table format&amp;#8230;which you can query.&lt;/li&gt;
&lt;p&gt; &lt;a href=&quot;http://www.pythian.com/blogs/1168/why-you-want-to-switch-to-mysql-51#more-1168&quot; class=&quot;more-link&quot;&gt;(more&amp;#8230;)&lt;/a&gt;&lt;/p&gt;</description>
            
            <pubDate>Sun, 10 Aug 2008 09:08:41 -0700</pubDate>
        </item>
            
        <item>
            <title>InnoDB plugin compression with benchmarks | All things Sysadmin</title>
            <link>http://swik.net/zlib/del.icio.us+tag%2Fzlib/InnoDB+plugin+compression+with+benchmarks+%7C+All+things+Sysadmin/cbulu</link>
            <description></description>
            
            <pubDate>Thu, 07 Aug 2008 13:15:36 -0700</pubDate>
        </item>
            
        <item>
            <title>Chapter 3. InnoDB Data Compression</title>
            <link>http://swik.net/zlib/del.icio.us+tag%2Fzlib/Chapter+3.+InnoDB+Data+Compression/cbult</link>
            <description>ROW_FORMAT=COMPRESSED</description>
            
            <pubDate>Thu, 07 Aug 2008 13:15:36 -0700</pubDate>
        </item>
            
        <item>
            <title>Making MySQL more usable: InnoDB information_schema patches</title>
            <link>http://swik.net/MySQL/Planet+MySQL/Making+MySQL+more+usable%3A+InnoDB+information_schema+patches/cbmmz</link>
            <description>&lt;p&gt;Lately I&amp;#8217;ve been working on a series of patches to increase the usability of InnoDB, based on the &lt;a href=&quot;http://www.innodb.com/innodb_plugin/&quot;&gt;InnoDB plugin for MySQL 5.1&lt;/a&gt;.  I have a lot of ideas still, but I&amp;#8217;ve currently gotten two proof of concept patches working.  Both of the patches require a &lt;a href=&quot;http://provenscaling.com/patches/innodb_plugin/1.0/draft/move_buf_chunk_struct.patch&quot;&gt;small patch&lt;/a&gt; to relocate the &lt;tt&gt;buf_chunk_struct&lt;/tt&gt; struct definition which was inadvertently defined in &lt;tt&gt;buf0buf.c&lt;/tt&gt; rather than &lt;tt&gt;buf0buf.h&lt;/tt&gt;.&lt;/p&gt;
&lt;p&gt;Most patches are considered &lt;strong&gt;rough draft, proof of concept quality&lt;/strong&gt; at best.  They are suitable for testing, playing around, using them to gain insight about your data, but &lt;em&gt;not&lt;/em&gt; for production use.  Use at your own risk!&lt;/p&gt;
&lt;h2&gt;Using &lt;tt&gt;information_schema&lt;/tt&gt; to view the buffer pool contents&lt;/h2&gt;
&lt;p&gt;This &lt;a href=&quot;http://provenscaling.com/patches/innodb_plugin/1.0/draft/i_s_innodb_buffer_pool_pages.patch&quot;&gt;patch&lt;/a&gt; creates several new &lt;tt&gt;information_schema&lt;/tt&gt; tables to provide visibility into the contents of the InnoDB buffer pool.  The new tables are: &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;tt&gt;innodb_buffer_pool_pages&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt&gt;innodb_buffer_pool_pages_index&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt&gt;innodb_buffer_pool_pages_blob&lt;/tt&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Note that accessing these tables is &lt;em&gt;not cheap&lt;/em&gt;, as the buffer pool must be scanned.&lt;/p&gt;
&lt;h3&gt;&lt;tt&gt;innodb_buffer_pool_pages&lt;/tt&gt;&lt;/h3&gt;
&lt;p&gt;This table provides some generic information about all pages present in the buffer pool, and is primarily useful for getting statistics about the number and types of pages present at any given point in time.  For example:&lt;/p&gt;
&lt;blockquote&gt;&lt;pre&gt;
SELECT
  page_type,
  count(*) AS nr
FROM information_schema.innodb_buffer_pool_pages
GROUP BY page_type;

+-----------+------+
| page_type | nr   |
+-----------+------+
| allocated | 4051 |
| bitmap    |    2 |
| blob      |    5 |
| fsp_hdr   |    2 |
| index     |   14 |
| inode     |    2 |
| sys       |    3 |
| trx_sys   |    1 |
| undo_log  |   15 |
+-----------+------+
&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;h3&gt;&lt;tt&gt;innodb_buffer_pool_pages_index&lt;/tt&gt;&lt;/h3&gt;
&lt;p&gt;This table gives you detailed statistics on index pages, which for InnoDB means all data (as part of the primary key) and all defined indexes.  For example (some columns removed for clarity):&lt;/p&gt;
&lt;blockquote&gt;&lt;pre&gt;
SELECT *
FROM information_schema.innodb_buffer_pool_pages_index;

+-------------+------------------+------------+----------+---------+--------+-----------+--------------+...
| schema_name | table_name       | index_name | space_id | page_no | n_recs | data_size | lru_position |...
+-------------+------------------+------------+----------+---------+--------+-----------+--------------+...
| NULL        | SYS_IBUF_TABLE_0 | CLUST_IND  |        0 |       4 |      0 |         0 |            6 |...
| NULL        | SYS_INDEXES      | CLUST_IND  |        0 |      11 |      8 |       536 |            7 |...
| NULL        | SYS_TABLES       | CLUST_IND  |        0 |       8 |      5 |       351 |           12 |...
| NULL        | SYS_COLUMNS      | CLUST_IND  |        0 |      10 |     24 |      1436 |           14 |...
| NULL        | SYS_TABLES       | ID_IND     |        0 |       9 |      5 |       126 |           15 |...
| NULL        | SYS_FIELDS       | CLUST_IND  |        0 |      12 |      8 |       315 |           16 |...
| NULL        | SYS_FOREIGN      | ID_IND     |        0 |      46 |      0 |         0 |           50 |...
| NULL        | SYS_FOREIGN      | FOR_IND    |        0 |      47 |      0 |         0 |           51 |...
| NULL        | SYS_FOREIGN      | REF_IND    |        0 |      48 |      0 |         0 |           52 |...
| NULL        | SYS_FOREIGN_COLS | ID_IND     |        0 |      49 |      0 |         0 |           53 |...
| test        | bt               | PRIMARY    |       26 |       3 |      3 |        39 |           66 |...
| test        | bt               | PRIMARY    |       26 |       7 |      1 |      8124 |           69 |...
| test        | bt               | PRIMARY    |       26 |       9 |      2 |     16248 |           71 |...
| test        | bt               | PRIMARY    |       26 |       6 |      2 |     16248 |           74 |...
+-------------+------------------+------------+----------+---------+--------+-----------+--------------+...
&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;p&gt;Besides the obvious value of this, notice that you can see InnoDB&amp;#8217;s internal tables (with &lt;tt&gt;schema_name&lt;/tt&gt; as &lt;tt&gt;NULL&lt;/tt&gt;) as well!&lt;/p&gt;
&lt;h3&gt;&lt;tt&gt;innodb_buffer_pool_pages_blob&lt;/tt&gt;&lt;/h3&gt;
&lt;p&gt;This table gives you detailed statistics on &lt;tt&gt;BLOB&lt;/tt&gt;-storage pages, which store parts of &lt;tt&gt;BLOB&lt;/tt&gt;s that overflow in-row storage (another post on that later, but suffice it to say, if the &lt;tt&gt;BLOB&lt;/tt&gt; is larger than 8KB&amp;#8230; sort of).  For example:&lt;/p&gt;
&lt;blockquote&gt;&lt;pre&gt;
SELECT *
FROM information_schema.innodb_buffer_pool_pages_blob;

+----------+---------+------------+----------+--------------+--------------+-----------+------------+
| space_id | page_no | compressed | part_len | next_page_no | lru_position | fix_count | flush_type |
+----------+---------+------------+----------+--------------+--------------+-----------+------------+
|       26 |       5 |          0 |     9232 |            0 |           72 |         0 |          0 |
|       26 |      10 |          0 |     9232 |            0 |           73 |         0 |          0 |
|       26 |       8 |          0 |     9232 |            0 |           75 |         0 |          0 |
|       26 |      11 |          0 |     9232 |            0 |           76 |         0 |          0 |
|       26 |       4 |          0 |     9232 |            0 |           77 |         0 |          0 |
+----------+---------+------------+----------+--------------+--------------+-----------+------------+
&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;p&gt;We&amp;#8217;d love to get the table name and &lt;tt&gt;PRIMARY KEY&lt;/tt&gt; value associated with each &lt;tt&gt;BLOB&lt;/tt&gt;-storage page, but I&amp;#8217;m not sure if that&amp;#8217;s possible.&lt;/p&gt;
&lt;h3&gt;An example of the power of these tables&lt;/h3&gt;
&lt;p&gt;Have you ever wondered what your &lt;em&gt;page fill rate&lt;/em&gt; is?  Probably not, because you didn&amp;#8217;t realize it was either interesting or important, but we worry about these things (and often justifiably so).  In short, page fill rate is the percentage of each page that is filled with data.  Since InnoDB only caches whole pages, if your average page fill rate is 75%, you would be wasting 25% of the space in each page.  That would mean that your table is spread across more pages than necessary, which will waste both disk space and memory you&amp;#8217;ve allocated to the buffer pool.&lt;/p&gt;
&lt;p&gt;Here&amp;#8217;s a simple way to figure out the average page fill rate of pages currently in cache:&lt;/p&gt;
&lt;blockquote&gt;&lt;pre&gt;
SELECT
  schema_name,
  table_name,
  index_name,
  COUNT(*) AS n_pages,
  ROUND(AVG(n_recs), 2) AS recs_per_page,
  ROUND(SUM(data_size)/1048576, 2) AS total_data_size_M,
  ROUND(AVG(data_size/(
    SELECT variable_value
    FROM information_schema.global_status
    WHERE variable_name
    LIKE &#039;innodb_page_size&#039;
  )) * 100, 2) AS page_fill_pct
FROM
  information_schema.innodb_buffer_pool_pages_index
WHERE 1
AND schema_name IS NOT NULL
GROUP BY
  schema_name,
  table_name,
  index_name
ORDER BY
  total_data_size_M DESC;

+-------------+------------+-----------------+---------+---------------+-------------------+---------------+
| schema_name | table_name | index_name      | n_pages | recs_per_page | total_data_size_M | page_fill_pct |
+-------------+------------+-----------------+---------+---------------+-------------------+---------------+
| test        | n          | GEN_CLUST_INDEX |    4079 |        252.55 |             58.56 |         91.88 |
| test        | bt         | PRIMARY         |       2 |          2.50 |              0.02 |         49.70 |
| test        | p          | PRIMARY         |       1 |          2.00 |              0.00 |          0.52 |
| test        | p          | c               |       1 |          2.00 |              0.00 |          0.37 |
+-------------+------------+-----------------+---------+---------------+-------------------+---------------+
&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;p&gt;This is showing some statistics for each index from each table in the cache: the number of pages in the cache, the average number of records per page for those cached pages, the total number of megabytes of cache used, and the page fill rate in percent.  There is currently no other way to calculate this information from any statistics or data that InnoDB provides.&lt;/p&gt;
&lt;h2&gt;What else?&lt;/h2&gt;
&lt;p&gt;What ideas do you have?  What do you think about these features?  Leave a comment to let us know!&lt;/p&gt;</description>
            
            <pubDate>Tue, 29 Jul 2008 19:13:22 -0700</pubDate>
        </item>
            
        <item>
            <title>MySQL Back to Basics: Analyze, Check, Optimize, and Repair</title>
            <link>http://swik.net/MySQL/Planet+MySQL/MySQL+Back+to+Basics%3A+Analyze%2C+Check%2C+Optimize%2C+and+Repair/cbh7k</link>
            <description>&lt;p&gt;It felt like the right time for us to look back at some useful commands for table maintenance that some of us may not have mastered as much as we might like to think.&lt;/p&gt;
&lt;p&gt;In my post about &lt;a href=&quot;http://www.pythian.com/blogs/1103/myisam-statistics-gatherings&quot;&gt;gathering index statistics&lt;/a&gt;, I referred to &lt;code&gt;OPTIMIZE TABLE&lt;/code&gt;, &lt;code&gt;ANALYZE TABLE&lt;/code&gt;, and &lt;code&gt;REPAIR TABLE&lt;/code&gt; &amp;#8212; but I never explained in depth what the different commands do, and what the differences between them are. That is what I thought I would do with this post, focusing  on InnoDB and MyISAM, and the differences in how they treat those commands. I will also look at different cases and see which one is right for in each case.&lt;/p&gt;
&lt;p&gt; &lt;a href=&quot;http://www.pythian.com/blogs/1114/mysql-back-to-basics-analyze-check-optimize-and-repair#more-1114&quot; class=&quot;more-link&quot;&gt;(more&amp;#8230;)&lt;/a&gt;&lt;/p&gt;</description>
            
            <pubDate>Fri, 25 Jul 2008 11:50:19 -0700</pubDate>
        </item>
            
        <item>
            <title>Innodb RAID performance on 5.1</title>
            <link>http://swik.net/MySQL/Planet+MySQL/Innodb+RAID+performance+on+5.1/ca4jd</link>
            <description>&lt;p&gt;I&#039;ve been doing some benchmarking recently to satisfy the curiosity about 5.1&#039;s performance compared with 4.1. &amp;#160;The major question this time revolves around how much additional performance an external RAID array can provide (for us it&#039;s typically beyond the 6 drives a Dell 2950 can hold).&amp;#160;
&lt;div&gt;&lt;br/&gt;&lt;/div&gt;
&lt;div&gt;These tests are done on using an MSA-30 drive enclosure with 15k-SCSI drives. &amp;#160;The testing framework is&amp;#160;&lt;a href=&quot;http://sysbench.sourceforge.net/&quot;&gt;sysbench &lt;/a&gt;&lt;a href=&quot;http://sysbench.sourceforge.net/docs/#database_mode&quot;&gt;oltp&lt;/a&gt;. &amp;#160;The test names are hopefully fairly obvious: &amp;#160;selects = single selects, reads = range tests, xacts = transaction tests, etc. &amp;#160; Transaction tests are counting individual queries, not transactions. &amp;#160; The &quot;Rdm&quot; tests are using a uniform distribution, whereas the non-&#039;Rdm&#039; tests are 75% of queries are using 10% of the rows. &amp;#160;&lt;/div&gt;
&lt;div&gt;
&lt;/div&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://mysqlguy.net/blog/2008/07/22/innodb-raid-performance-51&quot;&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
            
            <pubDate>Tue, 22 Jul 2008 06:50:26 -0700</pubDate>
        </item>
            
        <item>
            <title>Tuning Search In Drupal 5</title>
            <link>http://swik.net/MySQL/Planet+MySQL/Tuning+Search+In+Drupal+5/cauaz</link>
            <description>&lt;p&gt;In previous search benchmarks, I utilized random content generated with Drupal&#039;s devel module.  In these latest benchmarks, I used an actual sanitized copy of the Drupal.org community website database, with email addresses and passwords removed.  The first tests were intended to confirm that Xapian continues to perform well with large amounts of actual data.  Additional tests were performed to measure the effect of various MySQL tunings and configurations.  The following data was derived from several hundred benchmarks run on an Amazon AWS instance over the past week using the SearchBench module.&lt;/p&gt;
&lt;p&gt;These tests confirm that Xapian continues to offer better search performance than Drupal&#039;s core search module.  Contrary to popular belief, the data also shows that using the InnoDB storage engine for search tables significantly outperforms using the MyISAM storage engine for search tables, especially when your database server has sufficient RAM.  The data also confirms that allocating additional RAM for MySQL&#039;s temporary tables can also improve search performance.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://tag1consulting.com/Tuning_Search_In_Drupal_5&quot;&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
            
            <pubDate>Sat, 19 Jul 2008 08:56:47 -0700</pubDate>
        </item>
            
        <item>
            <title>Innodb Multi-core Performance</title>
            <link>http://swik.net/MySQL/Planet+MySQL/Innodb+Multi-core+Performance/cah8c</link>
            <description>&lt;p&gt;There&#039;s been a lot of rumors floating around internally at Yahoo that it&#039;s best to turn off some of your CPU cores when using Innodb, especially if you have a machine with &gt; 4 cores. &amp;#160;At this point there&#039;s no question in my mind that Innodb doesn&#039;t perform much better when you double your cores from 4 to 8, but I really wanted to know if 8 actually performed &lt;span class=&quot;Apple-style-span&quot; style=&quot;font-style: italic;&quot;&gt;worse.&amp;#160;&lt;/span&gt;
&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-style: italic;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;To test, I used a Dell 2950 with 6 drives and a simple mysqlslap test script. &amp;#160;There&#039;s basically no I/O going on here, just a small table in memory being queried a lot. &amp;#160;To be fair, I actually got this test from &lt;a href=&quot;http://venublog.com/&quot;&gt;Venu&lt;/a&gt;. &amp;#160;I used maxcpu=4 in my grub.conf to limit the cpus (I also tested with tasksel and it seemed to have the same effect as maxcpu).&lt;/div&gt;
&lt;div&gt;
&lt;/div&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://mysqlguy.net/blog/2008/07/16/innodb-multi-core-performance&quot;&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
            
            <pubDate>Wed, 16 Jul 2008 07:49:46 -0700</pubDate>
        </item>
            
        <item>
            <title>Falcon Transactional Characteristics</title>
            <link>http://swik.net/MySQL/Planet+MySQL/Falcon+Transactional+Characteristics/caa4b</link>
            <description>&lt;p&gt;It&amp;#8217;s time to continue our series on the transactional storage engines for MySQL.  Some might question why I even include Falcon because it is very much beta at this time.  MySQL, however,  has made quite an investment into Falcon, and while it is currently beta, the code is improving and it looks like that it will be production-worthy when MySQL server 6.0 hits GA.&lt;/p&gt;
&lt;p&gt;If this is the case, it is important to begin to understand what Falcon was designed for and how it differs from other transactional engines such as InnoDB.  I am going to concentrate quite a bit on the Falcon/InnoDB comparison as that is what everyone wants to talk about.  This is despite my having heard MySQL employees repeatedly make statements to the effect of, &amp;#8220;Falcon is not going to replace InnoDB,&amp;#8221; or &amp;#8220;Falcon is not competing with InnoDB.&amp;#8221;  Well, take that with a grain of salt.  It certainly seems to me that they are competing for the same spot.&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;Warning&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;As I said, Falcon is beta. First off, don&amp;#8217;t even &lt;em&gt;try&lt;/em&gt; to use it in production.  Using it in production means you will also be using MySQL Server 6.0, which itself is considered alpha.  Your data will explode, be corrupted, or eaten by jackals. It won&amp;#8217;t be pretty. It will cause great pain.&lt;/p&gt;
&lt;p&gt;In addition, the features of Falcon are still changing.  What I say here might or might not be accurate in the future.&lt;br/&gt;
&lt;strong&gt;&lt;br/&gt;
End of Warning&lt;/strong&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;So, why was Falcon even created?&lt;/p&gt;
&lt;p&gt; &lt;a href=&quot;http://www.pythian.com/blogs/1107/falcon-transactional-characteristics#more-1107&quot; class=&quot;more-link&quot;&gt;(more&amp;#8230;)&lt;/a&gt;&lt;/p&gt;</description>
            
            <pubDate>Mon, 14 Jul 2008 20:49:31 -0700</pubDate>
        </item>
            
        <item>
            <title>MyEclipse :: Eclipse plugin development tools for Java, JSP, XML, Struts, HTML, CSS and EJB</title>
            <link>http://swik.net/Hibernate/del.icio.us+tag%2Fhibernate/MyEclipse+%3A%3A+Eclipse+plugin+development+tools+for+Java%2C+JSP%2C+XML%2C+Struts%2C+HTML%2C+CSS+and+EJB/b939r</link>
            <description></description>
            
            <pubDate>Sun, 13 Jul 2008 08:47:37 -0700</pubDate>
        </item>
            
        <item>
            <title>InnoDB Transactional Characteristics</title>
            <link>http://swik.net/MySQL/Planet+MySQL/InnoDB+Transactional+Characteristics/b8wib</link>
            <description>&lt;p&gt;InnoDB is a storage engine that uses MVCC (described shortly) to provide &lt;a href=&quot;http://www.pythian.com/blogs/1101/transaction-basics-and-acid&quot;&gt;ACID-compliant transactional data storage&lt;/a&gt; using row-level locking.&amp;#160; MVCC stands for Multi-Version Concurrency Control.&amp;#160; It is how InnoDB allows multiple transactions to look at a data set of one or more tables and have a consistent view of the data.  MVCC keeps a virtual snapshot of the dataset for each transaction.&amp;#160; An example will make this clear. &lt;/p&gt;
&lt;p&gt;Let&amp;#8217;s assume you have two transactions (and only two transactions) running on a system. If transaction &lt;em&gt;A&lt;/em&gt; starts at 10:45:56 and ends at 10:45:89, it gets a consistent view of the dataset during the time that the transaction runs.&amp;#160; If transaction &lt;em&gt;B&lt;/em&gt; starts at 10:45:65, it would see &lt;em&gt;exactly&lt;/em&gt; the same view of the dataset that transaction &lt;em&gt;A&lt;/em&gt; saw when it began the transaction.&amp;#160; If transaction &lt;em&gt;B&lt;/em&gt; started at 10:45:95, it would see the modified dataset after transaction &lt;em&gt;A&lt;/em&gt; made modifications. During the duration of each transaction, the dataset that each sees does not change, except for the modifications the transaction itself makes.&amp;#160; Consider that a typical production database server is running hundreds of queries a second, and you realize that the job of  MVCC/the InnoDB storage engine gets very complicated maintaining all these views of the data.&lt;/p&gt;
&lt;p&gt;MySQL server storage engines use three different locking options: table-level locking, page-level locking, and row-level locking.&amp;#160; With table-level locking, if a query accesses the table it will lock the entire table and not allow access to the table from other queries.&amp;#160; The benefit of this is that it entirely eliminates deadlocking issues. The disadvantage is that, as mentioned, no other queries have access to the table while it is locked.&amp;#160; If you had a table with 16,000,000 rows and needed to modify one row, the entire table is inaccessible by other queries. The MyISAM and memory storage engine use table-level locking.&lt;/p&gt;
&lt;p&gt;Page-level locking is locking of a group of rows instead of a the entire table. The number of rows actually locked will vary based on a number of factors. Going back to our example of a 16,000,000-row table, lets assume a page-level lock is used.&amp;#160; If a page consists of 1,000 rows (this would vary depending on the size of the rows and the actual amount of memory allocated to a page), a lock would lock only a thousand rows.&amp;#160; Any of the other 15,999,000 rows could be used by other queries without interference. The BDB storage engine uses page-level locking.&lt;/p&gt;
&lt;p&gt;Row-level locking, as the name suggests, acquires a lock on as small an amount as a single row from a table. This will block the minimal amount of table content and allows for the most concurrency on a table without problems. InnoDB and Falcon both use row-level locking.&lt;/p&gt;
&lt;p&gt;While the InnoDB configuration options are not strictly related to the transactional characteristics (other than &lt;code&gt;innodb_flush_log_at_trx_commit&lt;/code&gt;), I thought it would be useful to have them here for reference.&amp;#160; These are the most common or most important configuration parameters:&lt;/p&gt;
&lt;p&gt; &lt;a href=&quot;http://www.pythian.com/blogs/1104/innodb-transactional-characteristics#more-1104&quot; class=&quot;more-link&quot;&gt;(more&amp;#8230;)&lt;/a&gt;&lt;/p&gt;</description>
            
            <pubDate>Tue, 01 Jul 2008 12:47:50 -0700</pubDate>
        </item>
            
        <item>
            <title>Differences Between innodb_data_file_path and innodb_file_per_table</title>
            <link>http://swik.net/MySQL/Planet+MySQL/Differences+Between+innodb_data_file_path+and+innodb_file_per_table/b7yle</link>
            <description>&lt;p&gt;Recently, a customer wondered if they should start using the &lt;code&gt;innodb_file_per_table&lt;/code&gt; option, or if they should continue to use the large InnoDB tablespace files created by the &lt;code&gt;innodb_data_file_path&lt;/code&gt; option in the &lt;code&gt;my.cnf&lt;/code&gt; option file.&lt;/p&gt;
&lt;p&gt;Many people still use the older &lt;code&gt;innodb_data_file_path&lt;/code&gt; option because it is the default for MySQL server. So, what are the benefits of using &lt;code&gt;innodb_file_per_table&lt;/code&gt; instead?&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;innodb_file_per_table&lt;/code&gt; makes for easier-to-manage files. With this option each InnoDB table has its own data and index file under the database directory. As an example, if you had table &lt;code&gt;foo&lt;/code&gt; located in database &lt;code&gt;xyz&lt;/code&gt; the InnoDB data file for table &lt;code&gt;foo&lt;/code&gt; would be &lt;code&gt;/var/lib/mysql/data/xyz/foo.idb&lt;/code&gt;.  Each table would have its own idb table in the appropriate database directory.  This is in contrast to using the &lt;code&gt;innodb_data_file_path&lt;/code&gt; option with (typically) one large file in the root of your data directory.  For example, it might be &lt;code&gt;/var/lib/mysql/data/ibdata1.idb&lt;/code&gt;.  All table data and indexes would be stored in this one file, and it can be very large&amp;#160; and unwieldy. I don&amp;#8217;t recall the largest ibdata file I have seen, but what do you do if you have a 100 gig InnoDB tablespace file? It can, and does, happen. The file contains what amounts to all the data of all your databases on the server.&lt;/p&gt;
&lt;p&gt; &lt;a href=&quot;http://www.pythian.com/blogs/1067/difference-between-innodb_data_file_path-and-innodb_file_per_table#more-1067&quot; class=&quot;more-link&quot;&gt;(more&amp;#8230;)&lt;/a&gt;&lt;/p&gt;</description>
            
            <pubDate>Fri, 20 Jun 2008 12:00:17 -0700</pubDate>
        </item>
            
        <item>
            <title>Joomla! Community Forum • View topic - Possible Sesssion/MySQL overload</title>
            <link>http://swik.net/Joomla/Del.icio.us+bookmarks+tagged+Joomla/Joomla%21+Community+Forum+%E2%80%A2+View+topic+-+Possible+Sesssion%2FMySQL+overload/b673t</link>
            <description></description>
            
            <pubDate>Wed, 11 Jun 2008 22:12:35 -0700</pubDate>
        </item>
            
        <item>
            <title>5.0 journal: various issues, replication prefetching, our branch</title>
            <link>http://swik.net/MySQL/Planet+MySQL/5.0+journal%3A+various+issues%2C+replication+prefetching%2C+our+branch/b6udg</link>
            <description>&lt;p&gt;First of all, I have to apologize about some of my previous remark on 5.0 performance. I passed &amp;#8216;-g&amp;#8217; CFLAGS to my build, and that replaced default &amp;#8216;-O2&amp;#8242;. Compiling MySQL without -O2 or -O3 makes it slower. Apparently, much slower.&lt;/p&gt;
&lt;p&gt;Few migration notes - once I loaded the schema with character set set to binary (because we treat it as such), all VARCHAR fields were converted to VARBINARY, what I expected, but more annoying was CHAR converted to BINARY - which pads data with \0 bytes. Solution was converting everything into VARBINARY - as actually it doesn&amp;#8217;t have much overhead. &lt;code&gt;TRIM(&#039;\0&#039; FROM field)&lt;/code&gt; eventually helped too.&lt;/p&gt;
&lt;p&gt;The other problem I hit was paramy operation issue. One table definition failed, so paramy exited immediately - though it had few more queries remaining in the queue - so most recent data from some table was not inserted. The cheap workaround was adding -f option, which just ignores errors. Had to reload all data though&amp;#8230;&lt;/p&gt;
&lt;p&gt;I had real fun experimenting with auto-inc locking. As it was major problem for initial paramy tests, I hacked InnoDB not to acquire auto-inc table-level lock (that was just commenting out few lines in ha_innodb.cc). After that change CPU use went to &gt;300% instead of ~100% - so I felt nearly like I&amp;#8217;ve done the good thing. Interesting though - profile showed that quite a lot of CPU time was spent in synchronization - mutexes and such - so I hit SMP contention at just 4 cores. Still, the import was faster (or at least the perception), and I already have in mind few cheap tricks to make it faster (like disabling mempool). The easiest way to make it manageable is simply provide a global variable for auto-inc behavior, though elegant solutions would attach to &amp;#8216;ALTER TABLE &amp;#8230; ENABLE KEYS&amp;#8217; or something similar. &lt;/p&gt;
&lt;p&gt;Once loaded, catching up on replication was another task worth few experiments. As the data image was already quite a few days old, I had at least few hours to try to speed up replication. Apparently, Jay Janssen&amp;#8217;s prefetcher has disappeared from the internets, so the only one left was &lt;a href=&quot;http://maatkit.org&quot;&gt;maatkit&amp;#8217;s&lt;/a&gt; mk-slave-prefetch. It rewrites UPDATEs into simple SELECTs, but executes them just on single thread, so the prefetcher was just few seconds ahead of SQL thread - and speedup was less than 50%. I made a &lt;a href=&quot;http://dammit.lt/snippets/quick-mkprefetch-hack.txt&quot;&gt;quick hack&lt;/a&gt; that parallelized the task, and it managed to double replication speed. &lt;/p&gt;
&lt;p&gt;Still, there&amp;#8217;re few problems with the concept - it preheats just one index, used for lookup, and doesn&amp;#8217;t work on secondary indexes. Actually analyzing the query, identifying what and where changes, and sending a select with UNIONs, preheating every index affected by write query could be more efficient. Additionally it would make adaptive hash or insert buffers useless - as all buffer pool pages required would be already in memory - thus leading to less spots of mutex contention. &lt;/p&gt;
&lt;p&gt;We also managed to hit few optimizer bugs too, related to casting changes in 5.0. Back in 4.0 it was safe to pass all constants as strings, but 5.0 started making poor solutions then (like filesorting, instead of using existing ref lookup index, etc). I will have to review why this happens, does it make sense, and if not - file a bug. For now, we have some workarounds, and don&amp;#8217;t seem to be bitten too much by the behavior. &lt;/p&gt;
&lt;p&gt;Anyway, in the end I directed half of &lt;a href=&quot;http://en.wikipedia.org&quot;&gt;this site&amp;#8217;s&lt;/a&gt; core database off-peak load to this machine, and it was still keeping up with replication at ~8000 queries per second. The odd thing  yet is that though 5.0 eats ~30% more CPU, it shows up on profiling as faster-responding box. I guess we&amp;#8217;re just doing something wrong. &lt;/p&gt;
&lt;p&gt;I&amp;#8217;ve published our MySQL branch at &lt;a href=&quot;https://code.launchpad.net/~wikimedia/mysql/mysql-5.0&quot;&gt;launchpad&lt;/a&gt;. Do note, release process is somewhat ad-hoc (or non-existing), and engineer doing it is clueless newbie. :)&lt;/p&gt;
&lt;p&gt;I had plans to do some more scalability tests today, but apparently the server available is just two-core machine, so there&amp;#8217;s nothing much I can do on it. I guess another option is grabbing some 8-core application server and play with it. :)&lt;/p&gt;</description>
            
            <pubDate>Sat, 07 Jun 2008 02:02:11 -0700</pubDate>
        </item>
            
        <item>
            <title>On checksums</title>
            <link>http://swik.net/MySQL/Planet+MySQL/On+checksums/b53dv</link>
            <description>&lt;p&gt;InnoDB maintains two checksums per buffer pool block. Old formula of checksum, and new formula of checksum. Both are read, both are written. I guess this had to be some kind of transition period, but it obviously took too long (or was forgotten). Anyway, disabling checksums code entirely makes single-thread data load 7% faster - though in parallel activity locking contention provides with some extra CPU resources for checksum calculation.&lt;br/&gt;
Leaving just single version of checksum would cut this fat in half, without abandoning the feature entirely - probably worth trying. &lt;/p&gt;
&lt;p&gt;&lt;b&gt;Update:&lt;/b&gt; Benchmarked InnoDB checksum against &lt;a href=&quot;http://en.wikipedia.org/wiki/Fletcher&#039;s_checksum&quot;&gt;Fletcher&lt;/a&gt;. Results were interesting (milliseconds for 10000 iterations):&lt;/p&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;Algorithm:&lt;/td&gt;
&lt;td&gt;InnoDB&lt;/td&gt;
&lt;td&gt;Fletcher&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;826&lt;/td&gt;
&lt;td&gt;453&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;-O2:&lt;/td&gt;
&lt;td&gt;316&lt;/td&gt;
&lt;td&gt;133&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;-O3:&lt;/td&gt;
&lt;td&gt;42&lt;/td&gt;
&lt;td&gt;75&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;p&gt;So, though using Fletcher doubles the performance, -O3 optimizes InnoDB checksumming much better. How many folks do run -O3 compiled mysqld?&lt;/p&gt;</description>
            
            <pubDate>Thu, 29 May 2008 13:16:54 -0700</pubDate>
        </item>
            
        <item>
            <title>InnoDB map: bulk inserting</title>
            <link>http://swik.net/MySQL/Planet+MySQL/InnoDB+map%3A+bulk+inserting/b5yug</link>
            <description>&lt;p&gt;So, what does InnoDB do while you&amp;#8217;re loading the data in &lt;a href=&quot;http://dammit.lt/2008/05/26/insert-speed-paramy-auto-inc/&quot;&gt;parallel?&lt;/a&gt;&lt;br/&gt;
It looks something like this:&lt;br/&gt;
&lt;a href=&quot;http://flake.defau.lt/mysql5-insert-work.png&quot;&gt;&lt;img src=&quot;http://flake.defau.lt/mysql5-insert-work-thumb.png&quot;/&gt;&lt;/a&gt;&lt;br/&gt;
Click on image for larger (8MB) version, if you dare, have efficient browser and lots of spare RAM (7k*10k canvas). Generated by:&lt;/p&gt;
&lt;pre&gt;&lt;a href=&quot;http://oprofile.sourceforge.net/about/&quot;&gt;opreport&lt;/a&gt; | &lt;a href=&quot;http://code.google.com/p/jrfonseca/wiki/Gprof2Dot&quot;&gt;Gprof2Dot&lt;/a&gt; | &lt;a href=&quot;http://www.graphviz.org/&quot;&gt;dot&lt;/a&gt;&lt;/pre&gt;</description>
            
            <pubDate>Tue, 27 May 2008 14:16:57 -0700</pubDate>
        </item>
            
        <item>
            <title>MySQL: How do you install innotop to monitor innodb in real time?</title>
            <link>http://swik.net/MySQL/Planet+MySQL/MySQL%3A+How+do+you+install+innotop+to+monitor+innodb+in+real+time%3F/b5kv0</link>
            <description>Innotop is a very useful tool to monitor innodb information in real time.  This tool is written by Baron Schwartz who is also an author of &amp;#8220;High Performance MySQL, Second edition&amp;#8221; book. [Side note: I highly recommend getting this book when it comes out (in June, 08?).  Other authors include: Peter Zaitsev, Jeremy [...]&lt;div class=&quot;feedflare&quot;&gt;
&lt;a href=&quot;http://feeds.feedburner.com/~f/crazytoon?a=Uorzph&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~f/crazytoon?i=Uorzph&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~f/crazytoon?a=z3f13H&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~f/crazytoon?i=z3f13H&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~f/crazytoon?a=6wpryH&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~f/crazytoon?i=6wpryH&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~f/crazytoon?a=6u52TH&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~f/crazytoon?i=6u52TH&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~f/crazytoon?a=sVknuh&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~f/crazytoon?i=sVknuh&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~f/crazytoon?a=lAnRKh&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~f/crazytoon?i=lAnRKh&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~f/crazytoon?a=qEGTpH&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~f/crazytoon?i=qEGTpH&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~f/crazytoon?a=7ryv9H&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~f/crazytoon?i=7ryv9H&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~f/crazytoon?a=Hulzdh&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~f/crazytoon?i=Hulzdh&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~f/crazytoon?a=UkPlDH&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~f/crazytoon?i=UkPlDH&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href=&quot;http://feeds.feedburner.com/~f/crazytoon?a=sae6Vh&quot;&gt;&lt;img src=&quot;http://feeds.feedburner.com/~f/crazytoon?i=sae6Vh&quot; border=&quot;0&quot;&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/crazytoon/~4/294901230&quot; height=&quot;1&quot; width=&quot;1&quot;/&gt;</description>
            
            <pubDate>Wed, 21 May 2008 03:14:55 -0700</pubDate>
        </item>
            
        <item>
            <title>InnoDB Website &quot; Home</title>
            <link>http://swik.net/opensource/del.icio.us+tag%2Fopensource/InnoDB+Website+%22+Home/b5fbt</link>
            <description></description>
            
            <pubDate>Mon, 19 May 2008 09:19:45 -0700</pubDate>
        </item>
            
        <item>
            <title>SHOW INNODB LOCKS</title>
            <link>http://swik.net/MySQL/Planet+MySQL/SHOW+INNODB+LOCKS/b460m</link>
            <description>&lt;p&gt;If &lt;a href=&quot;http://svn.wikimedia.org/viewvc/mysql?view=rev&amp;#038;revision=10&quot;&gt;implementing&lt;/a&gt; &amp;#8216;SHOW INNODB LOCKS&amp;#8217; took half an hour (literally, includes compiling and testing) for a non-developer type of guy (cause most of code was written anyway), why the heck it takes ten years (or more?) to get such feature to standard release?&lt;/p&gt;</description>
            
            <pubDate>Fri, 16 May 2008 10:14:34 -0700</pubDate>
        </item>
            
        <item>
            <title>Sample my.cnf file for InnoDB databases</title>
            <link>http://swik.net/MySQL/Planet+MySQL/Sample+my.cnf+file+for+InnoDB+databases/b4waj</link>
            <description>Brian Moon suggest that community provided example my.cnf files would be a great thing to have on MySQLforge in this recent post: &lt;a href=&quot;http://doughboy.wordpress.com/2008/05/06/example-mycnf-files/&quot;&gt;http://doughboy.wordpress.com/2008/05/06/example-mycnf-files/&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;I pulled out the &quot;innodb heavy&quot; config sample file and modified it with the standard settings that I typically start with when setting up a new InnoDB master.  I&#039;ve also modified the comments in the file a bit and have added some of my own too.  I removed the sample slave configuration parameters (master-host, etc) because you should be using &#039;CHANGE MASTER TO&#039;.&lt;br/&gt;&lt;br/&gt;He suggested tagging such files with a &#039;mycnf&#039; tag and very kindly tagged mine after I posted it :)&lt;br/&gt;&lt;br/&gt;Feel free to share yours too and please feel free to make any comments about my configuration choices.&lt;br/&gt;&lt;br/&gt;You can find it here (along with any other mycnf tagged files):&lt;br/&gt;&lt;a href=&quot;http://forge.mysql.com/tools/search.php?t=tag&amp;k=mycnf&quot;&gt;http://forge.mysql.com/tools/search.php?t=tag&amp;k=mycnf&lt;/a&gt;</description>
            
            <pubDate>Wed, 07 May 2008 14:11:54 -0700</pubDate>
        </item>
            
        <item>
            <title>InnoDB not releasing a row lock?</title>
            <link>http://swik.net/MySQL/Planet+MySQL/InnoDB+not+releasing+a+row+lock%3F/b4uj8</link>
            <description>&lt;p&gt;This is a bit surprise when we encountered a case where InnoDB is not releasing its row lock when there is an error condition within the transaction. And I verified with Falcon, Oracle, SQL Server and Sybase; all seemed to work as expected.&lt;/p&gt;
&lt;p&gt;For example; just open a transaction in a session and execute a error statement (lets say duplicate key) and on the other new session try to get a row lock on the same record (use where clause with FOR UPDATE) and you will notice that InnoDB blocks on this statement until you issue a explicit rollback or commit. But remember there is nothing happened on the first session other than duplicate error on that row. So, InnoDB should implicitly unlock the row when there is an error; and looks like it is not doing that.&lt;/p&gt;
&lt;p&gt;Here is the scenario:&lt;/p&gt;
&lt;p&gt;First create a single column table and populate some rows (lets say 20 rows in this case) on any version of &lt;a href=&quot;http://www.mysql.com&quot; class=&quot;alinks_links&quot; title=&quot;MySQL Inc&quot; rel=&quot;external&quot;&gt;MySQL&lt;/a&gt;/InnoDB.&lt;/p&gt;
&lt;div&gt;
&lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 55.86%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; height: 173px; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;mysql&amp;gt; &lt;span style=&quot;color: #0000ff&quot;&gt;create&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;table&lt;/span&gt; t1(c1 &lt;span style=&quot;color: #0000ff&quot;&gt;int&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;not&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;null&lt;/span&gt; auto_increment &lt;span style=&quot;color: #0000ff&quot;&gt;primary&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;key&lt;/span&gt;)Engine=InnoDB;
Query OK, 0 &lt;span style=&quot;color: #0000ff&quot;&gt;rows&lt;/span&gt; affected (0.14 sec)

mysql&amp;gt; insert &lt;span style=&quot;color: #0000ff&quot;&gt;into&lt;/span&gt; t1 &lt;span style=&quot;color: #0000ff&quot;&gt;values&lt;/span&gt;(),(),(),(),(),(),(),(),(),();
Query OK, 10 &lt;span style=&quot;color: #0000ff&quot;&gt;rows&lt;/span&gt; affected (0.12 sec)
Records: 10  Duplicates: 0  Warnings: 0

mysql&amp;gt; insert &lt;span style=&quot;color: #0000ff&quot;&gt;into&lt;/span&gt; t1 &lt;span style=&quot;color: #0000ff&quot;&gt;values&lt;/span&gt;(),(),(),(),(),(),(),(),(),();
Query OK, 10 &lt;span style=&quot;color: #0000ff&quot;&gt;rows&lt;/span&gt; affected (0.01 sec)
Records: 10  Duplicates: 0  Warnings: 0&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;and then execute the following statements; first in session-I and then in session-II and notice that session-II select statement hangs till you explicitly release the transaction in session-I.&lt;/p&gt;
&lt;table cellspacing=&quot;0&quot; cellpadding=&quot;2&quot; width=&quot;400&quot; border=&quot;2&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td valign=&quot;top&quot; width=&quot;200&quot;&gt;&lt;strong&gt;Session-I&lt;/strong&gt;&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;200&quot;&gt;&lt;strong&gt;Session-II&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign=&quot;top&quot; width=&quot;200&quot;&gt;
&lt;div&gt;
&lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;mysql&amp;gt; &lt;span style=&quot;color: #0000ff&quot;&gt;begin&lt;/span&gt;;
Query OK, 0 &lt;span style=&quot;color: #0000ff&quot;&gt;rows&lt;/span&gt; affected (0.00 sec)

mysql&amp;gt; insert &lt;span style=&quot;color: #0000ff&quot;&gt;into&lt;/span&gt; t1 &lt;span style=&quot;color: #0000ff&quot;&gt;values&lt;/span&gt;(10);
ERROR 1062 (23000): Duplicate entry &lt;span style=&quot;color: #006080&quot;&gt;&amp;#8216;10&amp;#8242;&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;for&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;key&lt;/span&gt; &lt;span style=&quot;color: #006080&quot;&gt;&amp;#8216;PRIMARY&amp;#8217;&lt;/span&gt;&lt;/pre&gt;
&lt;/p&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;200&quot;&gt;
&lt;div&gt;
&lt;pre style=&quot;padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none&quot;&gt;mysql&amp;gt; &lt;span style=&quot;color: #0000ff&quot;&gt;begin&lt;/span&gt;;
Query OK, 0 &lt;span style=&quot;color: #0000ff&quot;&gt;rows&lt;/span&gt; affected (0.00 sec)

mysql&amp;gt; &lt;span style=&quot;color: #0000ff&quot;&gt;select&lt;/span&gt; * &lt;span style=&quot;color: #0000ff&quot;&gt;from&lt;/span&gt; t1 &lt;span style=&quot;color: #0000ff&quot;&gt;where&lt;/span&gt; c1=10 &lt;span style=&quot;color: #0000ff&quot;&gt;for&lt;/span&gt; &lt;span style=&quot;color: #0000ff&quot;&gt;update&lt;/span&gt;;&lt;/pre&gt;
&lt;/p&gt;&lt;/div&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Even though am not really sure whether this is a bug or feature in InnoDB (I suspect this as a bug); but Oracle, SQL Server or Sybase will not block the select and releases the lock on the duplicate error. Even &lt;strong&gt;Falcon &lt;/strong&gt;engine&lt;strong&gt; in MySQL 6.0&lt;/strong&gt; does seem to release the lock appropriately.&lt;/p&gt;</description>
            
            <pubDate>Mon, 05 May 2008 07:11:47 -0700</pubDate>
        </item>
            
        <item>
            <title>News flash: MySQL 5.1 has zero bugs</title>
            <link>http://swik.net/MySQL/Planet+MySQL/News+flash%3A+MySQL+5.1+has+zero+bugs/b4s43</link>
            <description>&lt;p&gt;&lt;a href=&quot;http://www.eweek.com/c/a/Database/CEO-Calls-MySQLs-the-Ferrari-of-Databases/&quot;&gt;Zack Urlocker says MySQL 5.1 has zero bugs&lt;/a&gt;.  He may have been misquoted, or quoted out of context, but there it is.  I&amp;#8217;ll quote enough of it that you can&amp;#8217;t take it out of context twice:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Mickos also said MySQL 5.1 has upgraded its reliability and ease of use over 2005&amp;#8217;s v5.0.&lt;/p&gt;

&lt;p&gt;&amp;#8220;Now we can admit it, but this version is much improved over 5.0, which we weren&amp;#8217;t totally happy with,&amp;#8221; Mickos confided.&lt;/p&gt;

&lt;p&gt;He reported that more than 1,300 bugs (997 in 2007, 386 so far in 2008) have been fixed in v5.1, and that, according to standard DBT2 benchmarks, the performance of v5.1 is 10 to 15 percent better than the previous version.&lt;/p&gt;

&lt;p&gt;&amp;#8220;This version now has zero bugs,&amp;#8221; Urlocker told eWEEK.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You can check for yourself at the &lt;a href=&quot;http://bugs.mysql.com/bugstats.php&quot;&gt;MySQL bug statistics&lt;/a&gt; page.&lt;/p&gt;

&lt;p&gt;Of course it&amp;#8217;s not true.  But what did Zack really say, I wonder?&lt;/p&gt;&lt;a href=&quot;http://www.xaprb.com/blog/tag/bugs/&quot; rel=&quot;tag&quot;&gt;bugs&lt;/a&gt;, &lt;a href=&quot;http://www.xaprb.com/blog/tag/innodb/&quot; rel=&quot;tag&quot;&gt;innodb&lt;/a&gt;, &lt;a href=&quot;http://www.xaprb.com/blog/tag/marten-mickos/&quot; rel=&quot;tag&quot;&gt;Marten Mickos&lt;/a&gt;, &lt;a href=&quot;http://www.xaprb.com/blog/tag/mysql/&quot; rel=&quot;tag&quot;&gt;mysql&lt;/a&gt;, &lt;a href=&quot;http://www.xaprb.com/blog/tag/zach-urlocker/&quot; rel=&quot;tag&quot;&gt;Zach Urlocker&lt;/a&gt;</description>
            
            <pubDate>Fri, 02 May 2008 19:11:16 -0700</pubDate>
        </item>
            
        <item>
            <title>MySQL and the Linux swap problem</title>
            <link>http://swik.net/MySQL/Planet+MySQL/MySQL+and+the+Linux+swap+problem/b4skt</link>
            <description>&lt;p&gt;Ever since Peter over at &lt;a href=&quot;http://www.percona.com/&quot;&gt;Percona&lt;/a&gt; wrote about &lt;a href=&quot;http://www.mysqlperformanceblog.com/2008/04/06/should-you-have-your-swap-file-enabled-while-running-mysql/&quot;&gt;MySQL and swap&lt;/a&gt;, I&amp;#8217;ve been meaning to write this post.  But after I saw &lt;a href=&quot;http://mysqldba.blogspot.com/2008/05/linux-64-bit-mysql-swap-and-memory.html&quot;&gt;Dathan Pattishall&amp;#8217;s post on the subject&lt;/a&gt;, I knew I&amp;#8217;d better actually do it.  &lt;img src=&quot;http://blogs.smugmug.com/don/wp-includes/images/smilies/icon_smile.gif&quot; alt=&quot;)&quot; class=&quot;wp-smiley&quot;/&gt; &lt;/p&gt;
&lt;p&gt;There&amp;#8217;s a nasty problem with Linux 2.6 even when you have a ton of RAM.  No matter what you do, including setting /proc/sys/vm/swappiness = 0, your OS is going to prefer swapping stuff out rather than freeing up system cache.  On a single-use machine, where the application is better at utilizing RAM than the system is, this is incredibly stupid.  Our MySQL boxes are a perfect example - they run only MySQL and we want InnoDB to have a lot of RAM (32-64GB  &amp;#8230; and we&amp;#8217;re testing 128GB).&lt;/p&gt;
&lt;p&gt;You can&amp;#8217;t just not have any swap partitions, though, or kswapd will literally dominate one of your CPU cores doing who-knows-what.  But you can&amp;#8217;t have it swapping to disk, or your performance goes into the toilet.  So what to do?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Our solution is to make swap partitions out of RAM disks.&lt;/strong&gt;  Yes, I realize how insane that sounds, but the Linux kernel&amp;#8217;s insanity drove us to it.  Best part?  It works.  Here&amp;#8217;s how:&lt;/p&gt;
&lt;pre class=&quot;codebox&quot;&gt;&lt;code&gt;mkdir /mnt/ram0
mkfs.ext3 -m 0 /dev/ram0
mount /dev/ram0 /mnt/ram0
dd bs=1024 count=14634 if=/dev/zero of=/mnt/ram0/swapfile
mkswap /mnt/ram0/swapfile
swapon /mnt/ram0/swapfile&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That&amp;#8217;ll give you a 14MB swap partition that&amp;#8217;s actually in RAM, so it&amp;#8217;s super-fast.  This assumes your kernel is creating 16MB ramdisk partitions, but you can adjust your kernel paramenters and/or the &amp;#8216;dd&amp;#8217; line above to suit whatever size you want.&lt;/p&gt;
&lt;p&gt;We&amp;#8217;ve found that anywhere from 20MB-40MB tends to be enough (so use /dev/ram1, /dev/ram2, etc), depending on load of the box.  kswapd no longer uses any noticeable CPU, there&amp;#8217;s always a few MB of free &amp;#8220;swap&amp;#8221;, and life is back in the fast lane.  Just add those lines to your relevant startup file, like /etc/rc.d/rc.local, and it&amp;#8217;ll persist after reboots.&lt;/p&gt;
&lt;p&gt;Some Linux purists will probably hate this approach, others may have more efficient ways of achieving the same thing, but this works for us.  Give it a shot.  &lt;img src=&quot;http://blogs.smugmug.com/don/wp-includes/images/smilies/icon_smile.gif&quot; alt=&quot;)&quot; class=&quot;wp-smiley&quot;/&gt; &lt;/p&gt;
&lt;p&gt;Oh, and I hope it goes without saying, but make *darn* sure you know what you&amp;#8217;re running on your box and what the maximum RAM footprint will be before you try running with only 20-40MB of swap.  We&amp;#8217;ve never OOMed (Out-Of-Memory) a production MySQL box - but that&amp;#8217;s because we&amp;#8217;re careful.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;UPDATE:&lt;/strong&gt; See what happens when I wait to blog?  I forget that I read another &lt;a href=&quot;http://feedblog.org/2007/09/29/using-o_direct-on-linux-and-innodb-to-fix-swap-insanity/&quot;&gt;related post over on Kevin Burton&amp;#8217;s blog&lt;/a&gt;.  Like Kevin, we&amp;#8217;re using O_DIRECT, but unlike Kevin, this doesn&amp;#8217;t solve the problem for us.  Linux still swaps.  We use the latest  2.6.18-53.1.14.el5 kernel from CentOS 5, btw. (Sorry, had posted 2.6.9 because I was dumb.  We&amp;#8217;re fully patched)&lt;/p&gt;</description>
            
            <pubDate>Thu, 01 May 2008 22:10:34 -0700</pubDate>
        </item>
            
        <item>
            <title>InnoDB plugin row format performance</title>
            <link>http://swik.net/MySQL/Planet+MySQL/InnoDB+plugin+row+format+performance/b4ndy</link>
            <description>&lt;p&gt;Here is a quick comparison of the new &lt;a href=&quot;http://www.innodb.com/innodb_plugin/&quot;&gt;InnoDB plugin&lt;/a&gt; performance between different &lt;a href=&quot;http://www.innodb.com/doc/innodb_plugin-1.0/innodb-compression.html#innodb-compression-enabling&quot;&gt;compression, row formats&lt;/a&gt; that is introduced recently.&lt;/p&gt;
&lt;p&gt;The table is a pretty simple one:&lt;/p&gt;
&lt;pre class=&quot;csharpcode&quot;&gt;&lt;span class=&quot;kwrd&quot;&gt;CREATE&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;TABLE&lt;/span&gt; `sbtest` (
  `id` &lt;span class=&quot;kwrd&quot;&gt;int&lt;/span&gt;(10) unsigned &lt;span class=&quot;kwrd&quot;&gt;NOT&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;NULL&lt;/span&gt;,
  `k` &lt;span class=&quot;kwrd&quot;&gt;int&lt;/span&gt;(10) unsigned &lt;span class=&quot;kwrd&quot;&gt;NOT&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;NULL&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;DEFAULT&lt;/span&gt; &lt;span class=&quot;str&quot;&gt;&amp;#8216;0&amp;#8242;&lt;/span&gt;,
  `c` &lt;span class=&quot;kwrd&quot;&gt;char&lt;/span&gt;(120) &lt;span class=&quot;kwrd&quot;&gt;NOT&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;NULL&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;DEFAULT&lt;/span&gt; &lt;span class=&quot;str&quot;&gt;&amp;#8221;&lt;/span&gt;,
  `&lt;span class=&quot;kwrd&quot;&gt;pad&lt;/span&gt;` &lt;span class=&quot;kwrd&quot;&gt;char&lt;/span&gt;(60) &lt;span class=&quot;kwrd&quot;&gt;NOT&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;NULL&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;DEFAULT&lt;/span&gt; &lt;span class=&quot;str&quot;&gt;&amp;#8221;&lt;/span&gt;,
  &lt;span class=&quot;kwrd&quot;&gt;PRIMARY&lt;/span&gt; &lt;span class=&quot;kwrd&quot;&gt;KEY&lt;/span&gt; (`id`),
  &lt;span class=&quot;kwrd&quot;&gt;KEY&lt;/span&gt; `k` (`k`)
) ENGINE=InnoDB ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=8;&lt;/pre&gt;
&lt;style type=&quot;text/css&quot;&gt;
&lt;p&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, &quot;Courier New&quot;, courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;
&lt;style type=&quot;text/css&quot;&gt;
&lt;p&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, &quot;Courier New&quot;, courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;
&lt;p&gt;The table is populated with 10M rows with average row length being 224 bytes. The tests are performed for Compact, Dynamic and Compressed (8K and 4K)&amp;#160; row formats using &lt;a href=&quot;http://www.mysql.com&quot; class=&quot;alinks_links&quot; title=&quot;MySQL Inc&quot; rel=&quot;external&quot;&gt;MySQL&lt;/a&gt;-5.1.24 with InnoDB plugin-1.0.0-5.1 on Dell PE2950&amp;#160; 1x Xeon quad core with 16G RAM, RAID-10 with &lt;strong&gt;RHEL-4 64-bit&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Here are the four test scenarios:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;No compression, ROW_FORMAT=Compact &lt;/li&gt;
&lt;li&gt;ROW_FORMAT=Compressed with KEY_BLOCK_SIZE=8 &lt;/li&gt;
&lt;li&gt;ROW_FORMAT=Compressed with KEY_BLOCK_SIZE=4 &lt;/li&gt;
&lt;li&gt;ROW_FORMAT=Dynamic &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;All the above tests are repeated with &lt;em&gt;&lt;strong&gt;innodb_buffer_pool_size=6G&lt;/strong&gt;&lt;/em&gt; and &lt;strong&gt;512M&lt;/strong&gt; to make sure one fits everything in memory and another one overflows. The rest of the InnoDB settings are all default except that &lt;em&gt;&lt;strong&gt;innodb_thread_concurrency=32&lt;/strong&gt;&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Here is the summary of the test results:&lt;/p&gt;
&lt;p&gt;&lt;span id=&quot;more-275&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;u&gt;Table Load:&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Load time from a dump of SQL script having 10M rows (not batched)&lt;/p&gt;
&lt;table cellspacing=&quot;0&quot; cellpadding=&quot;2&quot; width=&quot;388&quot; border=&quot;2&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td valign=&quot;top&quot; width=&quot;93&quot;&gt;&lt;strong&gt;Compact&lt;/strong&gt;&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;110&quot;&gt;&lt;strong&gt;Compressed (8K)&lt;/strong&gt;&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;110&quot;&gt;&lt;strong&gt;Compressed (4K)&lt;/strong&gt;&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;71&quot;&gt;&lt;strong&gt;Dynamic&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign=&quot;top&quot; width=&quot;96&quot;&gt;28m 18s&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;112&quot;&gt;29m 46s&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;111&quot;&gt;36m 43s&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;74&quot;&gt;27m 55s&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;&lt;u&gt;File Sizes:&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Here is the size of the .ibd file after each data load&lt;/p&gt;
&lt;table cellspacing=&quot;0&quot; cellpadding=&quot;2&quot; width=&quot;388&quot; border=&quot;2&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td valign=&quot;top&quot; width=&quot;93&quot;&gt;&lt;strong&gt;Compact&lt;/strong&gt;&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;110&quot;&gt;&lt;strong&gt;Compressed (8K)&lt;/strong&gt;&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;110&quot;&gt;&lt;strong&gt;Compressed (4K)&lt;/strong&gt;&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;71&quot;&gt;&lt;strong&gt;Dynamic&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign=&quot;top&quot; width=&quot;96&quot;&gt;2.3G&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;112&quot;&gt;1.2G&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;111&quot;&gt;592M&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;74&quot;&gt;2.3G&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;&lt;u&gt;Data and Index Size from Table Status:&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Here is the Data and Index size in bytes from SHOW TABLE STATUS and you can see the original data size here rather than the compressed size&lt;/p&gt;
&lt;table cellspacing=&quot;0&quot; cellpadding=&quot;2&quot; width=&quot;432&quot; border=&quot;2&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td valign=&quot;top&quot; width=&quot;54&quot;&gt;&amp;#160;&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;91&quot;&gt;&lt;strong&gt;Compact&lt;/strong&gt;&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;101&quot;&gt;&lt;strong&gt;Compressed (8K)&lt;/strong&gt;&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;105&quot;&gt;&lt;strong&gt;Compressed (4K)&lt;/strong&gt;&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;77&quot;&gt;&lt;strong&gt;Dynamic&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign=&quot;top&quot; width=&quot;56&quot;&gt;Data&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;91&quot;&gt;2247098368&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;101&quot;&gt;2247098368&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;104&quot;&gt;2249195520&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;81&quot;&gt;2247098368&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign=&quot;top&quot; width=&quot;56&quot;&gt;Index&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;91&quot;&gt;137019392&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;100&quot;&gt;137035776&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;103&quot;&gt;160301056&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;84&quot;&gt;137019392&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;&lt;u&gt;Compression Stats:&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Here is the compression stats after the table is populated from information_schema.InnoDB_cmp; and you notice that 4K takes more operations and time for both compression and un-compression&lt;/p&gt;
&lt;table cellspacing=&quot;0&quot; cellpadding=&quot;2&quot; width=&quot;400&quot; border=&quot;2&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td valign=&quot;top&quot; width=&quot;57&quot;&gt;&amp;#160;&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;57&quot;&gt;Page_size&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;57&quot;&gt;Compress_ops&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;57&quot;&gt;Compress_ops_ok&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;57&quot;&gt;Compress_time&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;57&quot;&gt;Uncompress_ops&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;57&quot;&gt;Uncompress_time&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign=&quot;top&quot; width=&quot;57&quot;&gt;8K&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;57&quot;&gt;8192&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;57&quot;&gt;446198&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;57&quot;&gt;445598&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;57&quot;&gt;73&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;57&quot;&gt;300&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;57&quot;&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign=&quot;top&quot; width=&quot;57&quot;&gt;4K&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;57&quot;&gt;4096&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;57&quot;&gt;1091421&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;57&quot;&gt;1012917&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;57&quot;&gt;463&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;57&quot;&gt;38801&lt;/td&gt;
&lt;td valign=&quot;top&quot; width=&quot;57&quot;&gt;13&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;&lt;u&gt;Performance:&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Here is the performance of various row formats with threads ranging from 1-512 for both 512M and 6G buffer pool size for both concurrent reads and writes.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://venublog.com/images/InnoDBplugin1.0someperformancenotes_D6A/compress512m.gif&quot;&gt;&lt;img style=&quot;border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px&quot; height=&quot;300&quot; alt=&quot;compress512m&quot; src=&quot;http://venublog.com/images/InnoDBplugin1.0someperformancenotes_D6A/compress512m_thumb.gif&quot; width=&quot;572&quot; border=&quot;0&quot;/&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://venublog.com/images/InnoDBplugin1.0someperformancenotes_D6A/compress6g.gif&quot;&gt;&lt;img style=&quot;border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px&quot; height=&quot;335&quot; alt=&quot;compress6g&quot; src=&quot;http://venublog.com/images/InnoDBplugin1.0someperformancenotes_D6A/compress6g_thumb.gif&quot; width=&quot;579&quot; border=&quot;0&quot;/&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;u&gt;Observations:&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Few key observations from the performance tests that I performed without looking to any of the sources, as I could be wrong, someone can correct me here. Its hard to draw from these input scenarios, but helps to estimate what is what.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The load time is almost same except that the 4K compression seems to take longer than the rest; and compression in general is hitting the INSERT/Load performance a little bit. &lt;/li&gt;
&lt;li&gt;Compact or Dynamic, there is no compression; so the data and index file sizes will be almost same &lt;/li&gt;
&lt;li&gt;The SHOW TABLE STATUS for compressed table will have its original Data_Length and Index_Length statistics rather than the compressed statistics (may be a bug or InnoDB needs to extend SHOW TABLE STATUS to show any compressed sizes or other means, right now only option is to view your files manually) &lt;/li&gt;
&lt;li&gt;8K compression reduced the .ibd file by nearly 50% (1.2G out of 2.3G) and 4K compression reduced the size by 1/4th (592M out of 2.3G); and it could vary based on table types and data. &lt;/li&gt;
&lt;li&gt;8K compression takes less ops and time for both compression and de-compression when compared to 4K (obvious) &lt;/li&gt;
&lt;li&gt;When there is enough Innodb buffer pool size to act data in memory, the compression is a bit overhead, but you will be saving space &lt;/li&gt;
&lt;li&gt;When there is a overflow from buffer pool (IO bound), compression seems to really help &lt;/li&gt;
&lt;li&gt;4K compression in general seems to be slower when compared with 8K or any other row_format.&lt;br/&gt;
&lt;style type=&quot;text/css&quot;&gt;
&lt;p&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, &quot;Courier New&quot;, courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;
&lt;style type=&quot;text/css&quot;&gt;
&lt;p&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, &quot;Courier New&quot;, courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;
&lt;style type=&quot;text/css&quot;&gt;
&lt;p&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, &quot;Courier New&quot;, courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;
&lt;/li&gt;
&lt;/ul&gt;</description>
            
            <pubDate>Fri, 25 Apr 2008 06:20:09 -0700</pubDate>
        </item>
            
        <item>
            <title>MySQL Engines: MyISAM vs. InnoDB</title>
            <link>http://swik.net/MySQL/Planet+MySQL/MySQL+Engines%3A+MyISAM+vs.+InnoDB/b4nc2</link>
            <description>&lt;h2&gt;Why use InnoDB?&lt;/h2&gt;
&lt;p&gt;InnoDB is commonly viewed as anything but performant, especially when compared to MyISAM. Many actually call it slow. This view is mostly supported by old facts and mis-information. In reality, you would be very hard-pressed to find a current, production-quality MySQL Database Engine with the CPU efficiency of InnoDB. It has its performance &quot;quirks&quot; and there are definitely workloads for which it is not optimal, but for standard OLTP (Online Transaction Processing) loads, it is tough to find a better, safer fit.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://tag1consulting.com/MySQL_Engines_MyISAM_vs_InnoDB&quot;&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
            
            <pubDate>Fri, 25 Apr 2008 05:19:10 -0700</pubDate>
        </item>
            
        <item>
            <title>Notes from Falcon from the beginning</title>
            <link>http://swik.net/MySQL/Planet+MySQL/Notes+from+Falcon+from+the+beginning/b4b07</link>
            <description>&lt;p&gt;Here is the quick notes from the session &lt;strong&gt;Falcon from the beginning&lt;/strong&gt; by &lt;a href=&quot;http://en.wikipedia.org/wiki/Jim_Starkey&quot;&gt;Jim Starkey&lt;/a&gt; and Ann Harrison&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Why Falcon
&lt;ul&gt;
&lt;li&gt;Hardware is evolving rapidly, world is changing, so taking advantage&lt;/li&gt;
&lt;li&gt;Customers need ACID transactions&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Where hardware is going
&lt;ul&gt;
&lt;li&gt;CPUS breed like rabbits (more sockets, cores, threads/core)&lt;/li&gt;
&lt;li&gt;Memory is bigger, faster and cheaper&lt;/li&gt;
&lt;li&gt;Disks are bigger and cheaper but not much faster&lt;/li&gt;
&lt;li&gt;In general boxes are getting cheaper&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Where applications are going
&lt;ul&gt;
&lt;li&gt;batch - dead&lt;/li&gt;
&lt;li&gt;timesharing - dead&lt;/li&gt;
&lt;li&gt;departmental computing - dead&lt;/li&gt;
&lt;li&gt;client server - fading fast&lt;/li&gt;
&lt;li&gt;application servers for most of us&lt;/li&gt;
&lt;li&gt;web services for the really big buys&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Database Challenges
&lt;ul&gt;
&lt;li&gt;Traditional challenge&lt;/li&gt;
&lt;li&gt;exhaust CPU, memory and disk simultaneously&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Tradeoffs
&lt;ul&gt;
&lt;li&gt;use memory to page cache to avoid disk reads&lt;/li&gt;
&lt;li&gt;record cache to avoid page cache manipulation&lt;/li&gt;
&lt;li&gt;use CPU to find the fastest path to record&lt;/li&gt;
&lt;li&gt;use CPU to minimize record size&lt;/li&gt;
&lt;li&gt;Synchronize most data structures with user mode read/write locks&lt;/li&gt;
&lt;li&gt;Synchronize high contention data structures with interlocked instructions&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Architecture
&lt;ul&gt;
&lt;li&gt;Incomplete in-memory db with disk backfill&lt;/li&gt;
&lt;li&gt;Multi-version concurrency control in memory&lt;/li&gt;
&lt;li&gt;Updates in memory until commit&lt;/li&gt;
&lt;li&gt;Group commits to a single serial log write&lt;/li&gt;
&lt;li&gt;post-commit multi-threaded pipe line to move updates to disk&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Incomplete in-memory database
&lt;ul&gt;
&lt;li&gt;records cached in memory&lt;/li&gt;
&lt;li&gt;separate cache for disk pages&lt;/li&gt;
&lt;li&gt;record cache hits 15% the cost of a page cache hit&lt;/li&gt;
&lt;li&gt;record cache is more memory efficient than page cache&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Record Encoding - cache efficiency
&lt;ul&gt;
&lt;li&gt;records encoded by value, not declaration&lt;/li&gt;
&lt;li&gt;string &amp;#8220;abc&amp;#8221; occupies the same space in varchar(3) or varchar(4096)&lt;/li&gt;
&lt;li&gt;the number 7 is the same where small, medium, int, bigint, decimal or numeric&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;MVCC
&lt;ul&gt;
&lt;li&gt;update ops create new record versions&lt;/li&gt;
&lt;li&gt;new one is tagged with id, points to old version&lt;/li&gt;
&lt;li&gt;keep tracks which&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Updates are in memory
&lt;ul&gt;
&lt;li&gt;held in memory pending commit&lt;/li&gt;
&lt;li&gt;index changes held in memory&lt;/li&gt;
&lt;li&gt;verb rollback is dirt cheap&lt;/li&gt;
&lt;li&gt;trxs rollback is dirt cheap&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;At commit
&lt;ul&gt;
&lt;li&gt;pending record updates flushed to serial log&lt;/li&gt;
&lt;li&gt;pending index updates flushed to serial log&lt;/li&gt;
&lt;li&gt;commit record written to serial log&lt;/li&gt;
&lt;li&gt;serial log flushed to the oxide&lt;/li&gt;
&lt;li&gt;and trx is also committed&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Memory is infinite, so
&lt;ul&gt;
&lt;li&gt;large txns chills uncommitted data (flushes it to the log early)&lt;/li&gt;
&lt;li&gt;chilled records can be thawed&lt;/li&gt;
&lt;li&gt;scavenger garbage collects unloved records periodically&lt;/li&gt;
&lt;li&gt;when things get really had, entire record chains flushed to backlog&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Weakness
&lt;ul&gt;
&lt;li&gt;transactions are ACID but not serializable&lt;/li&gt;
&lt;li&gt;latency advantage disappears at saturation&lt;/li&gt;
&lt;li&gt;very large transactions degrade performance&lt;/li&gt;
&lt;li&gt;optimized for web, not batch&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Strengths
&lt;ul&gt;
&lt;li&gt;runs like a memory db when data fits&lt;/li&gt;
&lt;li&gt;scales like disk-based db when db doesn&amp;#8217;t fit in cache&lt;/li&gt;
&lt;li&gt;lowest possible latency for web apps&lt;/li&gt;
&lt;li&gt;absorbs huge spiky loads&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Performance
&lt;ul&gt;
&lt;li&gt;benchmark against InnoDB vs Falcon only&lt;/li&gt;
&lt;li&gt;DBT2 benchmark (what about sysbench?)&lt;/li&gt;
&lt;li&gt;High contention&lt;/li&gt;
&lt;li&gt;Writes intensive - 40% records touched are updated&lt;/li&gt;
&lt;li&gt;measures only performance at saturation&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;DBT2 is InnoDB&amp;#8217;s best spot and Falcon&amp;#8217;s worst, so do not take benchmark results, decide on what you want&lt;/li&gt;
&lt;li&gt;When should you use what ?
&lt;ul&gt;
&lt;li&gt;don&amp;#8217;t need ACID ? then MyISAM is good&lt;/li&gt;
&lt;li&gt;single processor, small memory - InnoDB is good&lt;/li&gt;
&lt;li&gt;large transactions, batch inserts/updates, InnoDB is good&lt;/li&gt;
&lt;li&gt;multi cores, more memory, more threads , use Falcon&lt;/li&gt;
&lt;li&gt;For web, Falcon is hard to beat&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</description>
            
            <pubDate>Wed, 16 Apr 2008 13:16:49 -0700</pubDate>
        </item>
            
        <item>
            <title>InnoDB 1.0: “Fast index creation: add or drop indexes without copying the data”</title>
            <link>http://swik.net/Kellan-Elliot-Mcrea/Laughing+Meme/InnoDB+1.0%3A+%E2%80%9CFast+index+creation%3A+add+or+drop+indexes+without+copying+the+data%E2%80%9D/b4bub</link>
            <description>&lt;p&gt;Because the write locking happens at data copy time.  If this pans out looks like they&amp;#8217;ll have managed to stay focused post-Oracle acquisition.&lt;/p&gt;</description>
            
            <pubDate>Wed, 16 Apr 2008 08:19:09 -0700</pubDate>
        </item>
            
        <item>
            <title>MySQL Conference and Expo 2008, Day One</title>
            <link>http://swik.net/MySQL/Planet+MySQL/MySQL+Conference+and+Expo+2008%2C+Day+One/b4bju</link>
            <description>&lt;p&gt;Today is the first day at the conference (aside from the tutorials, which were yesterday).  Here&amp;#8217;s what I went to:&lt;/p&gt;

&lt;h3&gt;New Subquery Optimizations in 6.0&lt;/h3&gt;

&lt;p&gt;By Sergey Petrunia.  This was a similar session to one I went to last year.  MySQL has a few cases where subqueries are badly optimized, and this session went into the details of how this is being addressed in MySQL 6.0.  There are several new optimization techniques for all types of subqueries, such as inside-out subqueries, materialization, and converting to joins.  The optimizations apply to scalar subqueries and subqueries in the FROM clause.  Performance results are very good, depending on which data you choose to illustrate.  The overall point is that the worst-case subquery nastiness should be resolved.  I&amp;#8217;m speaking of WHERE NOT IN(SELECT&amp;#8230;) and friends.  It remains to be seen how this shakes out as 6.0 matures, and what edge cases will pop up.&lt;/p&gt;

&lt;h3&gt;The Lost Art Of the Self Join&lt;/h3&gt;

&lt;p&gt;This was just great.  Among many other things,  Beat Vontobel showed how a Su Doku can be solved entirely with declarative queries: a very large self-join query against a table of digits and a table of the board&amp;#8217;s initial state.  I had been promoting this session because last year&amp;#8217;s was so very good.  I can&amp;#8217;t wait to see what he comes up with for next year.  Can he find another creative idea?  Time will tell.&lt;/p&gt;

&lt;p&gt;He wasn&amp;#8217;t able to solve a 9&amp;#215;9 puzzle with MySQL because of the limitation on the number of joins, but PostgreSQL had no trouble doing it.&lt;/p&gt;

&lt;h3&gt;EXPLAIN Demystified&lt;/h3&gt;

&lt;p&gt;This was my session, of course.  (Slides will be on the O&amp;#8217;Reilly conference site, if they aren&amp;#8217;t already).  It went great, I thought.  The room was full and people were standing in the back of the room and in the door.  The questions came fast and furious; all really good questions.  I think we ended up exploring a lot of the MySQL query execution method, strengths, and weaknesses by the time we were through.  And I gave away all the remaining Maatkit t-shirts.  Hopefully the people who took them will wear them tomorrow and the conference will be sea of deep, rich red shirts.&lt;/p&gt;

&lt;p&gt;Someone did an audio recording of the session, but I don&amp;#8217;t recall who it was.&lt;/p&gt;

&lt;h3&gt;Investigating InnoDB Scalability Limits&lt;/h3&gt;

&lt;p&gt;This session was given by Peter Zaitsev (disclosure: I now work for &lt;a href=&quot;http://www.percona.com/&quot;&gt;Percona&lt;/a&gt;, the company he co-founded).  Peter and Vadim Tkachenko spent a lot of time over the last weeks and months running a dizzying array of benchmarks on MySQL 5.0.22, 5.0.51, and 5.1.24 (if I recall the versions correctly).  They were able to show InnoDB&amp;#8217;s scaling patterns for a number of different micro-benchmarks on a variety of configurations.  If you didn&amp;#8217;t attend, please look up the slides if you care about InnoDB performance.  A lot of work went into the benchmarks &amp;#8212; a lot of work.  The slides should be on the conference website or on our blog, &lt;a href=&quot;http://www.mysqlperformanceblog.com/&quot;&gt;http://www.mysqlperformanceblog.com/&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;Replication Tricks and Tips&lt;/h3&gt;

&lt;p&gt;Lars Thalmann and Mats Kindahl gave this session.  At a high level, I&amp;#8217;d say it was a run-down of all the different ways you can use MySQL replication.  Replication is really a flexible tool, and they covered a large array of the most important ways you can use it to achieve different purposes.  Many of the techniques they mentioned are implemented by various tools in &lt;a href=&quot;http://www.maatkit.org/&quot;&gt;Maatkit&lt;/a&gt;.  A couple of the others are implemented in &lt;a href=&quot;http://code.google.com/p/mysql-master-master/&quot;&gt;MySQL Master Master Manager&lt;/a&gt; and &lt;a href=&quot;http://code.google.com/p/mysql-mmre/&quot;&gt;MySQL Semi Multi-Master&lt;/a&gt; tools. Don&amp;#8217;t re-code these!  You can save weeks of work and get quality code by using the pre-built tools.  (I built Maatkit, so I know exactly how tricky it is to get some of these things right.)&lt;/p&gt;

&lt;h3&gt;BoF Sessions&lt;/h3&gt;

&lt;p&gt;I dropped in on a few BoF sessions, including the Sphinx one and the PBXT/Blob Streaming one.  (Keep an eye on the PrimeBase folks &amp;#8212; they are up to great things.)  Ronald Bradford protected me from those who wanted to get me drunk.  Hint: it&amp;#8217;s really easy&amp;#8230; I have to say, though, Monty&amp;#8217;s black vodka was amazing.&lt;/p&gt;

&lt;p&gt;Speaking of Blob Streaming, Paul McCullagh and I were talking earlier in the day about the project&amp;#8217;s name, MyBS.  This has been smirked about a few times.  I think it&amp;#8217;s a great name, because after all my initials are BS (I usually insert one of my four middle names in to alleviate this problem, but I digress).  The conversation went like this:&lt;/p&gt;

&lt;p&gt;Me: I like it. My initials are BS.&lt;/p&gt;
&lt;p&gt;Paul: BS actually means British Standard, so it can&amp;#8217;t be bad.&lt;/p&gt;
&lt;p&gt;Me: Better than American Standard.  That&amp;#8217;s a toilet.&lt;/p&gt;

&lt;p&gt;We also debated the merits of watching the original move The Blob.  It&amp;#8217;s a classic.  It must be good.&lt;/p&gt;&lt;a href=&quot;http://www.xaprb.com/blog/tag/beat-vontobel/&quot; rel=&quot;tag&quot;&gt;Beat Vontobel&lt;/a&gt;, &lt;a href=&quot;http://www.xaprb.com/blog/tag/benchmarks/&quot; rel=&quot;tag&quot;&gt;benchmarks&lt;/a&gt;, &lt;a href=&quot;http://www.xaprb.com/blog/tag/innodb/&quot; rel=&quot;tag&quot;&gt;innodb&lt;/a&gt;, &lt;a href=&quot;http://www.xaprb.com/blog/tag/lars-thalmann/&quot; rel=&quot;tag&quot;&gt;Lars Thalmann&lt;/a&gt;, &lt;a href=&quot;http://www.xaprb.com/blog/tag/mats-kindahl/&quot; rel=&quot;tag&quot;&gt;Mats Kindahl&lt;/a&gt;, &lt;a href=&quot;http://www.xaprb.com/blog/tag/mysqluc2008/&quot; rel=&quot;tag&quot;&gt;mysqluc2008&lt;/a&gt;, &lt;a href=&quot;http://www.xaprb.com/blog/tag/paul-mccullagh/&quot; rel=&quot;tag&quot;&gt;Paul McCullagh&lt;/a&gt;, &lt;a href=&quot;http://www.xaprb.com/blog/tag/pbxt/&quot; rel=&quot;tag&quot;&gt;pbxt&lt;/a&gt;, &lt;a href=&quot;http://www.xaprb.com/blog/tag/percona/&quot; rel=&quot;tag&quot;&gt;Percona&lt;/a&gt;, &lt;a href=&quot;http://www.xaprb.com/blog/tag/peter-zaitsev/&quot; rel=&quot;tag&quot;&gt;Peter Zaitsev&lt;/a&gt;, &lt;a href=&quot;http://www.xaprb.com/blog/tag/replication/&quot; rel=&quot;tag&quot;&gt;replication&lt;/a&gt;, &lt;a href=&quot;http://www.xaprb.com/blog/tag/sergey-petrunia/&quot; rel=&quot;tag&quot;&gt;Sergey Petrunia&lt;/a&gt;, &lt;a href=&quot;http://www.xaprb.com/blog/tag/sphinx/&quot; rel=&quot;tag&quot;&gt;Sphinx&lt;/a&gt;, &lt;a href=&quot;http://www.xaprb.com/blog/tag/su-doku/&quot; rel=&quot;tag&quot;&gt;Su Doku&lt;/a&gt;, &lt;a href=&quot;http://www.xaprb.com/blog/tag/the-blob/&quot; rel=&quot;tag&quot;&gt;The Blob&lt;/a&gt;, &lt;a href=&quot;http://www.xaprb.com/blog/tag/vadim-tkachenko/&quot; rel=&quot;tag&quot;&gt;Vadim Tkachenko&lt;/a&gt;</description>
            
            <pubDate>Tue, 15 Apr 2008 23:16:18 -0700</pubDate>
        </item>
            
        <item>
            <title>MySQL?s storage engine program picks up steam</title>
            <link>http://swik.net/MySQL/Planet+MySQL/MySQL%3Fs+storage+engine+program+picks+up+steam/b4a0z</link>
            <description>&lt;p&gt;The solidDB for MySQL database engine for MySQL may have &lt;a href=&quot;http://blogs.the451group.com/opensource/2008/03/05/ibm-abandons-soliddb-for-mysql/&quot;&gt;lost its sponsor&lt;/a&gt; following IBM&amp;#8217;s acquisition of Solid Info Tech but events at this week&amp;#8217;s &lt;a href=&quot;http://en.oreilly.com/mysql2008/public/content/home&quot;&gt;MySQL Conference and Expo&lt;/a&gt; prove the certified engines program is alive and well.&lt;/p&gt;
&lt;p&gt;Not only has Oracle &lt;a href=&quot;http://www.prnewswire.com/cgi-bin/stories.pl?ACCT=104&amp;#038;STORY=/www/story/04-15-2008/0004792764&amp;#038;EDATE=&quot;&gt;announced&lt;/a&gt; that its &lt;a href=&quot;http://www.innodb.com/&quot;&gt;Innobase&lt;/a&gt; subsidiary has updated InnoDB transactional storage engine, but there is also a new member of the  certified engines&lt;a href=&quot;http://solutions.mysql.com/engines.html&quot;&gt;program&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.kickfire.com/&quot;&gt;Kickfire&lt;/a&gt; has recently &lt;a href=&quot;http://www.kickfire.com/blog/?p=7&quot;&gt;emerged&lt;/a&gt; from stealth mode with its data warehousing appliance based on MySQL, column-store software, data compression, and a proprietary SQL processor.&lt;/p&gt;
&lt;p&gt;Additionally, another potential new storage engine partner emerged in the form of &lt;a href=&quot;http://www.scaledb.com/ScaleDB_Homepage.asp&quot;&gt;ScaleDB&lt;/a&gt;, which is &lt;a href=&quot;http://www.scaledb.com/ScaleDB_FAQ.asp&quot;&gt;promising&lt;/a&gt; to deliver its new scalable storage engine for MySQL in the fourth quarter of this year.&lt;/p&gt;
&lt;p&gt;Then of course there will be MySQL&amp;#8217;s own Falcon engine, which &lt;a href=&quot;http://blogs.mysql.com/robin/2008/03/11/falcon-storage-engine-beta-now-available/&quot;&gt;entered beta testing&lt;/a&gt; in March and will be available with &lt;a href=&quot;http://www.mysql.com/mysql60/&quot;&gt;MySQL 6.0&lt;/a&gt;.&lt;/p&gt;
&lt;img src=&quot;http://feeds.the451group.com/~r/451opensource/~4/270714533&quot; height=&quot;1&quot; width=&quot;1&quot;/&gt;</description>
            
            <pubDate>Tue, 15 Apr 2008 08:20:51 -0700</pubDate>
        </item>
                </channel>
</rss>
