<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Weez.com &#187; Edition</title>
	<atom:link href="http://www.weez.com/tag/edition/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.weez.com</link>
	<description>Solving everyday practical LAMP problems... one at a time</description>
	<lastBuildDate>Sat, 11 Feb 2012 03:24:53 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Setting up XFS on Hardware RAID — the simple edition</title>
		<link>http://www.weez.com/2011/12/setting-up-xfs-on-hardware-raid-%e2%80%94-the-simple-edition/</link>
		<comments>http://www.weez.com/2011/12/setting-up-xfs-on-hardware-raid-%e2%80%94-the-simple-edition/#comments</comments>
		<pubDate>Fri, 16 Dec 2011 17:56:15 +0000</pubDate>
		<dc:creator>Abidoon</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Edition]]></category>
		<category><![CDATA[hardware]]></category>
		<category><![CDATA[raid]]></category>
		<category><![CDATA[Setting]]></category>
		<category><![CDATA[Simple]]></category>

		<guid isPermaLink="false">http://www.weez.com/2011/12/setting-up-xfs-on-hardware-raid-%e2%80%94-the-simple-edition/</guid>
		<description><![CDATA[There are about a gazillion FAQs and HOWTOs out there that talk about XFS configuration, RAID IO alignment, and mount point options.  I wanted to try to put some of that information together in a condensed and simplified format that will work for the majority of use cases.  This is not meant to cover every [...]]]></description>
			<content:encoded><![CDATA[<p>There are about a gazillion FAQs and HOWTOs out there that talk about XFS configuration, RAID IO alignment, and mount point options.  I wanted to try to put some of that information together in a condensed and simplified format that will work for the majority of use cases.  This is not meant to cover every single tuning option, but rather to cover the important bases in a simple and easy to understand way.</p>
<p>Let&#8217;s say you have a server with standard hardware RAID setup running conventional HDDs.</p>
<h1>RAID setup</h1>
<p>For the sake of simplicity you create one single RAID logical volume that covers all your available drives.  This is the easiest setup to configure and maintain and is the best choice for operability in the majority of normal configurations.  Are there ways to squeeze more performance out of a server by dividing the logical volumes: perhaps, but it requires a lot of fiddling and custom tuning to accomplish.</p>
<p>There are plenty of other posts out there that discuss RAID minutia.  Make sure you cover the following:</p>
<ul>
<li>RAID type (usually 5 or 1+0)</li>
<li>RAID stripe size</li>
<li>BBU enabled with Write-back cache only</li>
<li>No read cache or read-ahead</li>
<li>No drive write cache enabled</li>
</ul>
<h1>Partitioning</h1>
<p>You want to run only MySQL on this box, and you want to ensure your MySQL datadir is separated from the OS in case you ever want to upgrade the OS, but otherwise keep it simple.  My suggestion?  Plan on allocating partitions roughly as follows, based on your available drive space and keeping in mind future growth.</p>
<ul>
<li>8-16G for Swap &#8211;</li>
<li>10-20G for the OS (/)</li>
<li>Possibly 10G+ for /tmp  (note you could also point mysql&#8217;s tmpdir elsewhere)</li>
<li>Everything else for MySQL (/mnt/data or similar):  (sym-link /var/lib/mysql into here when you setup mysql)</li>
</ul>
<p>Are there alternatives?  Yes.  Can you have separate partitions for Innodb log volumes, etc.?  Sure.  Is it work doing much more than this most of the time?  I&#8217;d argue not until you&#8217;re sure you are I/O bound and need to squeeze every last ounce of performance from the box.  Fiddling with how to allocate drives and drive space from partition to partition is a lot of operational work which should be spent only when needed.</p>
<h1>Aligning the Partitions</h1>
<div>Once you have the partitions, it could look something like this:</div>
<div>
<pre>#fdisk -ul

Disk /dev/sda: 438.5 GB, 438489317376 bytes
255 heads, 63 sectors/track, 53309 cylinders, total 856424448 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00051fe9

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1            2048     7813119     3905536   82  Linux swap / Solaris
Partition 1 does not end on cylinder boundary.
/dev/sda2   *     7813120    27344895     9765888   83  Linux
/dev/sda3        27344896   856422399   414538752   83  Linux</pre>
</div>
<div> Several months ago my colleague Aurimas posted two excellent blogs on both the <a href="http://www.mysqlperformanceblog.com/2011/06/09/aligning-io-on-a-hard-disk-raid-the-theory/">theory of Aligning IO on hardware RAID</a> and some <a href="http://www.mysqlperformanceblog.com/2011/06/09/aligning-io-on-a-hard-disk-raid-the-benchmarks/">good benchmarks</a> to emphasize the point, go read those if you need the theory here.  Is it common on modern Linux systems for this to be off?  Maybe not, but here&#8217;s how you check.</div>
<div>  We want to use mysql on /dev/sda3, but how can we ensure that it is aligned with the RAID stripes?  It takes a small amount of math:</div>
<div>
<ul>
<li>Start with your RAID stripe size.  Let&#8217;s use 64k which is a common default.  In this case 64K = 2^16 = 65536 bytes.</li>
<li>Get your sector size from fdisk.  In this case 512 bytes.</li>
<li>Calculate how many sectors fit in a RAID stripe.   65536 / 512 = 128 sectors per stripe.</li>
<li>Get start boundary of our mysql partition from fdisk: 27344896.</li>
<li>See if the Start boundary for our mysql partition falls on a stripe boundary by dividing the start sector of the partition by the sectors per stripe:  27344896 / 128 = 213632.  This is a whole number, so we are good.  If it had a remainder, then our partition would not start on a RAID stripe boundary.</li>
</ul>
<h1>Create the Filesystem</h1>
<p>XFS requires a little massaging (or a lot).  For a standard server, it&#8217;s fairly simple.  We need to know two things:</p>
<ul>
<li>RAID stripe size</li>
<li>Number of unique, utilized disks in the RAID.  This turns out to be the same as the size formulas I gave above:</li>
<ul>
<li>RAID 1+0:  is a set of mirrored drives, so the number here is num drives / 2.</li>
<li>RAID 5: is striped drives plus one full drive of parity, so the number here is num drives &#8211; 1.</li>
</ul>
</ul>
<div>In our case, it is RAID 1+0 64k stripe with 8 drives.  Since those drives each have a mirror, there are really 4 sets of unique drives that are striped over the top.  Using these numbers, we set the &#8216;su&#8217; and &#8216;sw&#8217; options in mkfs.xfs with those two values respectively.</div>
<pre># mkfs.xfs -d su=64k,sw=4 /dev/sda3
meta-data=/dev/sda3              isize=256    agcount=4, agsize=25908656 blks
         =                       sectsz=512   attr=2
data     =                       bsize=4096   blocks=103634624, imaxpct=25
         =                       sunit=16     swidth=64 blks
naming   =version 2              bsize=4096   ascii-ci=0
log      =internal log           bsize=4096   blocks=50608, version=2
         =                       sectsz=512   sunit=16 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0</pre>
<p>The <a href="http://xfs.org/index.php/XFS_FAQ">XFS FAQ</a> is a good place to check out for more details.</p>
<h1>Mount the filesystem</h1>
<p>Again, there are many options to use here, but let&#8217;s use some simple ones:</p>
<pre>/var/lib/mysql           xfs     nobarrier,noatime,nodiratime</pre>
<h1>Setting the IO scheduler</h1>
<p>This is a commonly missed step related to getting the IO setup properly.  The best choices here are between &#8216;deadline&#8217; and &#8216;noop&#8217;.   Deadline is an active scheduler, and noop simply means IO will be handled without rescheduling.  Which is best is workload dependent, but in the simple case you would be well-served by either.  Two steps here:</p>
<pre>echo noop &gt; /sys/block/sda/queue/scheduler   # update the scheduler in realtime</pre>
<p>And to make it permanent, add &#8216;elevator=&lt;your choice&gt;&#8217; in your grub.conf at the end of the kernel line:</p>
<pre>kernel /boot/vmlinuz-2.6.18-53.el5 ro root=LABEL=/ noapic acpi=off rhgb quiet notsc <strong>elevator=noop</strong></pre>
<p>&nbsp;</p>
<p>This is a complicated topic, and I&#8217;ve tried to temper the complexity with what will provide the most benefit.  What has made most improvement for you that could be added without much complexity?</p>
</div>
<p>View full post on <a href="http://www.mysqlperformanceblog.com/2011/12/16/setting-up-xfs-the-simple-edition/">MySQL Performance Blog</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.weez.com/2011/12/setting-up-xfs-on-hardware-raid-%e2%80%94-the-simple-edition/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Shard-Query turbo charges Infobright community edition (ICE)</title>
		<link>http://www.weez.com/2011/05/shard-query-turbo-charges-infobright-community-edition-ice/</link>
		<comments>http://www.weez.com/2011/05/shard-query-turbo-charges-infobright-community-edition-ice/#comments</comments>
		<pubDate>Sat, 07 May 2011 05:28:41 +0000</pubDate>
		<dc:creator>Abidoon</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[charges]]></category>
		<category><![CDATA[Community]]></category>
		<category><![CDATA[Edition]]></category>
		<category><![CDATA[Infobright]]></category>
		<category><![CDATA[ShardQuery]]></category>
		<category><![CDATA[Turbo]]></category>

		<guid isPermaLink="false">http://www.weez.com/2011/05/shard-query-turbo-charges-infobright-community-edition-ice/</guid>
		<description><![CDATA[Shard-Query is an open source tool kit which helps improve the performance of queries against a MySQL database by distributing the work over multiple machines and/or multiple cores. This is similar to the divide and conquer approach that Hive takes in combination with Hadoop. Shard-Query applies a clever approach to parallelism which allows it to [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://code.google.com/p/shard-query">Shard-Query</a> is an open source tool kit which helps improve the performance of queries against a MySQL database by distributing the work over multiple machines and/or multiple cores.  This is similar to the divide and conquer approach that <a href="http://wiki.apache.org/hadoop/Hive">Hive</a> takes in combination with <a href="http://wiki.apache.org/hadoop/">Hadoop</a>.  Shard-Query applies a clever approach to parallelism which allows it to significantly improve the performance of queries by spreading the work over all available compute resources.  In this test, Shard-Query averages a nearly 6x (max over 10x) improvement over the baseline, as shown in the following graph:<br />
<img src="https://spreadsheets.google.com/spreadsheet/oimg?key=0AoeYo7IZPccudElPSGk5TVNEbTNxX0tialdtZGZwLUE&amp;oid=5&amp;zx=epo3dfhrf50r" alt="" /><br />
<span id="more-6267"></span></p>
<p>One significant advantage of Shard-Query over Hive is that it works with existing MySQL data sets and queries.   Another advantage is that it works with all MySQL storage engines.  </p>
<p>This set of benchmarks evaluates how well <a href="http://www.infobright.com">Infobright</a> <a href="http://www.infobright.org/">community edition (ICE)</a> performs in combination with Shard-Query.</p>
<h3>Data set</h3>
<p>It was important to choose a data set that was large enough to create queries that would run for a decent amount of time, but not so large that it was difficult to work with.   The ontime flight performance statistics data, available online <a href="http://www.transtats.bts.gov/DL_SelectFields.asp?Table_ID=236&amp;DB_Short_Name=On-Time">from the United States Bureau of Transportation Statistics (BTS)</a> made a good candidate for testing, as it had been tested before:<br />
<a href="http://www.mysqlperformanceblog.com/2009/10/02/analyzing-air-traffic-performance-with-infobright-and-monetdb/">Another MPB post</a><br />
<a href="http://pub.eigenbase.org/wiki/LucidDbOtp#Queries">Lucid DB testing</a></p>
<p>The raw data is a completely denormalized schema (single table).  In order to demonstrate the power of Shard-Query it is important to test complex queries involving joins and aggregation.     A star schema is the most common OLAP/DW data model, since it typically represents a data mart.  See also: <a href="http://www.mysqlperformanceblog.com/2010/07/15/data-mart-or-data-warehouse/">&#8220;Data mart or data warehouse?&#8221;</a>.  As it is the most common data model,  it is desirable to benchmark using a star schema, even though it involves work to transform the data.</p>
<h3>Star schema</h3>
<p>Transforming the data was straightforward.  I should note that I did this preprocessing with the MyISAM storage engine, then I dumped the data to tab delimited flat files using mysqldump.  I started by loading the raw data from the BTS into a single database table called ontime_stage. </p>
<p>Then, the airport information was extracted:</p>
<pre>create table dim_airport(
airport_id int auto_increment primary key,
unique key(airport_code)
)
as
select
  Origin as `airport_code`,
  OriginCityName as `CityName`,
  OriginState as `State`,
  OriginStateFips as `StateFips`,
  OriginStateName as `StateName` ,
  OriginWac as `Wac`
FROM ontime_stage
UNION
select
  Dest as `airport_code`,
  DestCityName as `CityName`,
  DestState as `State`,
  DestStateFips as `StateFips`,
  DestStateName as `StateName` ,
  DestWac as `Wac`
FROM ontime_stage;
</pre>
<p>After extracting flight/airline and date information in a similar fashion, a final table `ontime_fact` is created by joining the newly constructed dimension table tables to the staging tables, omitting the dimension columns from the projection, instead replacing them with the dimension keys:</p>
<pre>select dim_date.date_id,
       origin.airport_id as origin_airport_id,
       dest.airport_id as dest_airport_id,
       dim_flight.flight_id,
       ontime_stage.TailNum, ...
from ontime_stage
join dim_date using(FlightDate)
join dim_airport origin on ontime_stage.Origin = origin.airport_code
join dim_airport dest on ontime_stage.Dest = dest.airport_code
join dim_flight using (UniqueCarrier,AirlineID,Carrier,FlightNum);</pre>
<p>The data set contains ontime flight information for 22 years, which can be confirmed by examining the contents of the date dimension:</p>
<pre>mysql> select count(*),
min(FlightDate),
max(FlightDate)
from dim_date\G
*************************** 1. row ***************************
       count(*): 8401
min(FlightDate): 1988-01-01
max(FlightDate): 2010-12-31
1 row in set (0.00 sec)
</pre>
<p>The airport dimension is a puppet dimension.  It is called a puppet because it serves as both origin and destination dimensions, being referenced by origin_airport_id and destination_airport_id in the fact table, respectively.  There are nearly 400 major airports included in the data set. </p>
<pre>mysql&gt; select count(*) from dim_airport;
+----------+
| count(*) |
+----------+
|      396 |
+----------+
1 row in set (0.00 sec)</pre>
<p>The final dimension is the flight dimension, which contains the flight numbers  and air carrier hierarchies.  Only the largest air carriers must register and report ontime information with the FAA, so there are only 29 air carriers in the table:</p>
<pre>mysql> select count(*),
count(distinct UniqueCarrier)
from dim_flight\G
*************************** 1. row ***************************
                     count(*): 58625
count(distinct UniqueCarrier): 29
1 row in set (0.02 sec)</pre>
<p>Each year has tens of millions of flights:</p>
<pre>mysql&gt; select count(*) from ontime_one.ontime_fact;
+-----------+
| count(*)  |
+-----------+
| 135125787 |
+-----------+
1 row in set (0.00 sec)</pre>
<p><b>This should be made fully clear by the following schema diagram:</b></p>
<div id="attachment_6390" class="wp-caption aligncenter" style="width: 294px"><a href="http://www.mysqlperformanceblog.com/wp-content/uploads/2011/05/ontime_dim.png"><img class="size-medium wp-image-6390" title="Diagram of ontime dimensional schema" src="http://www.mysqlperformanceblog.com/wp-content/uploads/2011/05/ontime_dim-284x300.png" alt="Star schema (ontime_fact, dim_date, dim_flight, dim_airport)" width="284" height="300" /></a>
<p class="wp-caption-text">Diagram of the ontime dimensional schema</p>
</div>
<h3>Test environment</h3>
<p>For this benchmark, a test environment consisting of a single commodity database server with 6 cores (+6ht) and 24GB of memory was selected.  The selected operating system was Fedora 14. Oracle VirtualBox OSE was used to create six virtual machines, each running Fedora 14.  Each of the virtual machines was granted 4GB of memory.  A SATA 7200rpm RAID10 battery backed RAID array was used as the underlying storage for the virtual machines.</p>
<p><strong>Baseline:</strong><br />
The MySQL command line client was used to execute the a script file containing the 11 queries.  This same SQL script was used in the Shard-Query tests.  For the baseline, the results and response times were captured with the \T command.  The queries were executed on a single database schema containing all of the data.  Before loading, there was approximately 23GB of data.  After loading, ICE compressed this data to about 2GB.  The test virtual machine was assigned 12 cores in this test.</p>
<p><strong>Scale-up:</strong><br />
Shard-Query was given the following configuration file, which lists only one server.  A single schema (ontime_one) contained all of the data.  The test virtual machine was assigned 12 cores for this test.  The same VM was used as the previous baseline test.  This VM was rebooted between tests.  A SQL script was fed to the run_query.php script and the output was captured with the &#8216;tee&#8217; command.</p>
<pre>$ cat one.ini
[default]
user=mysql
db=ontime_one
password=
port=5029
column=date_id
mapper=hash
gearman=127.0.0.1:7000
inlist=*
between=*

[shard1]
host=192.168.56.102</pre>
<p><strong>Scale-out</strong><br />
In addition to adding parallelism via scale-up, Shard-Query can improve performance of almost all queries by spreading them over more than one physical server.  This is called &#8220;scaling out&#8221; and it allows Shard-Query to vastly improve the performance of queries which have to examine a large amount of data.  Shard-Query includes a loader (loader.php) which can be used to either split a data  into multiple files (for each shard, for later loading) or it can load files directly, in parallel, to multiple hosts.  </p>
<p>Shard-Query will execute queries in parallel over all of these machines.  With enough machines, massive parallelism is possible and very large data sets may be processed.  As each machine examines only a small subset of the data, performance can be improved significantly:</p>
<pre>$ cat shards.ini
[default]
user=mysql
db=ontime
password=
port=5029
column=date_id
mapper=hash
gearman=127.0.0.1:7000
inlist=*
between=*

[shard1]
host=192.168.56.101
db=ontime

[shard2]
host=192.168.56.102
db=ontime

[shard3]
host=192.168.56.103
db=ontime

[shard4]
host=192.168.56.105
db=ontime

[shard5]
host=192.168.56.106
db=ontime

[shard6]
host=192.168.56.104
db=ontime</pre>
<p>In this configuration, each shard has about 335MB-350MB of data (23GB raw data, compressed to about 2GB total data. then spread over six servers).    Due to ICE limitations, the data was split before loading.  The splitting/loading process will be described in another post.</p>
<h3>Complex queries</h3>
<p>Shard-Query was tested with the simple single table version of this data set in a <a href="http://www.mysqlperformanceblog.com/2010/11/15/shard-query-adds-parallelism-to-queries/">previous </a> blog post.  Previous testing was limited to a subset of Vadim&#8217;s test queries (see that post).  As this new test schema is normalized, Vadim&#8217;s test queries must be modified to reflect the more complex schema structure.  For this benchmark each of the original queries has been rewritten to conform to the new schema, and additionally two new test queries have been added. To model real world complexity, each of the test queries feature at least one join, and many of the filter conditions are placed on attributes in the dimension tables.  It will be very interesting to test these queries on various engines and databases.</p>
<p>Following is a list of the queries, followed by a response time table recording the actual response times for each query.  The queries should be self-explanatory.  </p>
<h3>Performance, at a glance</h3>
<p>You will notice that Shard-Query is faster in nearly every case.  The performance of the queries is improved significantly by scaling out, even more so than scaling up, because additional parallelism is added beyond what can be exploited by scale up.   Scale up can improve query performance when there is enough resources to support the added parallelism, and when one of the the following are in used in the query: BETWEEN or IN clauses,  subqueries in the FROM clause, UNION or UNION ALL clauses.  If none of those features are used, then parallelism can&#8217;t be added.  Q9 is an example of such a query.<br />
.</p>
<h3>Query details:</h3>
<pre>-- Q1
 SELECT DayOfWeek, count(*) AS c
   from ontime_fact
   JOIN dim_date using (date_id)
  WHERE Year
BETWEEN 2000 AND 2008
  GROUP BY DayOfWeek
  ORDER BY c DESC;

-- Q2
SELECT DayOfWeek, count(*) AS c
  from ontime_fact
  JOIN dim_date using (date_id)
 WHERE DepDelay&gt;10 AND Year BETWEEN 2000 AND 2008
 GROUP BY DayOfWeek
 ORDER BY c DESC;

-- Q3
SELECT CityName as Origin, count(*) AS c
  from ontime_fact
  JOIN dim_date using (date_id)
  JOIN dim_airport origin
    ON origin_airport_id = origin.airport_id
 WHERE DepDelay&gt;10
   AND Year BETWEEN 2000 AND 2008
 GROUP BY 1
 ORDER BY c
 LIMIT 10;</pre>
<p><img src="https://spreadsheets.google.com/spreadsheet/oimg?key=0AoeYo7IZPccudElPSGk5TVNEbTNxX0tialdtZGZwLUE&amp;oid=6&amp;zx=qomwh2kggpga" alt="" /><br />
<img src="https://spreadsheets.google.com/spreadsheet/oimg?key=0AoeYo7IZPccudElPSGk5TVNEbTNxX0tialdtZGZwLUE&amp;oid=11&amp;zx=rrnyzxplfnpd" alt="" /></p>
<p>The next queries show how performance is improved when Shard-Query adds parallelism when &#8220;subqueries in the from clause&#8221; are used.  There are benefits with both &#8220;scale-up&#8221; and &#8220;scale-out&#8221;, but once again, the &#8220;scale-out&#8221; results are the most striking.</p>
<pre>-- Q4
SELECT Carrier, count(*) as c
  from ontime_fact
  JOIN dim_date using (date_id)
  join dim_flight using(flight_id)
 WHERE DepDelay&gt;10
   AND Year=2007
 GROUP BY Carrier
 ORDER BY c DESC;

-- Q5
SELECT t.Carrier, c, c2, c*1000/c2 as c3
FROM
     (SELECT Carrier, count(*) AS c
        from ontime_fact
        join dim_date using(date_id)
        join dim_flight using(flight_id)
       WHERE DepDelay&gt;10
         AND Year=2007
       GROUP BY Carrier) t
JOIN (SELECT Carrier, count(*) AS c2
        from ontime_fact
        join dim_date using(date_id)
        join dim_flight using(flight_id)
       WHERE Year=2007
       GROUP BY Carrier) t2
  ON (t.Carrier=t2.Carrier)
ORDER BY c3 DESC;

-- Q6
SELECT t.Year, c1 / c2 as ratio
FROM
     (select Year, count(*)*1000 as c1
        from ontime_fact
        join dim_date using (date_id)
       WHERE DepDelay&gt;10
       GROUP BY Year) t
JOIN (select Year, count(*) as c2
        from ontime_fact
        join dim_date using (date_id)
       WHERE DepDelay&gt;10
       GROUP BY Year) t2
  ON (t.Year=t2.Year);

-- Q7
SELECT t.Year, c1 / c2 as ratio
  FROM (select Year, count(Year)*1000 as c1
          from ontime_fact
          join dim_date using (date_id)
         WHERE DepDelay&gt;10
         GROUP BY Year) t
  JOIN (select Year, count(*) as c2
          from ontime_fact
          join dim_date using (date_id)
         GROUP BY Year) t2
    ON (t.Year=t2.Year);</pre>
<p><img src="https://spreadsheets.google.com/spreadsheet/oimg?key=0AoeYo7IZPccudElPSGk5TVNEbTNxX0tialdtZGZwLUE&amp;oid=7&amp;zx=yu1yshos7o4m" alt="" /><br />
<img src="https://spreadsheets.google.com/spreadsheet/oimg?key=0AoeYo7IZPccudElPSGk5TVNEbTNxX0tialdtZGZwLUE&#038;oid=11&#038;zx=u3knp3tfz2af" /></p>
<p>The performance of the following queries depends on the size of the date range:</p>
<pre>-- Q8.0
SELECT dest.CityName, COUNT( DISTINCT origin.CityName)
  from ontime_fact
  JOIN dim_airport dest on ( dest_airport_id = dest.airport_id)
  JOIN dim_airport origin on ( origin_airport_id = origin.airport_id)
  JOIN dim_date using (date_id)
 WHERE Year BETWEEN 2001 and 2001
 GROUP BY dest.CityName
 ORDER BY 2 DESC;

-- Q8.1
SELECT dest.CityName, COUNT( DISTINCT origin.CityName)
  from ontime_fact
  JOIN dim_airport dest on ( dest_airport_id = dest.airport_id)
  JOIN dim_airport origin on ( origin_airport_id = origin.airport_id)
  JOIN dim_date using (date_id)
 WHERE Year BETWEEN 2001 and 2005
 GROUP BY dest.CityName
 ORDER BY 2 DESC;

-- Q8.2
SELECT dest.CityName, COUNT( DISTINCT origin.CityName)
  from ontime_fact
  JOIN dim_airport dest on ( dest_airport_id = dest.airport_id)
  JOIN dim_airport origin on ( origin_airport_id = origin.airport_id)
  JOIN dim_date using (date_id)
 WHERE Year BETWEEN 2001 and 2011
 GROUP BY dest.CityName
 ORDER BY 2 DESC;

-- Q8.3
SELECT dest.CityName, COUNT( DISTINCT origin.CityName)
  from ontime_fact
  JOIN dim_airport dest on ( dest_airport_id = dest.airport_id)
  JOIN dim_airport origin on ( origin_airport_id = origin.airport_id)
  JOIN dim_date using (date_id)
 WHERE Year BETWEEN 1990 and 2011
 GROUP BY dest.CityName
 ORDER BY 2 DESC;

-- Q8.4
SELECT dest.CityName, COUNT( DISTINCT origin.CityName)
  from ontime_fact
  JOIN dim_airport dest on ( dest_airport_id = dest.airport_id)
  JOIN dim_airport origin on ( origin_airport_id = origin.airport_id)
  JOIN dim_date using (date_id)
 WHERE Year BETWEEN 1980 and 2011
 GROUP BY dest.CityName
 ORDER BY 2 DESC;
</pre>
<p><img src="https://spreadsheets.google.com/spreadsheet/oimg?key=0AoeYo7IZPccudElPSGk5TVNEbTNxX0tialdtZGZwLUE&amp;oid=9&amp;zx=3gvv9lg59qb4" alt="" /><br />
<img src="https://spreadsheets.google.com/spreadsheet/oimg?key=0AoeYo7IZPccudElPSGk5TVNEbTNxX0tialdtZGZwLUE&amp;oid=13&amp;zx=47lrb7tgs9qj" alt="" /></p>
<p>Finally, Shard-Query performance continues to improve when grouping and filtering is used.  Again, notice Q9.  It doesn&#8217;t use any features which Shard-Query can use to add parallelism.  Thus, in the scale up configuration it does not perform any better than the baseline, and actually performed just a little worse.  Since scale out splits the data between servers, it performs about 6x better as the degree of parallelism is controlled by the number of shards.</p>
<pre>-- Q9
select Year ,count(Year) as c1
  from ontime_fact
  JOIN dim_date using (date_id)
 group by Year;

-- Q10
SELECT Carrier, dest.CityName, COUNT( DISTINCT origin.CityName)
  from ontime_fact
  JOIN dim_airport dest on ( dest_airport_id = dest.airport_id)
  JOIN dim_airport origin on ( origin_airport_id = origin.airport_id)
  JOIN dim_date using (date_id)
  JOIN dim_flight using (flight_id)
 WHERE Year BETWEEN 2009 and 2011
 GROUP BY Carrier,dest.CityName
 ORDER BY 3 DESC;

-- Q11
SELECT Year, Carrier, dest.CityName, COUNT( DISTINCT origin.CityName)
  from ontime_fact
  JOIN dim_airport dest on ( dest_airport_id = dest.airport_id)
  JOIN dim_airport origin on ( origin_airport_id = origin.airport_id)
  JOIN dim_date using (date_id)
  JOIN dim_flight using (flight_id)
 WHERE Year BETWEEN 2000 and 2003
   AND Carrier = 'AA'
 GROUP BY Year, Carrier,dest.CityName
 ORDER BY 4 DESC;</pre>
<p><img src="https://spreadsheets.google.com/spreadsheet/oimg?key=0AoeYo7IZPccudElPSGk5TVNEbTNxX0tialdtZGZwLUE&amp;oid=10&amp;zx=lteujawwdikd" alt="" /><br />
<img src="https://spreadsheets.google.com/spreadsheet/oimg?key=0AoeYo7IZPccudElPSGk5TVNEbTNxX0tialdtZGZwLUE&amp;oid=14&amp;zx=cg79iiieuohm" alt="" /></p>
<h3>Conclusion</h3>
<p>The divide and conquer approach is very useful when working with large quantities of data.  Shard-Query can be used with existing data sets easily, improving the performance of queries significantly if they use common query features like BETWEEN or IN.   It is also possible to spread your data over multiple machines,  scaling out to improve query response times significantly.  </p>
<p>These queries are a great test of Shard-Query features.  It is currently approaching RC status.  If you decide to test it and encounter issues, please file a bug on the bug tracker. You can get Shard-Query (currently in development release form as a checkout from SVN) here: <a href="http://code.google.com/p/shard-query">Shard-Query Google code project</a></p>
<h4>Full disclosure</h4>
<p>Justin Swanhart, the author of this article is also the creator and maintainer of Shard-Query.   The author has previously worked in cooperation with Infobright, including on benchmarking.  These particular tests were performed independently of Infobright, without their knowledge or approval.  Infobright was, however, given the chance to review this document before publication, as a courtesy. All findings are represented truthfully, transparently, and without any intended bias.</p>
<p>View full post on <a href="http://www.mysqlperformanceblog.com/2011/05/06/scale-out-mysql/">MySQL Performance Blog</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.weez.com/2011/05/shard-query-turbo-charges-infobright-community-edition-ice/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Percona XtraBackup 1.6 for Windows “try me” edition</title>
		<link>http://www.weez.com/2011/04/percona-xtrabackup-1-6-for-windows-%e2%80%9ctry-me%e2%80%9d-edition/</link>
		<comments>http://www.weez.com/2011/04/percona-xtrabackup-1-6-for-windows-%e2%80%9ctry-me%e2%80%9d-edition/#comments</comments>
		<pubDate>Fri, 22 Apr 2011 02:29:28 +0000</pubDate>
		<dc:creator>Abidoon</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Edition]]></category>
		<category><![CDATA[me”]]></category>
		<category><![CDATA[Percona]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[Xtrabackup]]></category>
		<category><![CDATA[“try]]></category>

		<guid isPermaLink="false">http://www.weez.com/2011/04/percona-xtrabackup-1-6-for-windows-%e2%80%9ctry-me%e2%80%9d-edition/</guid>
		<description><![CDATA[Previously we had XtraBackup Windows binaries for 1.0 and 1.2 releases, and they were based on Cygwin compilation of MySQL. After MySQL 5.5 moved to CMake, and cygwin compilation is not supported anymore, it took some efforts for us to come up with native Windows builds, but they are there already. We consider them &#8220;alpha&#8221; [...]]]></description>
			<content:encoded><![CDATA[<p>Previously we had  XtraBackup Windows binaries for 1.0 and 1.2 releases, and they were based on Cygwin compilation of MySQL.</p>
<p>After MySQL 5.5 moved to CMake, and cygwin compilation is not supported anymore,  it took some efforts for us to come up with native Windows builds, but they are there already. We consider them &#8220;alpha&#8221; quality, as there some know limitations,<br />
but you should be able to make backup and restore from it. If you are interested in Windows backup I encourage you to give it a try and report your experience.  Binaries are available there <a href="http://www.percona.com/downloads/XtraBackup/XtraBackup-1.6/Windows-alpha/">http://www.percona.com/downloads/XtraBackup/XtraBackup-1.6/Windows-alpha/</a></p>
<p>View full post on <a href="http://www.mysqlperformanceblog.com/2011/04/21/percona-xtrabackup-1-6-for-windows-try-me-edition/">MySQL Performance Blog</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.weez.com/2011/04/percona-xtrabackup-1-6-for-windows-%e2%80%9ctry-me%e2%80%9d-edition/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Two quick site updates: videos online; Kindle edition</title>
		<link>http://www.weez.com/2011/03/two-quick-site-updates-videos-online-kindle-edition/</link>
		<comments>http://www.weez.com/2011/03/two-quick-site-updates-videos-online-kindle-edition/#comments</comments>
		<pubDate>Tue, 22 Mar 2011 20:30:30 +0000</pubDate>
		<dc:creator>Abidoon</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Edition]]></category>
		<category><![CDATA[Kindle]]></category>
		<category><![CDATA[online]]></category>
		<category><![CDATA[Quick]]></category>
		<category><![CDATA[site]]></category>
		<category><![CDATA[updates]]></category>
		<category><![CDATA[videos]]></category>

		<guid isPermaLink="false">http://www.weez.com/2011/03/two-quick-site-updates-videos-online-kindle-edition/</guid>
		<description><![CDATA[Two notes for readers. First, we have been publishing a great deal of video material on our companion site Percona.TV. This includes our recordings from past conferences, user group meetings, screencasts, and most recently our webinars. (I hate the proprietary formats and silly technical restrictions that the webinar companies impose. I figured out how to [...]]]></description>
			<content:encoded><![CDATA[<p>Two notes for readers.  First, we have been publishing a great deal of video material on our companion site <a href="http://www.percona.tv">Percona.TV</a>.  This includes our recordings from past conferences, user group meetings, screencasts, and most recently <a href="http://www.percona.tv/category/percona-webinars">our webinars</a>.  (I hate the proprietary formats and silly technical restrictions that the webinar companies impose.  I figured out how to download the streams and convert them to formats that will upload to blip.tv and embed, so now they&#8217;re easy to watch.)</p>
<p>Second, you can now subscribe to this blog through Kindle, if that&#8217;s how you like to read your MySQL technical geekery.  We&#8217;re in the Kindle store as <a href="http://www.amazon.com/MySQL-Performance-Blog/dp/B004SPAKUI/?tag=perinc-20">MySQL Performance Blog</a>.  Happy reading!</p>
<p>View full post on <a href="http://www.mysqlperformanceblog.com/2011/03/22/two-quick-site-updates-videos-online-kindle-edition/">MySQL Performance Blog</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.weez.com/2011/03/two-quick-site-updates-videos-online-kindle-edition/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ubuntu 10.10 Alpha 3 Maverick Meerkat Netbook Edition &#8211; Unity Interface demonstrated</title>
		<link>http://www.weez.com/2010/09/ubuntu-10-10-alpha-3-maverick-meerkat-netbook-edition-unity-interface-demonstrated/</link>
		<comments>http://www.weez.com/2010/09/ubuntu-10-10-alpha-3-maverick-meerkat-netbook-edition-unity-interface-demonstrated/#comments</comments>
		<pubDate>Thu, 09 Sep 2010 01:02:43 +0000</pubDate>
		<dc:creator>Abidoon</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[10.10]]></category>
		<category><![CDATA[Alpha]]></category>
		<category><![CDATA[demonstrated]]></category>
		<category><![CDATA[Edition]]></category>
		<category><![CDATA[interface]]></category>
		<category><![CDATA[Maverick]]></category>
		<category><![CDATA[meerkat]]></category>
		<category><![CDATA[Netbook]]></category>
		<category><![CDATA[Ubuntu]]></category>
		<category><![CDATA[unity]]></category>

		<guid isPermaLink="false">http://www.weez.com/2010/09/ubuntu-10-10-alpha-3-maverick-meerkat-netbook-edition-unity-interface-demonstrated/</guid>
		<description><![CDATA[Also, check out my 2nd channel I&#8217;m working on: youtube.com Thanks for watching! Buy My T-Shirts! twil.spreadshirt.com &#038; http My Website: www.thisweekinlinux.com My Facebook Page apps.facebook.com My Twitter: www.twitter.com My IRC Channel: #twil on irc.freenode.net Music provided by Kevin MacLeod of incompetech.com]]></description>
			<content:encoded><![CDATA[<p>					<object width="425" height="355"><param name="movie" value="http://www.youtube.com/v/u-g4wq5sck4?fs=1"></param><param name="allowFullScreen" value="true"></param>
					<embed src="http://www.youtube.com/v/u-g4wq5sck4?fs=1" type="application/x-shockwave-flash" width="425" height="355" allowfullscreen="true"></embed></object><br />
Also, check out my 2nd channel I&#8217;m working on: youtube.com Thanks for watching! Buy My T-Shirts! twil.spreadshirt.com &#038; http My Website: www.thisweekinlinux.com My Facebook Page apps.facebook.com My Twitter: www.twitter.com My IRC Channel: #twil on irc.freenode.net Music provided by Kevin MacLeod of incompetech.com</p>
]]></content:encoded>
			<wfw:commentRss>http://www.weez.com/2010/09/ubuntu-10-10-alpha-3-maverick-meerkat-netbook-edition-unity-interface-demonstrated/feed/</wfw:commentRss>
		<slash:comments>25</slash:comments>
		</item>
		<item>
		<title>Ubuntu 10.7 Smartbook Edition coming for ARM!</title>
		<link>http://www.weez.com/2010/09/ubuntu-10-7-smartbook-edition-coming-for-arm/</link>
		<comments>http://www.weez.com/2010/09/ubuntu-10-7-smartbook-edition-coming-for-arm/#comments</comments>
		<pubDate>Wed, 08 Sep 2010 18:12:39 +0000</pubDate>
		<dc:creator>Abidoon</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA['smartbook']]></category>
		<category><![CDATA[10.7]]></category>
		<category><![CDATA[coming]]></category>
		<category><![CDATA[Edition]]></category>
		<category><![CDATA[Ubuntu]]></category>

		<guid isPermaLink="false">http://www.weez.com/2010/09/ubuntu-10-7-smartbook-edition-coming-for-arm/</guid>
		<description><![CDATA[Canonical is showing the Freescale i.MX51 Pegatron Laptop reference design running the latest version of Ubuntu Netbook Edition optimized for ARM for speed (could they be calling this the Ubuntu Smartbook Edition?). In this video, the representative of Canonical explains some of the things that are being worked on to optimize Linux as a full [...]]]></description>
			<content:encoded><![CDATA[<p>					<object width="425" height="355"><param name="movie" value="http://www.youtube.com/v/iEovlXFKm84?fs=1"></param><param name="allowFullScreen" value="true"></param>
					<embed src="http://www.youtube.com/v/iEovlXFKm84?fs=1" type="application/x-shockwave-flash" width="425" height="355" allowfullscreen="true"></embed></object><br />
Canonical is showing the Freescale i.MX51 Pegatron Laptop reference design running the latest version of Ubuntu Netbook Edition optimized for ARM for speed (could they be calling this the Ubuntu Smartbook Edition?). In this video, the representative of Canonical explains some of the things that are being worked on to optimize Linux as a full laptop experience on ARM platforms like the ARM Cortex A8 and the multi-core ARM Cortex A9 that are coming out soon. I will film another video with Canonical to try to get more details on how the upcoming ARM Powered laptops are going to look like and how Linux is being optimized for it.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.weez.com/2010/09/ubuntu-10-7-smartbook-edition-coming-for-arm/feed/</wfw:commentRss>
		<slash:comments>25</slash:comments>
		</item>
		<item>
		<title>zeitgeist final edition multilang 6/13</title>
		<link>http://www.weez.com/2010/07/zeitgeist-final-edition-multilang-613/</link>
		<comments>http://www.weez.com/2010/07/zeitgeist-final-edition-multilang-613/#comments</comments>
		<pubDate>Sun, 25 Jul 2010 12:19:07 +0000</pubDate>
		<dc:creator>Abidoon</dc:creator>
				<category><![CDATA[CentOS]]></category>
		<category><![CDATA[6/13]]></category>
		<category><![CDATA[Edition]]></category>
		<category><![CDATA[final]]></category>
		<category><![CDATA[multilang]]></category>
		<category><![CDATA[Zeitgeist]]></category>

		<guid isPermaLink="false">http://www.weez.com/2010/07/zeitgeist-final-edition-multilang-613/</guid>
		<description><![CDATA[zetigeist the movie final edition with all subtitles part7: www.youtube.com]]></description>
			<content:encoded><![CDATA[<p>					<object width="425" height="355"><param name="movie" value="http://www.youtube.com/v/Gzc-TAgOrzQ?fs=1"></param><param name="allowFullScreen" value="true"></param>
					<embed src="http://www.youtube.com/v/Gzc-TAgOrzQ?fs=1" type="application/x-shockwave-flash" width="425" height="355" allowfullscreen="true"></embed></object><br />
zetigeist the movie final edition with all subtitles part7: www.youtube.com</p>
]]></content:encoded>
			<wfw:commentRss>http://www.weez.com/2010/07/zeitgeist-final-edition-multilang-613/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Linux Mint 9 Isadora KDE 32bit RC Edition Screencast Review</title>
		<link>http://www.weez.com/2010/07/linux-mint-9-isadora-kde-32bit-rc-edition-screencast-review/</link>
		<comments>http://www.weez.com/2010/07/linux-mint-9-isadora-kde-32bit-rc-edition-screencast-review/#comments</comments>
		<pubDate>Wed, 14 Jul 2010 14:41:32 +0000</pubDate>
		<dc:creator>Abidoon</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[32bit]]></category>
		<category><![CDATA[Edition]]></category>
		<category><![CDATA[ISADORA]]></category>
		<category><![CDATA[Mint]]></category>
		<category><![CDATA[Review]]></category>
		<category><![CDATA[Screencast]]></category>

		<guid isPermaLink="false">http://www.weez.com/2010/07/linux-mint-9-isadora-kde-32bit-rc-edition-screencast-review/</guid>
		<description><![CDATA[Screencast style Review video to announce the availability for testing of Linux Mint 9 Isadora KDE 32bit RC Edition I demonstrate the Open Source Operating System which is still in development running as both the guest OS inside a Sun VirtualBox Virtual Machine and as the host OS which was Kubuntu 9.10 64bit. Original video [...]]]></description>
			<content:encoded><![CDATA[<p>					<object width="425" height="355"><param name="movie" value="http://www.youtube.com/v/2IYLIukYYKY?fs=1"></param><param name="allowFullScreen" value="true"></param>
					<embed src="http://www.youtube.com/v/2IYLIukYYKY?fs=1" type="application/x-shockwave-flash" width="425" height="355" allowfullscreen="true"></embed></object><br />
Screencast style Review video to announce the availability for testing of Linux Mint 9 Isadora KDE 32bit RC Edition I demonstrate the Open Source Operating System which is still in development running as both the guest OS inside a Sun VirtualBox Virtual Machine and as the host OS which was Kubuntu 9.10 64bit. Original video production by the www.OSGUI.com Tech Show.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.weez.com/2010/07/linux-mint-9-isadora-kde-32bit-rc-edition-screencast-review/feed/</wfw:commentRss>
		<slash:comments>25</slash:comments>
		</item>
		<item>
		<title>Linux Mint 8 KDE Community Edition RC1 Screencast Review</title>
		<link>http://www.weez.com/2010/07/linux-mint-8-kde-community-edition-rc1-screencast-review/</link>
		<comments>http://www.weez.com/2010/07/linux-mint-8-kde-community-edition-rc1-screencast-review/#comments</comments>
		<pubDate>Mon, 05 Jul 2010 16:38:52 +0000</pubDate>
		<dc:creator>Abidoon</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Community]]></category>
		<category><![CDATA[Edition]]></category>
		<category><![CDATA[Mint]]></category>
		<category><![CDATA[Review]]></category>
		<category><![CDATA[Screencast]]></category>

		<guid isPermaLink="false">http://www.weez.com/2010/07/linux-mint-8-kde-community-edition-rc1-screencast-review/</guid>
		<description><![CDATA[Linux Mint 8 KDE Community Edition RC1 Screencast Review Original www.OSGUI.com Tech Show episode.]]></description>
			<content:encoded><![CDATA[<p>					<object width="425" height="355"><param name="movie" value="http://www.youtube.com/v/7BagFTu6DIo?fs=1"></param><param name="allowFullScreen" value="true"></param>
					<embed src="http://www.youtube.com/v/7BagFTu6DIo?fs=1" type="application/x-shockwave-flash" width="425" height="355" allowfullscreen="true"></embed></object><br />
Linux Mint 8 KDE Community Edition RC1 Screencast Review Original www.OSGUI.com Tech Show episode.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.weez.com/2010/07/linux-mint-8-kde-community-edition-rc1-screencast-review/feed/</wfw:commentRss>
		<slash:comments>25</slash:comments>
		</item>
		<item>
		<title>Beginning Ubuntu Linux, Fourth Edition</title>
		<link>http://www.weez.com/2010/07/beginning-ubuntu-linux-fourth-edition/</link>
		<comments>http://www.weez.com/2010/07/beginning-ubuntu-linux-fourth-edition/#comments</comments>
		<pubDate>Thu, 01 Jul 2010 18:29:09 +0000</pubDate>
		<dc:creator>Abidoon</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Beginning]]></category>
		<category><![CDATA[Edition]]></category>
		<category><![CDATA[Fourth]]></category>
		<category><![CDATA[Ubuntu]]></category>

		<guid isPermaLink="false">http://www.weez.com/2010/07/beginning-ubuntu-linux-fourth-edition/</guid>
		<description><![CDATA[ISBN13: 9781430219996 Condition: NEW Notes: Brand New from Publisher. No Remainder Mark. Product DescriptionBeginning Ubuntu Linux, Fourth Edition is the update to the best–selling book on Ubuntu, today’s hottest Linux distribution. Targeting newcomers to Linux and to the Ubuntu distribution alike, readers are presented with an introduction to the world of Linux and open source [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.amazon.com/Beginning-Ubuntu-Linux-Fourth-Thomas/dp/1430219998%3FSubscriptionId%3D0C19XXHDAH4R099HQER2%26tag%3Dreaditlcom-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D1430219998" rel="nofollow"><img style="float:left;margin: 0 20px 10px 0;" src="http://ecx.images-amazon.com/images/I/518Oz-h%2BoxL._SL160_.jpg" /></a></p>
<ul>
<li>ISBN13: 9781430219996</li>
<li>Condition: NEW</li>
<li>Notes: Brand New from Publisher. No Remainder Mark.</li>
</ul>
<p><b>Product Description</b><br />Beginning Ubuntu Linux, Fourth Edition is the update to the best–selling book on Ubuntu, today’s hottest Linux distribution. Targeting newcomers to Linux and to the Ubuntu distribution alike, readers are presented with an introduction to the world of Linux and open source community, followed by a detailed overview of Ubuntu’s installation and configuration process. From there readers learn how to wield total control over their newly installed operating system,&#8230; <a href="http://www.amazon.com/Beginning-Ubuntu-Linux-Fourth-Thomas/dp/1430219998%3FSubscriptionId%3D0C19XXHDAH4R099HQER2%26tag%3Dreaditlcom-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D1430219998" rel="nofollow">More >></a></p>
<p><a href="http://www.amazon.com/Beginning-Ubuntu-Linux-Fourth-Thomas/dp/1430219998%3FSubscriptionId%3D0C19XXHDAH4R099HQER2%26tag%3Dreaditlcom-20%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D1430219998" title="Beginning Ubuntu Linux, Fourth Edition" rel="nofollow"><b>Beginning Ubuntu Linux, Fourth Edition</b></a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.weez.com/2010/07/beginning-ubuntu-linux-fourth-edition/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>

