<?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; bases de datos</title>
	<atom:link href="http://www.sgmendez.com/tag/bases-de-datos/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>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>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>MySQL: Acceso a un servidor remoto</title>
		<link>http://www.sgmendez.com/2008/05/15/mysql-acceso-a-un-servidor-remoto/</link>
		<comments>http://www.sgmendez.com/2008/05/15/mysql-acceso-a-un-servidor-remoto/#comments</comments>
		<pubDate>Thu, 15 May 2008 08:28:57 +0000</pubDate>
		<dc:creator>Salvador Mendez</dc:creator>
				<category><![CDATA[Internet]]></category>
		<category><![CDATA[Programacion]]></category>
		<category><![CDATA[Software Libre]]></category>
		<category><![CDATA[Webmasters]]></category>
		<category><![CDATA[bases de datos]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://www.sgmendez.com/?p=42</guid>
		<description><![CDATA[La instalaci&#243;n por defecto de MySQL no da acceso a servidores remotos. Para poder conectarse en remoto a la base de datos de MySQL son necesarias dos cosas:

La primera que el usuario de MySQL con el que se quiere acceder tenga permisos para acceder desde cualquier servidor. Para lograr esto es necesario indicar en el [...]]]></description>
			<content:encoded><![CDATA[<p>La instalaci&oacute;n por defecto de MySQL no da acceso a servidores remotos. Para poder conectarse en remoto a la base de datos de MySQL son necesarias dos cosas:<br/></p>
<ul>
<li>La primera que el usuario de MySQL con el que se quiere acceder tenga permisos para acceder desde cualquier servidor. Para lograr esto es necesario indicar en el campo Host de la tabla user de la base de datos mysql el parametro que indica cualquier servidor que es el simbolo &#8216;%&#8217;.&nbsp; En el manual de MySQL tienes m&aacute;s informaci&oacute;n sobre como <a href="http://dev.mysql.com/doc/refman/5.0/es/account-management-sql.html" target="_blank">administrar usuarios de base de datos</a>.</li>
<li>Lo segundo es modificar en el fichero <span style="font-weight: bold;">my.cnf </span>(si mysql corre sobre una maquina linux) o<span style="font-weight: bold;"> my.ini </span>(en el caso de un servidor Windows) el par&aacute;metro bind-address, que por defecto viene con 127.0.0.1, y cambiarlo a 0.0.0.0 para que sea accesible desde cualquier servidor.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.sgmendez.com/2008/05/15/mysql-acceso-a-un-servidor-remoto/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
	</channel>
</rss>

