<?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>Capitangolo.net &#187; MySQL-es</title>
	<atom:link href="http://www.capitangolo.net/Blog/?feed=rss2&#038;cat=37" rel="self" type="application/rss+xml" />
	<link>http://www.capitangolo.net/Blog</link>
	<description>GoLo golgotea golos golgoteados</description>
	<lastBuildDate>Thu, 31 Dec 2009 18:30:02 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Tiempo de importación en MySQL</title>
		<link>http://www.capitangolo.net/Blog/?p=305</link>
		<comments>http://www.capitangolo.net/Blog/?p=305#comments</comments>
		<pubDate>Thu, 30 Jul 2009 12:03:19 +0000</pubDate>
		<dc:creator>golo</dc:creator>
				<category><![CDATA[MySQL-es]]></category>
		<category><![CDATA[Tecnología]]></category>
		<category><![CDATA[benchmarking]]></category>
		<category><![CDATA[innodb]]></category>
		<category><![CDATA[memory]]></category>
		<category><![CDATA[myisam]]></category>
		<category><![CDATA[MySQL]]></category>

		<guid isPermaLink="false">http://www.capitangolo.net/Blog/?p=305</guid>
		<description><![CDATA[
Una de las formas para importar datos en MySQL es el comando LOAD DATA INFILE. Es más rápido que un dump, ya que se leen los datos en bruto, en lugar de sentencias SQL.


El tiempo de importación depende del motor que use la tabla, por ejemplo, MyISAM puede ser 40 times más rápido que Innodb. [...]]]></description>
			<content:encoded><![CDATA[<p>
Una de las formas para <strong>importar datos</strong> en MySQL es el comando LOAD DATA INFILE. Es más rápido que un dump, ya que se leen los datos en bruto, en lugar de sentencias SQL.
</p>
<p>
El <strong>tiempo</strong> de importación depende del <strong>motor</strong> que use la tabla, por ejemplo, MyISAM puede ser 40 times más rápido que Innodb. Vamos a probarlo:
</p>
<h3>Preparación</h3>
<p>
Voy a utilizar MySQL 5.1.36 (64 bits MacOS X) para hacer las pruebas. Necesitaré una tabla grande, así que partiré de la tabla City de la <a href="http://dev.mysql.com/doc/#sampledb">Base de datos world</a> y crearé una tabla más grande que se llame &#8220;city_huge&#8221;:
</p>
<pre>
CREATE TABLE city_huge LIKE CITY;

INSERT INTO city_huge
    SELECT NULL, name, CountryCode, District, Population FROM city;
# Ejecuta 100 veces esta sentencia,
# así city_huge será 100 veces más grande que city.
# Un consejo, usa un script, una tabla temporal,
# un procedimiento almacenado...
# o dile a tu mono que lo haga por tí.

SELECT COUNT(*) FROM city_huge;
#   +----------+
#   | COUNT(*) |
#   +----------+
#   |   <strong>407900</strong> |
#   +----------+

# Haz una copia de seguridad de tu tabla:
SELECT * FROM city_huge INTO OUTFILE 'city_huge.bak';

# Trunca la tabla, empezaremos con la tabla vacía.
TRUNCATE TABLE city_huge;
</pre>
<h3>Importar diréctamente</h3>
<p>
Vamos a reestablecer la copia de seguridad en la tabla city_huge, usando MyISAM, InnoDB y MEMORY:
</p>
<pre>
LOAD DATA INFILE 'city_huge.bak' INTO TABLE city_huge;
#   Query OK, ... (<strong>5.85 sec</strong>)
# Eso era usando MyISAM.

# Vaciamos la tabla y cambiamos el motor a InnoDB:
TRUNCATE TABLE city_huge;
ALTER TABLE city_huge ENGINE = InnoDB;
LOAD DATA INFILE 'city_huge.bak' INTO TABLE city_huge;
#   Query OK, ... (<strong>3 min 59.53 sec</strong>)

# Con Memory:
TRUNCATE TABLE city_huge;
SET @@max_heap_size= 128 * 1024 * 1024;
ALTER TABLE city_huge ENGINE = MEMORY;
LOAD DATA INFILE 'city_huge.bak' INTO TABLE city_huge;
#   Query OK, ... (<strong>2.18 sec</strong>)
</pre>
<table>
<tr>
<th>MyISAM</th>
<td>0:5.85</td>
</tr>
<tr>
<th>InnoDB</th>
<td>3:59.53</td>
</tr>
<tr>
<th>MEMORY</th>
<td>0:2.18</td>
</tr>
</table>
<p>
Wow, MyISAM es unas 40 veces más rápido. MEMORY es incluso más rápido.
</p>
<h3>Alter Table</h3>
<p>
De acuerdo, InnoDB es un poco lento, pero a veces no se puede usar otro motor de bases de datos. En esos casos, podemos intentar importar en un motor y luego <strong>cambiar el motor de la tabla</strong> a InnoDB.
</p>
<p>
Sería algo así:
</p>
<pre>
TRUNCATE TABLE city_huge;
ALTER TABLE city_huge ENGINE = MyISAM;
LOAD DATA INFILE 'city_huge.bak' INTO TABLE city_huge;
#   Query OK, ... (<strong>5.85 sec</strong>)
ALTER TABLE city_huge ENGINE = InnoDB;
#   Query OK, ... (<strong>4 min 11.24 sec</strong>)
</pre>
<p>
Ooops, 4 min 17 sec es más que 3 min 59 sec.
</p>
<p>
Vamos a intentarlo con Memory:
</p>
<pre>
TRUNCATE TABLE city_huge;
SET @@max_heap_size= 128 * 1024 * 1024;
ALTER TABLE city_huge ENGINE = MEMORY;
LOAD DATA INFILE 'city_huge.bak' INTO TABLE city_huge;
#   Query OK, ... (<strong>2.18 sec</strong>)
ALTER TABLE city_huge ENGINE = InnoDB;
# Query OK, ... (<strong>3 min 28.39 sec</strong>)
</pre>
<p>
Sí, 3 min 31 sec es más rápido que 4 min. 30 seconds, es cerca de un <strong>10% más rápido</strong>.
</p>
<h3> Exención de responsabilidad </h3>
<p>
Esta prueba se ha hecho usando la <strong>configuración por defecto</strong>, estoy seguro de que ajustando InnoDB se mejorarán los resultados. Tampoco soy muy estricto con mis pruebas, así que te animo a que <strong>prepares tus propias pruebas</strong>.
</p>
<p>
Esta solución no es algo aplicable siempre, el motor MEMORY necesita <strong>grandes cantidades de memoria</strong>. Esta NO siempre es la mejor manera de hacer las cosas, InnoDB debería ser más rápido por sí sólo.
</p>
<p>
De todas formas, es <strong>divertido</strong> encontrar estos comportamientos no tan obvios <img src='http://www.capitangolo.net/Blog/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> .
</p>
<p>
<a href="http://www.capitangolo.net/Blog/?p=293#comments">Leer Comentarios versión Inglesa</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.capitangolo.net/Blog/?feed=rss2&amp;p=305</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Sun Open Communities Forum</title>
		<link>http://www.capitangolo.net/Blog/?p=275</link>
		<comments>http://www.capitangolo.net/Blog/?p=275#comments</comments>
		<pubDate>Fri, 19 Jun 2009 12:50:02 +0000</pubDate>
		<dc:creator>golo</dc:creator>
				<category><![CDATA[MySQL-es]]></category>

		<guid isPermaLink="false">http://www.capitangolo.net/Blog/?p=275</guid>
		<description><![CDATA[
Estoy pasando unos días estupendos en el &#8220;Sun Open Communities Forum&#8221;, en Bohadilla del Monte, Madrid.


Una oportunidad estupenda para reunirse con la comunidad sun/mysql de españa.


Esta tarde imparto una charla &#8220;No mueras de éxito&#8221; a las 3:45 pm. En ella trataré de manera divulgativa temas como la SQL Caché, replicación o el Enterprise Monitor. Puedes [...]]]></description>
			<content:encoded><![CDATA[<p>
Estoy pasando unos días estupendos en el &#8220;Sun Open Communities Forum&#8221;, en Bohadilla del Monte, Madrid.
</p>
<p>
Una oportunidad estupenda para reunirse con la comunidad sun/mysql de españa.
</p>
<p>
Esta tarde imparto una charla &#8220;No mueras de éxito&#8221; a las 3:45 pm. En ella trataré de manera divulgativa temas como la SQL Caché, replicación o el Enterprise Monitor. Puedes seguir la charla en directo desde <a href="http://sunopencommunitiesforum.es/evento_.html">la página del evento</a>
</p>
<p>
Después de mi charla, <a href="http://blogs.sun.com/jorgeSanchez">Jorge Sanchez</a> presentará la recién creada comunidad española de mysql, <a href="http://comunidadmysql.org">comunidadmysql.org</a>.
</p>
<p>
Saludos ¡Nos vemos en <a href="http://comunidadmysql.org">la comunidad</a>!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.capitangolo.net/Blog/?feed=rss2&amp;p=275</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
