<?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>Salvador G. Mendez &#187; MySQL</title>
	<atom:link href="http://www.sgmendez.com/tag/mysql/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.sgmendez.com</link>
	<description>Blog de un webmaster</description>
	<lastBuildDate>Mon, 06 Feb 2012 20:45:33 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Tipos de índices en MySQL</title>
		<link>http://www.sgmendez.com/2011/10/04/tipos-indices-mysql/</link>
		<comments>http://www.sgmendez.com/2011/10/04/tipos-indices-mysql/#comments</comments>
		<pubDate>Tue, 04 Oct 2011 16:42:22 +0000</pubDate>
		<dc:creator>Salvador Mendez</dc:creator>
				<category><![CDATA[BBDD]]></category>
		<category><![CDATA[indices]]></category>
		<category><![CDATA[MySQL]]></category>

		<guid isPermaLink="false">http://www.sgmendez.com/?p=456</guid>
		<description><![CDATA[Los índices son un grupo de datos vinculado a una o varias columnas que almacena una relación entre el contenido y la fila en la que se encuentra. Con esto se agilizan las búsquedas en una tabla al evitar que MySQL tenga que recorrer toda la tabla para obtener los datos solicitados.
Por tanto la creación [...]]]></description>
			<content:encoded><![CDATA[<p>Los índices son un grupo de datos vinculado a una o varias columnas que almacena una relación entre el contenido y la fila en la que se encuentra. Con esto se agilizan las búsquedas en una tabla al evitar que MySQL tenga que recorrer toda la tabla para obtener los datos solicitados.</p>
<p>Por tanto la creación de índices es de vital importancia para acelerar las consultas a base de datos, sobre todo cuando las tablas presentan un tamaño considerable. Pero los índices no son el remedio a todos los males, puesto que estos cambian cada vez que la columna asociada se modifica, no se deberían crear indices sobre columnas en las que son frecuentes las operaciones de escritura. También habrá que tener en cuenta que los índices ocupan espacio, en algunos caso más que la tabla a la que hacen referencia.</p>
<p>En MySQL hay cinco tipos de índices:</p>
<ul>
<li>PRIMARY KEY: Este índice se ha creado para generar consultas especialmente rápidas, debe ser único y no se admite el almacenamiento de NULL.</li>
<li>KEY o INDEX: Son usados indistintamente por MySQL, permite crear indices sobre una columna, sobre varias columnas o sobre partes de una columna.</li>
<li>UNIQUE: Este tipo de índice no permite el almacenamiento de valores iguales.</li>
<li>FULLTEXT: Permiten realizar búsquedas de palabras. Sólo pueden usarse sobre columnas CHAR, VARCHAR o TEXT</li>
<li>SPATIAL: Este tipo de índices solo puede usarse sobre columnas de datos geométricos (spatial) y en el motor MyISAM</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.sgmendez.com/2011/10/04/tipos-indices-mysql/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Funcionamiento del proceso de consulta en MySQL</title>
		<link>http://www.sgmendez.com/2011/03/14/funcionamiento-proceso-consulta-mysql/</link>
		<comments>http://www.sgmendez.com/2011/03/14/funcionamiento-proceso-consulta-mysql/#comments</comments>
		<pubDate>Mon, 14 Mar 2011 00:22:37 +0000</pubDate>
		<dc:creator>Salvador Mendez</dc:creator>
				<category><![CDATA[BBDD]]></category>
		<category><![CDATA[cache]]></category>
		<category><![CDATA[consulta]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[optimizacion]]></category>
		<category><![CDATA[parseo]]></category>

		<guid isPermaLink="false">http://www.sgmendez.com/?p=478</guid>
		<description><![CDATA[Cuando una consulta, del tipo que sea (INSERT, SELECT, GRANT, &#8230;) es enviada a MySQL se ejecuta un procedimiento que consta de cuatro pasos: la caché de consultas, el parseado, la planificación y la ejecución.

1.- La caché de consultas: Cuando se recibe una consulta de tipo SELECT se ejecuta un algoritmo de hash y comprueba [...]]]></description>
			<content:encoded><![CDATA[<p>Cuando una consulta, del tipo que sea (INSERT, SELECT, GRANT, &#8230;) es enviada a MySQL se ejecuta un procedimiento que consta de cuatro pasos: la caché de consultas, el parseado, la planificación y la ejecución.</p>
<ul>
<ol><strong>1.- La caché de consultas:</strong> Cuando se recibe una consulta de tipo SELECT se ejecuta un algoritmo de hash y comprueba si tiene alguna consulta idéntica almacenada, en caso afirmativo devolverá el resultado cacheado. La caché de consultas es muy útil en tablas que no cambian frecuentemente y donde se realizan muchas peticiones idénticas, suele ser el caso de páginas web dinámicas que muestran el resultado almacenado en base de datos. Se activa con la directiva <a href="http://dev.mysql.com/doc/refman/5.0/es/query-cache.html" target="_blank">query_cache_type</a> en el fiche my.cnf (OFF o 0 desactiva la caché, ON o 1 activa excepto cuando se usa SQL_NO_CACHE y 2 solo guarda resultados en caché cuando se indica expresamente con SQL_CACHE).</ol>
<p></p>
<ol><strong>2.- Parseado:</strong> Si la consulta no se encuentra en caché se parsea, comprobando la sintaxis de la consulta y dividiéndola en sus elementos básicos. Se identifica el tipo de consulta, las tablas que están involucradas y se gestiona la cláusula WHERE para su ejecución.</ol>
<p></p>
<ol><strong>3.- Planificación:</strong> Una identificados todos los elementos que intervendrán en la consulta llega el momento de decidir como será ejecutada. Con EXPLAIN podemos ver el plan que seguirá MySQL para resolver una consulta, lo que nos ayudará a modificar las intenciones de resolución escogiendo la que más nos convenga.</ol>
<p></p>
<ol><strong>4.- Ejecución:</strong> Con todo decidido resta ejecutar la consulta y devolver el resultado.</ol>
</ul>
<p>Y hasta aquí todo el misterio que encierra la ejecución de una consulta sobre MySQL. El modo en el que ayudamos a que MySQL resuelva eficazmente las consultas realizadas determina en la mayoría de los casos el resultado final de rendimiento de una base de datos.</p>
<p>Habitualmente la mayor parte de las bases de datos están mal aprovechas, bien porque han crecido más de lo planteado o por un mal diseño del almacenamiento. Muchas veces se suele intentar solucionar a golpe de mejora de hardware, cuando en realidad una <a href="http://www.sgmendez.com/2011/03/07/optimizacion-bases-datos-mysql/">buena optimización ayudando a MySQL a ejecutar los procesos de consulta</a> suele repercutir en una mejora mucho mayor que ofrecerle un hardware más potente.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sgmendez.com/2011/03/14/funcionamiento-proceso-consulta-mysql/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MySQL: Mejorar las consultas a la base de datos</title>
		<link>http://www.sgmendez.com/2011/03/09/mejorar-consultas-base-datos-mysql/</link>
		<comments>http://www.sgmendez.com/2011/03/09/mejorar-consultas-base-datos-mysql/#comments</comments>
		<pubDate>Tue, 08 Mar 2011 23:38:27 +0000</pubDate>
		<dc:creator>Salvador Mendez</dc:creator>
				<category><![CDATA[BBDD]]></category>
		<category><![CDATA[consultas]]></category>
		<category><![CDATA[mejora]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[optimizacion]]></category>
		<category><![CDATA[registros]]></category>

		<guid isPermaLink="false">http://www.sgmendez.com/?p=461</guid>
		<description><![CDATA[Como segunda parte de la optimización de MySQL podemos mejorar las consultas que realicemos sobre la base de datos. A pesar de ser una tarea tediosa, de vez en cuando es conveniente realizar una revisión de las consultas, comprobando que siguen siendo igual de eficaces que cuando las planteamos.

Como primera recomendación al hacer una consulta [...]]]></description>
			<content:encoded><![CDATA[<p>Como segunda parte de la <a href="http://www.sgmendez.com/2011/03/07/optimizacion-bases-datos-mysql/">optimización de MySQL</a> podemos mejorar las consultas que realicemos sobre la base de datos. A pesar de ser una tarea tediosa, de vez en cuando es conveniente realizar una revisión de las consultas, comprobando que siguen siendo igual de eficaces que cuando las planteamos.</p>
<ul>
<li>Como primera recomendación al hacer una consulta a una tabla es no usar &#8220;*&#8221; en el SELECT. ¿Si no se van a usar todos y cada uno de los campos definidos en esa tabla que sentido tiene que usemos toda la información? Ninguno, pues eso, definir la consulta con <em>SELECT campo1, campo2, &#8230; FROM</em> dará mejor resultado</li>
<li>Probar la consulta que vamos a implementar con EXPLAIN y analizar el resultado. Intentaremos que las consultas que realicemos no contengan <em>ALL</em> en la columna <em>type</em>, puesto que en ese caso se hará un escaneo completo de la tabla.</li>
<li>Los campos utilizados con la cláusula WHERE son buenos candidatos a ser índices, comprueba con EXPLAIN como los usaría MySQL para determinar si está aconsejado su uso.</li>
<li>Evitar el uso innecesario de LIKE y RLIKE, pues realizar comparaciones extensas llevará mucho más tiempo. Si se usan tablas MyISAM pueden utilizarse índices FULLTEXT sobre los campos de texto donde se realice la comparación.</li>
<li>Al insertar registros, resulta más eficiente la escritura de varias sentencias la mismo tiempo que varias por sepado. Con INSERT DELAYED puedes generar una cola que esperará hasta que la tabla no esté siendo utlizada (No puede usarse con todos los motores). Utilizando INSERT LOW_PRIORITY darás prioridad a las sentencias de escritura y con SELECT HIGH_PRIORITY darás prioridad a las sentencias de consulta.</li>
<li>Cuando la cantidad de resultados a devolver por MySQL no va a ser utilizada en su conjunto, como cuando se usa un paginador, devolver la cantidad apropiada utilizando la cláusula LIMIT.
</ul>
<p>Ante todo hay que mantener una premisa básica: <strong>no guardar datos innecesarios y no extraer información que no se va a utilizar</strong>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sgmendez.com/2011/03/09/mejorar-consultas-base-datos-mysql/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Optimización de bases de datos MySQL</title>
		<link>http://www.sgmendez.com/2011/03/07/optimizacion-bases-datos-mysql/</link>
		<comments>http://www.sgmendez.com/2011/03/07/optimizacion-bases-datos-mysql/#comments</comments>
		<pubDate>Mon, 07 Mar 2011 16:17:35 +0000</pubDate>
		<dc:creator>Salvador Mendez</dc:creator>
				<category><![CDATA[BBDD]]></category>
		<category><![CDATA[bases de datos]]></category>
		<category><![CDATA[consultas]]></category>
		<category><![CDATA[funciones]]></category>
		<category><![CDATA[indices]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[optimizacion]]></category>
		<category><![CDATA[procedimientos almacenados]]></category>
		<category><![CDATA[select]]></category>

		<guid isPermaLink="false">http://www.sgmendez.com/?p=458</guid>
		<description><![CDATA[Mantener una base de datos optimizada es una de las claves para lograr una mejora importante en el rendimiento, tanto a nivel de base de datos como una mejora significativa en el rendimiento de las aplicaciones que hacen uso de ellas. Aunque voy a enfocarlo en MySQL, podría aplicarse a la mayoría de gestores de [...]]]></description>
			<content:encoded><![CDATA[<p>Mantener una base de datos optimizada es una de las claves para lograr una mejora importante en el rendimiento, tanto a nivel de base de datos como una mejora significativa en el rendimiento de las aplicaciones que hacen uso de ellas. Aunque voy a enfocarlo en MySQL, podría aplicarse a la mayoría de gestores de base de datos.</p>
<p>Podríamos centrarnos en tres escenarios a la hora de acometer una optimización de MySQL: la optimización de la base de datos, la mejora de las consultas que se realizan sobre ella y por último, pero no menos importante, el pulido de los programas que trabajan con los datos. Hoy vamos a centrarnos en la primera parte.</p>
<p><strong>Optimizar la base de datos</strong></p>
<ul>
<li>El primer punto a tener en cuenta será el diseño de la base de datos en el momento de su creación. No hay mejor remedio que hacer bien las cosas desde un principio. Habrá que pararse a calcular la carga que va a soportar MySQL, tanto a nivel de accesos como la cantidad de datos de habrá que almacenar. También es importante pensar como se extraerán los datos a la hora de hacer las tablas y que relaciones mantendrán esos datos con otras tablas y campos.</li>
<li>Para el uso de cada tipo de campo sobre nuestras tablas debemos buscar siempre los más adecuados al tipo de dato que tendremos que almacenar. Un campo incorrecto forzará a trabajar más de lo necesario a nuestro motor de base de datos. Debemos evitar el uso de campos de longitud variable si no los necesitamos, intentaremos usar campos numéricos en lugar de campos de texto y evitaremos que los campos puedan contener NULL (ralentizará las consultas innecesariamente).</li>
<li>Una vez tenemos el modelo de nuestra base de datos, debemos pensar en como se consultarán los datos para generar los índices. Cuando mejores sean los indices que tengamos, con mayor rapidez realizará MySQL las consultas solicitadas. Para ello podemos hacer uso de EXPLAIN para que nos muestre como se harán las consultas y que índices utilizará MySQL. Como orientación será bueno tener índices sobre aquellos campos que sean utilizados en las clausulas WHERE o JOIN, y no crees índices innecesarios, se actualizarán con cada modificación haciendo un trabajo innecesario.</li>
<li>Otro punto importante y en el que la mayoría no se fijan, piensa si no será mejor que la base de datos viva por su cuenta y que las aplicaciones accedan a los datos a través de procedimientos almacenados y funciones. De este modo será posible realizar modificaciones no previstas sin tener que tocar nada en las aplicaciones que acceden a los datos.</li>
<li>Hasta aquí sobre la creación y diseño, ahora viene el apartado de mantenimiento de los datos. Primer consejo y el más importante: <strong>mantener la base de datos con la información necesaria</strong>. Para ello cada cierto tiempo hay que realizar limpieza y eliminar o archivar aquellos datos que ya no sean necesarios. Por otra parte, cuando se han realizado muchos cambios debemos volver a reorganizar la información, para ello ejecutamos OPTIMIZE TABLE, que se encargará de reparar y optimizar los datos e índices de las tablas.</li>
<li>Puede que en determinado momento se produzca una inserción masiva de datos por alguna circunstancia imprevista. Llegados a este punto, lo mejor es volver a analizar si el diseño de la base de datos se sigue correspondiendo con el objetivo definido durante su diseño inicial. Suele ser una de las cosas que más pereza da realizar, sobre todo porque tendrá incidencia sobre las aplicaciones que ya utilizan la base de datos, pero que mejor resultado puede dar cuando hablamos de optimización. En este apartado es cuando vienen muy bien tener procedimientos almacenados y funciones.</li>
</ul>
<p><a href="http://www.sgmendez.com/2011/03/09/mejorar-consultas-base-datos-mysql/">Mejorar las consultas a la base de datos</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.sgmendez.com/2011/03/07/optimizacion-bases-datos-mysql/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Liberada HeidiSQL 6.0</title>
		<link>http://www.sgmendez.com/2010/11/21/liberada-heidisql-6-0/</link>
		<comments>http://www.sgmendez.com/2010/11/21/liberada-heidisql-6-0/#comments</comments>
		<pubDate>Sun, 21 Nov 2010 07:23:12 +0000</pubDate>
		<dc:creator>Salvador Mendez</dc:creator>
				<category><![CDATA[BBDD]]></category>
		<category><![CDATA[base de datos]]></category>
		<category><![CDATA[gestion]]></category>
		<category><![CDATA[heidisql]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[portable]]></category>
		<category><![CDATA[programa]]></category>
		<category><![CDATA[version]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://www.sgmendez.com/?p=451</guid>
		<description><![CDATA[HeidiSQL es una interfaz para la administración de MySQL que permite gestionar las bases de datos a través de una intuitiva interfaz para Windows, disponible para 2000, XP, Vista y 7, aunque también se puede instalar en Linux con Wine.
Esta nueva versión de HeidiSQL [descarga] es el resultado de 331 cambios realizados sobre la versión [...]]]></description>
			<content:encoded><![CDATA[<p>HeidiSQL es una interfaz para la administración de MySQL que permite gestionar las bases de datos a través de una intuitiva interfaz para Windows, disponible para 2000, XP, Vista y 7, aunque también se puede instalar en Linux con Wine.</p>
<p>Esta nueva versión de <a href="http://www.heidisql.com/">HeidiSQL</a> [<a href="http://www.heidisql.com/download.php">descarga</a>] es el resultado de 331 cambios realizados sobre la versión 5.1 y que incluye algunas nuevas funcionalidades como:</p>
<ul>
<li>Resultados por lotes en una misma ficha de consulta</li>
<li>Múltiples conexiones en una sola instancia de la aplicación</li>
<li>Resultados de la consulta editables</li>
<li>Administración de usuarios utilizando la sintaxis GRANT y REVOKE</li>
<li>Ejecución de la consulta actual con [Mayús + Ctrl + F9]</li>
<li>Vista previa de imágenes incluidas en campos BLOB</li>
</ul>
<p>HeidiSQL es una buena alternativa a MySQL Workbench para la gestión de bases de datos, además incluye una versión &#8220;portable&#8221; para poder llevarlo siempre cargado en un USB y tenerlo disponible en cualquier momento, nunca se sabe cuando se va a necesitar acceder a una base de datos.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sgmendez.com/2010/11/21/liberada-heidisql-6-0/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Procedimientos almacenados en MySQL</title>
		<link>http://www.sgmendez.com/2010/11/20/procedimientos-almacenados-mysql/</link>
		<comments>http://www.sgmendez.com/2010/11/20/procedimientos-almacenados-mysql/#comments</comments>
		<pubDate>Sat, 20 Nov 2010 16:23:38 +0000</pubDate>
		<dc:creator>Salvador Mendez</dc:creator>
				<category><![CDATA[BBDD]]></category>
		<category><![CDATA[base de datos]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[procedimientos]]></category>
		<category><![CDATA[Programacion]]></category>
		<category><![CDATA[variable]]></category>

		<guid isPermaLink="false">http://www.sgmendez.com/?p=447</guid>
		<description><![CDATA[Los procedimientos almacenados son un conjunto de instrucciones SQL que se almacenan en el servidor permitiendo hacer referencia al procedimiento almacenado para ejecutar esas funciones en lugar de tener que llamarlas individualmente.
Para poder ejecutar procedimientos almacenados es necesario tener la tabla proc en la base de datos mysql y contar con los permisos necesarios para [...]]]></description>
			<content:encoded><![CDATA[<p>Los procedimientos almacenados son un conjunto de instrucciones SQL que se almacenan en el servidor permitiendo hacer referencia al procedimiento almacenado para ejecutar esas funciones en lugar de tener que llamarlas individualmente.</p>
<p>Para poder ejecutar procedimientos almacenados es necesario tener la tabla <em>proc</em> en la base de datos mysql y contar con los permisos necesarios para trabajar con ellos. Estos son los permisos relacionados con los procedimientos:</p>
<ul>
<li>CREATE ROUTINE: Permite crear procedimientos almacenados</li>
<li>ALTER ROUTINE: Da acceso a la modificación y borrado, se aplica por defecto al creador de un procedimiento.</li>
<li>EXECUTE: Requerido para poder ejecutar procedimientos almacenados, se otorga automáticamente al creador del procedimiento. Por defecto, quien tiene acceso a la base de datos también lo tiene para ejecutar los prodecimientos almacenados para esa base de datos.</li>
</ul>
<p>Vamos a ver un ejemplo de como trabajar con procedimientos almacenados con un sencillo ejemplo. Para crearlo usaremos:</p>
<p>CREATE PROCEDURE sumar (IN valor INTEGER, OUT resultado INTEGER)<br />
    SELECT valor+valor INTO resultado;</p>
<p>Lo que estamos indicando es que se cree el procedimiento &#8220;sumar&#8221; con dos parámetros &#8220;valor&#8221; y &#8220;resultado&#8221;, ambos del tipo INTEGER. El primero es un parametro de entrada y el segundo la variable donde almacenaremos el valor de salida. Ahora vamos a llamarlo usando:</p>
<p>CALL sumar(4, @resultado);</p>
<p>El procedimiento se encargara de hacer la suma de 4+4 y almacenar la salida en la variable @resultado. Para visualizar lo que contiene la variable:</p>
<p>SELECT @resultado;</p>
<p>Los procedimientos son una buena forma de trabajar con los datos almacenados en una base de datos, dejando a MySQL el trabajo de formatear y filtrar el manejo de los datos, por lo que la cantidad de información que ha de viajar entre la base de datos y nuestro programa se reduce considerablemente. Por otra parte usando dos servidores, uno para el programa y otro para la base de datos, podríamos trasladar parte de la carga de procesamiento a la base de datos.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sgmendez.com/2010/11/20/procedimientos-almacenados-mysql/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Utilidad y uso de EXPLAIN en MySQL</title>
		<link>http://www.sgmendez.com/2009/05/07/utilidad-y-uso-de-explain-en-mysql/</link>
		<comments>http://www.sgmendez.com/2009/05/07/utilidad-y-uso-de-explain-en-mysql/#comments</comments>
		<pubDate>Thu, 07 May 2009 16:21:50 +0000</pubDate>
		<dc:creator>Salvador Mendez</dc:creator>
				<category><![CDATA[BBDD]]></category>
		<category><![CDATA[Programacion]]></category>
		<category><![CDATA[Webmasters]]></category>
		<category><![CDATA[bases de datos]]></category>
		<category><![CDATA[informatica]]></category>
		<category><![CDATA[manual]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[optimizacion]]></category>

		<guid isPermaLink="false">http://www.sgmendez.com/?p=197</guid>
		<description><![CDATA[
A la hora de realizar una buena optimización de las consultas de MySQL habrá que prestar mucha atención a lo que dice la cláusula EXPLAIN. Su sintaxis es muy sencilla, basta anteponerlo a la consulta que queremos realizar para obtener toda la información.
EXPLAIN SELECT columna1, columna2 FROM tabla1 WHERE columna3 = &#8216;2&#8242;\G
El resultado que obtendremos [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-full wp-image-321" title="logo_mysql" src="http://www.sgmendez.com/wp-content/upload/2009/03/logo_mysql.gif" alt="logo_mysql" width="114" height="68" /></p>
<p>A la hora de realizar una buena optimización de las consultas de MySQL habrá que prestar mucha atención a lo que dice la cláusula EXPLAIN. Su sintaxis es muy sencilla, basta anteponerlo a la consulta que queremos realizar para obtener toda la información.</p>
<p>EXPLAIN SELECT columna1, columna2 FROM tabla1 WHERE columna3 = &#8216;2&#8242;\G</p>
<p>El resultado que obtendremos será el plan de ejecución de la consulta a la base de datos. Una explicación de como accederá MySQL a las diferentes columnas involucradas en la consulta. EXPLAIN devolverá:</p>
<ul>
<li>id: Es el identificador que EXPLAIN asignará a la consulta.</li>
<li>select_type: Tipo de consulta a analizar. Por ejemplo, si se trata de una consulta sencilla su valor será SIMPLE.</li>
<li>table: Nombre de la tabla a la que hacen referencia el resto de datos en la fila. Hay que tener en cuenta que el orden de las filas será el que utilizará MySQL para acceder a los datos.</li>
<li>type: Indica como MySQL combinará los datos de esa tabla.</li>
<li>possible_keys: Lista de los indices que se podrían utilizar, aunque podría no usarse ninguno.</li>
<li>key: Índice que finalmente se usará, si no se usa ninguno el valor del campo será NULL.</li>
<li>key_len: Tamaño del indice utilizado, si no se usó ninguno contendrá NULL.</li>
<li>ref: Muestra con que campo está relacionado el índice seleccionado.</li>
<li>rows: Número de registros que se tendrán que recuperar para ejecutar la consulta.</li>
<li>extra: Información adicional sobre la forma en que se obtendrán los datos.</li>
</ul>
<p>Con esta información es posible encontrar donde se producen los cuellos de botella en las consultas que realizamos a la base de datos, y nos permitirá optimizarlas para evitar que una consulta lenta provoque un retraso injustificado en la devolución de resultados a los usuarios. En el <a title="Optimizar consultas en MySQL" href="http://dev.mysql.com/doc/refman/5.0/en/using-explain.html" target="_blank">manual de MySQL</a> puedes encontrar más información.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sgmendez.com/2009/05/07/utilidad-y-uso-de-explain-en-mysql/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Replicación en MySQL 5.0</title>
		<link>http://www.sgmendez.com/2008/12/24/replicacion-maestro-esclavo-mysql/</link>
		<comments>http://www.sgmendez.com/2008/12/24/replicacion-maestro-esclavo-mysql/#comments</comments>
		<pubDate>Wed, 24 Dec 2008 10:31:08 +0000</pubDate>
		<dc:creator>Salvador Mendez</dc:creator>
				<category><![CDATA[Programacion]]></category>
		<category><![CDATA[Software Libre]]></category>
		<category><![CDATA[Webmasters]]></category>
		<category><![CDATA[bases de datos]]></category>
		<category><![CDATA[configuracion]]></category>
		<category><![CDATA[Esclavo]]></category>
		<category><![CDATA[Maestro]]></category>
		<category><![CDATA[manual]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[replicacion]]></category>

		<guid isPermaLink="false">http://www.sgmendez.com/?p=283</guid>
		<description><![CDATA[La replicación en MySQL se realiza entre un servidor Maestro (el que contine los datos originales) y uno o varios servidores Esclavos (los que replican los datos). Se realiza utilizando el log binario de MySQL, cuando se realiza un cambio en la base de datos del servidor Maestro, esto cambios son enviados al Esclavo para [...]]]></description>
			<content:encoded><![CDATA[<p>La replicación en MySQL se realiza entre un servidor Maestro (el que contine los datos originales) y uno o varios servidores Esclavos (los que replican los datos). Se realiza utilizando el log binario de MySQL, cuando se realiza un cambio en la base de datos del servidor Maestro, esto cambios son enviados al Esclavo para que los actualice. Hay que tener en cuenta que la replicación sólo se puede realizar en una dirección, del Maestro hacia el Esclavo, y no bidireccinalmente.</p>
<p>El servidor Esclavo mantiene una conexión permanentemente abierta con el Maestro y se comprueba la ultima posición escrita en el log binario del Maestro, cuando se detectan cambios estos se replican el las tablas del servidor Esclavo.</p>
<p>Antes de ponerse a configurar MySQL con una replicación, hay que tener en cuenta la compatibilidad entre versiones. Como norma general debería de intentarse que la versión de MySQL del Maestro y del Esclavo fuesen la misma, y lo más actualizada posible. De todos modos, un Esclavo con una versión más actualizada que el Maestro suele funcionar, pero no al contrario.</p>
<p>Una vez que conocemos como funciona, y realizadas las comprobaciones de versiones podemos configurar Maestro y Esclavo para que ejecuten la replicación. Comenzaremos por la configuración del Maestro. Debemos editar el fichero <em>my.cnf</em> que encontraremos normalmente en <em>/etc/my.cnf</em> o en <em>/etc/mysql/my.cnf</em> dependiendo del sistema que usemos.</p>
<p><span id="more-283"></span></p>
<p>Debemos buscar y editar, o crear en caso de que no existan, dentro de la sección [<em>mysql</em>] las siguientes líneas:</p>
<p><em>[mysql]<br />
log-bin = mysql-bin<br />
server-id = 1<br />
binlog_do_db = base_de_datos_a_replicar, db2, db3<br />
binlog_ignore_db = bases_de_datos_a_ignorar, db4, db5<br />
</em></p>
<p>La opción <em>log-bin</em> activa el log binario de mysql, y <em>server-id</em> sirve para indicar el id del servidor maestro, debe ser un número entero positivo entre 1 y 2³². Con <em>binlog_do_db</em> le indicamos las bases de datos que queremos copiar (separadas por comas) y con <em>binlog_ignore_db</em> aquellas que no queremos replicar. Una vez realizados los cambios debemos reiniciar el servidor mysql.</p>
<p>Ahora necesitamos crear un usuario en el Maestro (se recomienda que se use un usuario de MySQL exclusivamente para hacer la replicación) y asignarle los permisos de replicación con el siguiente comando:</p>
<p><em>mysql&gt; GRANT REPLICATION SLAVE ON *.* </em><br />
<em> -&gt; TO &#8216;usuario_replicacion&#8217;@'%&#8217; </em><br />
<em> -&gt; IDENTIFIED BY &#8216;pass_usuario&#8217;;</em><br />
<em>mysql&gt; FLUSH PRIVILEGES;</em><br />
<em>mysql&gt; LOCK ALL TABLES READ ONLY;</em></p>
<p>Debemos sustituir <em>usuario_replicacion</em> por el nombre de usuario que hemos creado para hacer la repicación y <em>pass_usuario</em> por la contraseña de ese usuario. El valor <em>&#8216;%&#8217;</em> indica que ese usuario puede acceder desde cualquier host remoto, si queremos indicarle que pueda acceder desde un determinado nombre de dominio o IP debemos cambiar <em>%</em> por la IP o nombre de dominio que queramos que acceda a la replicación.</p>
<p>En el fichero de configuración del Esclavo debemos indicarle un server-id distinto del servidor Maestro, también un número entero positivo entre 1 y 2³². Por ejemplo:</p>
<p><em>[mysql]<br />
server-id = 2<br />
</em></p>
<p>Si se están configurando varios esclavos cada uno de ellos debe de tener un server-id único, y diferentes del server-id del maestro. Una vez guardados los cambios reinicia el servidor MySQL.</p>
<p>Ahora ya tenemos listos Maestro y Esclavo para realizar la conexión. Ahora debemos hacer un volcado de la base de datos del servidor Maestro que queremos replicar:</p>
<p><em>[root@servidor-maestro]:~$ mysqldump -u usuario -p nombre_db &gt; nombre_db.sql</em></p>
<p>Con este comando haremos un volcado de la base de datos a un fichero. Debemos sustituir <em>nombre_db</em> por el nombre de la base de datos que vamos a replicar y <em>usuario</em> por el nombre del usuario con privilegios de administracion. Si no tenemos contraseña para ese usuario no incluiremos la opción <em>-p</em>, en caso contrario nos pedirá la contraseña antes de realizar el volcado.</p>
<p>Ya solo nos queda un paso en el Maestro, conocer el nombre del log binario que se está utiliando y la posición del mismo, accedemos a la línea de comandos de MySQL y ejecutamos:</p>
<p><em>mysql&gt; SHOW MASTER STATUS;<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+&#8212;&#8212;&#8212;-+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+<br />
| File                         | Position | Binlog_Do_DB | Binlog_Ignore_DB  |<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+&#8212;&#8212;&#8212;-+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+<br />
| mysql-bin.0005 |           98  |                                 |                                        |<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+&#8212;&#8212;&#8212;-+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+</em></p>
<p>Guardamos esos datos y desbloqueamos las tablas del maestro con:</p>
<p><em>mysql&gt; UNLOCK ALL TABLES;</em></p>
<p>Ahora volvemos al esclavo y cargamos el volvado de la base de datos del maestro que realizamos antes:</p>
<p><em>[root@servidor-esclavo]:~$ mysql -u usuario -p nombre_db &lt; nombre_db.sql</em></p>
<p>Cuando se temine la carga de la base de datos, accedemos a la línea de comandos de MySQL del esclado para indicarle los datos del maestro e iniciar el esclavo:</p>
<p><em>mysql&gt; CHAGE MASTER TO MASTER_HOST = &#8216;ip_del_servidor_maestro&#8217;;</em><br />
<em>mysql&gt; CHAGE MASTER TO MASTER_USER = &#8216;usuario_replicacion&#8217;;</em><br />
<em>mysql&gt; CHAGE MASTER TO MASTER_PASSWORD = &#8216;pass_usuario&#8217;;</em><br />
<em>mysql&gt; CHAGE MASTER TO MASTER_LOG_FILE = &#8216;mysql-bin.0005&#8242;;</em><br />
<em>mysql&gt; CHAGE MASTER TO MASTER_LOG_POS = 98;</em><br />
<em>mysql&gt; START SLAVE;</em></p>
<p>Después de esto el servidor Esclavo iniciará la replicación copiando todo lo sucedido desde la posición del log binario indicada hasta ese instante. Para confirmar que todo es correcto podemos ejecutar el siguiente comando en la consola de MySQL:</p>
<p><em>mysql&gt; SHOW SLAVE STATUS \G</em><br />
<em>****************** 1. Row ***********************</em><br />
<em>Slave_IO_State: Waiting for master to send event</em><br />
<em>Master_Host: 192.168.1.54</em><br />
<em>Master_User: usuario_replica</em><br />
<em>Master_Port: 3306</em><br />
<em>Connect_Retry: 60</em><br />
<em>Master_Log_File: mysql-bin.0005</em><br />
<em>Read_Master_Log_Pos: 98</em><br />
<em>Relay_Log_File: esclavo-rely-bin.0001</em><br />
<em>Relay_Log_Pos: 105</em><br />
<em>Slave_IO_Running: Yes</em><br />
<em>Slave_SQL_Running: Yes</em><br />
<em>Seconds_Behind_Master: 0</em></p>
<p>Aunque apareceran más cosas, las he omitido, lo que debeis tener en cuenta es <em>Seconds_Behind_Master</em> pues indica el tiempo en segundos que el Esclavo tiene con respecto al Maestro. Creo que no me queda nada, teneis más información en el <a href="http://dev.mysql.com/doc/refman/5.0/es/replication.html" target="_blank">manual de MySQL</a>, y si teneis alguna duda dejadla en los comentarios.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.sgmendez.com/2008/12/24/replicacion-maestro-esclavo-mysql/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>A2Billing: Programa de facturación para Asterisk</title>
		<link>http://www.sgmendez.com/2008/05/16/a2billing-programa-de-facturacion-para-asterisk/</link>
		<comments>http://www.sgmendez.com/2008/05/16/a2billing-programa-de-facturacion-para-asterisk/#comments</comments>
		<pubDate>Fri, 16 May 2008 15:31:25 +0000</pubDate>
		<dc:creator>Salvador Mendez</dc:creator>
				<category><![CDATA[Negocios]]></category>
		<category><![CDATA[Programacion]]></category>
		<category><![CDATA[Software Libre]]></category>
		<category><![CDATA[Tecnologia]]></category>
		<category><![CDATA[A2Billing]]></category>
		<category><![CDATA[Asterisk]]></category>
		<category><![CDATA[centralita]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[telefonia]]></category>
		<category><![CDATA[VoIP]]></category>

		<guid isPermaLink="false">http://www.sgmendez.com/?p=44</guid>
		<description><![CDATA[
Asterisk es una centralita telef&#243;nica bajo software libre. Nos permite tener un sistema de telefon&#237;a IP bajo diferentes protocolos y con distintos proveedores. Todo esto nos da la posibilidad de ofrecer llamadas a otros usuarios, lo cual en algunos casos puede significar crear un negocio con esto.
Y como en cualquier negocio lo importante es poder [...]]]></description>
			<content:encoded><![CDATA[<div style="text-align: center;"><img src="http://www.sgmendez.com/wp-content/upload/2008/05/a2billing.png" alt=""/></div>
<p><a href="http://www.asterisk.org/" target="_blank">Asterisk </a>es una centralita telef&oacute;nica bajo software libre. Nos permite tener un sistema de telefon&iacute;a IP bajo diferentes protocolos y con distintos proveedores. Todo esto nos da la posibilidad de ofrecer llamadas a otros usuarios, lo cual en algunos casos puede significar crear un negocio con esto.<br/><br />
Y como en cualquier negocio lo importante es poder facturar, en este caso en funci&oacute;n del destino de la llamada, el horario o el tipo de servicio utilizado. Para lograrlo <a href="http://www.asterisk2billing.org" target="_blank">A2Billing </a>provee un software a trav&eacute;s de entorno web que nos permite definir precios, tramos horarios, etc. Esta herramienta est&aacute; desarrollada bajo PHP y MySQL.<br/></p>
]]></content:encoded>
			<wfw:commentRss>http://www.sgmendez.com/2008/05/16/a2billing-programa-de-facturacion-para-asterisk/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>En Twitter el 15-05-2008</title>
		<link>http://www.sgmendez.com/2008/05/15/en-twitter-el-2008-05-15/</link>
		<comments>http://www.sgmendez.com/2008/05/15/en-twitter-el-2008-05-15/#comments</comments>
		<pubDate>Thu, 15 May 2008 21:59:59 +0000</pubDate>
		<dc:creator>Salvador Mendez</dc:creator>
				<category><![CDATA[Twitter]]></category>
		<category><![CDATA[blog]]></category>
		<category><![CDATA[factura electronica]]></category>
		<category><![CDATA[feeds]]></category>
		<category><![CDATA[ingles]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Programacion]]></category>
		<category><![CDATA[servidores]]></category>

		<guid isPermaLink="false">http://www.sgmendez.com/2008/05/15/en-twitter-el-2008-05-15/</guid>
		<description><![CDATA[
Buenos d&#237;as. Son las 5 de la madrugada y estoy desvelado, voy a leer unos feeds a ver si me entra el sue&#241;o #
Que bien sienta una buena sesi&#243;n de deporte por la ma&#241;ana #
New blog post: MySQL: Acceso a un servidor remoto http://tinyurl.com/5rukmw #
Tengo hambre, voy a hacer una parada para comer algo #
Cada [...]]]></description>
			<content:encoded><![CDATA[<ul class="aktt_tweet_digest">
<li>Buenos d&iacute;as. Son las 5 de la madrugada y estoy desvelado, voy a leer unos feeds a ver si me entra el sue&ntilde;o <a href="http://twitter.com/Mendez/statuses/811589881">#</a></li>
<li>Que bien sienta una buena sesi&oacute;n de deporte por la ma&ntilde;ana <a href="http://twitter.com/Mendez/statuses/811714774">#</a></li>
<li>New blog post: MySQL: Acceso a un servidor remoto <a rel="nofollow" href="http://tinyurl.com/5rukmw">http://tinyurl.com/5rukmw</a> <a href="http://twitter.com/Mendez/statuses/811749059">#</a></li>
<li>Tengo hambre, voy a hacer una parada para comer algo <a href="http://twitter.com/Mendez/statuses/811760529">#</a></li>
<li>Cada peque&ntilde;a, casi infima, interrupci&oacute;n retrasa un gran proyecto lo suficiente como para no hacerles caso <a href="http://twitter.com/Mendez/statuses/811816125">#</a></li>
<li>De vuelta en la oficina, a seguir programando que tengo que teminar esto hoy <a href="http://twitter.com/Mendez/statuses/811943165">#</a></li>
<li>MySQL Administrator, una buena herramienta cuando se trabaja con muchos servidores de bases de datos MySQL <a href="http://twitter.com/Mendez/statuses/811977512">#</a></li>
<li>Tengo que preparar un peque&ntilde;o resumen del evento sobre factura electr&oacute;nica de ayer para publicar en el blog, que luego me olvido <a href="http://twitter.com/Mendez/statuses/811995798">#</a></li>
<li>Termimando el post sobre factura electronica antes de ir a clase de ingles <a href="http://twitter.com/Mendez/statuses/812122810">#</a></li>
<li>New blog post: Obigaciones espec&iacute;ficas de la factura electr&oacute;nica <a rel="nofollow" href="http://tinyurl.com/6x2kcx">http://tinyurl.com/6&#215;2kcx</a> <a href="http://twitter.com/Mendez/statuses/812127585">#</a></li>
<li>Revisando estad&iacute;stacas y ratios <a href="http://twitter.com/Mendez/statuses/812253828">#</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.sgmendez.com/2008/05/15/en-twitter-el-2008-05-15/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

