<?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>Otro Blog Más &#187; mysql</title>
	<atom:link href="http://otroblogmas.com/category/mysql/feed/" rel="self" type="application/rss+xml" />
	<link>http://otroblogmas.com</link>
	<description>Blog de informática: programación, internet, php, wordpress, zend framework, mysql, windows, mootools, linux,...</description>
	<lastBuildDate>Tue, 07 Sep 2010 10:10:22 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>La selectividad de los índices en MySQL</title>
		<link>http://otroblogmas.com/selectividad-indices-mysql/</link>
		<comments>http://otroblogmas.com/selectividad-indices-mysql/#comments</comments>
		<pubDate>Mon, 24 May 2010 07:00:16 +0000</pubDate>
		<dc:creator>otroblogmas.com</dc:creator>
				<category><![CDATA[mysql]]></category>
		<category><![CDATA[performance]]></category>
		<category><![CDATA[script]]></category>
		<category><![CDATA[selectivity]]></category>

		<guid isPermaLink="false">http://otroblogmas.com/?p=1945</guid>
		<description><![CDATA[Agrego la definición de selectividad respecto a índices en motores de bases de datos: La selectividad es la relación que hay entre el número de valores posibles en una columna, y el número total de registros. La mejor selectividad es 1, y ocurre cuando hay tantos valores posibles como registros presentes, precisamente en el caso [...]


Entradas relacionadas:<ol><li><a href='http://otroblogmas.com/diferencias-entre-enum-y-set-en-mysql/' rel='bookmark' title='Permanent Link: Diferencias entre ENUM y SET en MySQL'>Diferencias entre ENUM y SET en MySQL</a></li>
<li><a href='http://otroblogmas.com/trabajando-con-el-tipo-de-campo-bit-de-mysql-en-php/' rel='bookmark' title='Permanent Link: Trabajando con el tipo de campo BIT de MySQL en PHP'>Trabajando con el tipo de campo BIT de MySQL en PHP</a></li>
<li><a href='http://otroblogmas.com/funcion-group_concat-de-mysql/' rel='bookmark' title='Permanent Link: Función GROUP_CONCAT de MySQL'>Función GROUP_CONCAT de MySQL</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;"><a href="http://otroblogmas.com/wp-content/uploads/2010/05/bd-performance.gif"><img class="alignright size-full wp-image-1952" title="Performance de base de datos" src="http://otroblogmas.com/wp-content/uploads/2010/05/bd-performance.gif" alt="Performance de base de datos" width="100" height="100" /></a>Agrego la definición de selectividad respecto a <strong>índices en motores de bases de datos</strong>:</p>
<blockquote>
<p style="text-align: justify;">La <strong>selectividad </strong>es la relación que hay entre el número de valores posibles en una columna, y el número total de registros. <strong>La mejor selectividad</strong> es 1, y ocurre cuando hay tantos valores posibles como registros presentes, precisamente en el caso de una clave primaria sobre una columna; <strong>la peor selectividad</strong> es la que tiende a 0, y ocurre cuando hay muy pocos valores posibles en relación a los registros presentes, por ejemplo una columna sexo.</p>
</blockquote>
<p><span id="more-1945"></span></p>
<p>De esta manera, <strong>no es eficiente</strong> crear índices para columnas que tienen un <strong>número pequeño de posible valores</strong>. Incluso he leído, que un optimizador de consultas decente ignorará la presencia de un índice sobre esa columna con poco valores distintos, porque notará que la selectividad es muy baja.</p>
<p style="text-align: justify;">A través del <a href="http://snipplr.com/users/Eloi/">Snipplr</a> de un compañero de trabajo, descubro un <a href="http://forge.mysql.com/tools/tool.php?id=85">interesante script</a> que retorna <strong>los 10 índices de MySQL con el peor rendimiento</strong>:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">/*
SQL script to grab the worst performing indexes
in the whole server
*/</span>
<span style="color: #993333; font-weight: bold;">SELECT</span>
  t<span style="color: #66cc66;">.</span>TABLE_SCHEMA <span style="color: #993333; font-weight: bold;">AS</span> <span style="color: #ff0000;">`db`</span>
 <span style="color: #66cc66;">,</span> t<span style="color: #66cc66;">.</span>TABLE_NAME <span style="color: #993333; font-weight: bold;">AS</span> <span style="color: #ff0000;">`table`</span>
 <span style="color: #66cc66;">,</span> s<span style="color: #66cc66;">.</span>INDEX_NAME <span style="color: #993333; font-weight: bold;">AS</span> <span style="color: #ff0000;">`inde name`</span>
 <span style="color: #66cc66;">,</span> s<span style="color: #66cc66;">.</span>COLUMN_NAME <span style="color: #993333; font-weight: bold;">AS</span> <span style="color: #ff0000;">`field name`</span>
 <span style="color: #66cc66;">,</span> s<span style="color: #66cc66;">.</span>SEQ_IN_INDEX <span style="color: #ff0000;">`seq in index`</span>
 <span style="color: #66cc66;">,</span> s2<span style="color: #66cc66;">.</span>max_columns <span style="color: #993333; font-weight: bold;">AS</span> <span style="color: #ff0000;">`# cols`</span>
 <span style="color: #66cc66;">,</span> s<span style="color: #66cc66;">.</span>CARDINALITY <span style="color: #993333; font-weight: bold;">AS</span> <span style="color: #ff0000;">`card`</span>
 <span style="color: #66cc66;">,</span> t<span style="color: #66cc66;">.</span>TABLE_ROWS <span style="color: #993333; font-weight: bold;">AS</span> <span style="color: #ff0000;">`est rows`</span>
 <span style="color: #66cc66;">,</span> ROUND<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>s<span style="color: #66cc66;">.</span>CARDINALITY <span style="color: #66cc66;">/</span> IFNULL<span style="color: #66cc66;">&#40;</span>t<span style="color: #66cc66;">.</span>TABLE_ROWS<span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">0.01</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">*</span> <span style="color: #cc66cc;">100</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">AS</span> <span style="color: #ff0000;">`sel %`</span>
<span style="color: #993333; font-weight: bold;">FROM</span> INFORMATION_SCHEMA<span style="color: #66cc66;">.</span>STATISTICS s
 <span style="color: #993333; font-weight: bold;">INNER</span> <span style="color: #993333; font-weight: bold;">JOIN</span> INFORMATION_SCHEMA<span style="color: #66cc66;">.</span><span style="color: #993333; font-weight: bold;">TABLES</span> t
  <span style="color: #993333; font-weight: bold;">ON</span> s<span style="color: #66cc66;">.</span>TABLE_SCHEMA <span style="color: #66cc66;">=</span> t<span style="color: #66cc66;">.</span>TABLE_SCHEMA
  <span style="color: #993333; font-weight: bold;">AND</span> s<span style="color: #66cc66;">.</span>TABLE_NAME <span style="color: #66cc66;">=</span> t<span style="color: #66cc66;">.</span>TABLE_NAME
 <span style="color: #993333; font-weight: bold;">INNER</span> <span style="color: #993333; font-weight: bold;">JOIN</span> <span style="color: #66cc66;">&#40;</span>
  <span style="color: #993333; font-weight: bold;">SELECT</span>
     TABLE_SCHEMA
   <span style="color: #66cc66;">,</span> TABLE_NAME
   <span style="color: #66cc66;">,</span> INDEX_NAME
   <span style="color: #66cc66;">,</span> MAX<span style="color: #66cc66;">&#40;</span>SEQ_IN_INDEX<span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">AS</span> max_columns
  <span style="color: #993333; font-weight: bold;">FROM</span> INFORMATION_SCHEMA<span style="color: #66cc66;">.</span>STATISTICS
  <span style="color: #993333; font-weight: bold;">WHERE</span> TABLE_SCHEMA !<span style="color: #66cc66;">=</span> <span style="color: #ff0000;">'mysql'</span>
  <span style="color: #993333; font-weight: bold;">GROUP</span> <span style="color: #993333; font-weight: bold;">BY</span> TABLE_SCHEMA<span style="color: #66cc66;">,</span> TABLE_NAME<span style="color: #66cc66;">,</span> INDEX_NAME
 <span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">AS</span> s2
 <span style="color: #993333; font-weight: bold;">ON</span> s<span style="color: #66cc66;">.</span>TABLE_SCHEMA <span style="color: #66cc66;">=</span> s2<span style="color: #66cc66;">.</span>TABLE_SCHEMA
 <span style="color: #993333; font-weight: bold;">AND</span> s<span style="color: #66cc66;">.</span>TABLE_NAME <span style="color: #66cc66;">=</span> s2<span style="color: #66cc66;">.</span>TABLE_NAME
 <span style="color: #993333; font-weight: bold;">AND</span> s<span style="color: #66cc66;">.</span>INDEX_NAME <span style="color: #66cc66;">=</span> s2<span style="color: #66cc66;">.</span>INDEX_NAME
<span style="color: #993333; font-weight: bold;">WHERE</span> t<span style="color: #66cc66;">.</span>TABLE_SCHEMA !<span style="color: #66cc66;">=</span> <span style="color: #ff0000;">'mysql'</span>                         <span style="color: #808080; font-style: italic;">/* Filter out the mysql system DB */</span>
<span style="color: #993333; font-weight: bold;">AND</span> t<span style="color: #66cc66;">.</span>TABLE_ROWS &amp;gt; <span style="color: #cc66cc;">10</span>                                   <span style="color: #808080; font-style: italic;">/* Only tables with some rows */</span>
<span style="color: #993333; font-weight: bold;">AND</span> s<span style="color: #66cc66;">.</span>CARDINALITY <span style="color: #993333; font-weight: bold;">IS</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span>                           <span style="color: #808080; font-style: italic;">/* Need at least one non-NULL value in the field */</span>
<span style="color: #993333; font-weight: bold;">AND</span> <span style="color: #66cc66;">&#40;</span>s<span style="color: #66cc66;">.</span>CARDINALITY <span style="color: #66cc66;">/</span> IFNULL<span style="color: #66cc66;">&#40;</span>t<span style="color: #66cc66;">.</span>TABLE_ROWS<span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">0.01</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> &amp;lt; <span style="color: #cc66cc;">1.00</span> <span style="color: #808080; font-style: italic;">/* Selectivity &amp;lt; 1.0 b/c unique indexes are perfect anyway */</span>
<span style="color: #993333; font-weight: bold;">ORDER</span> <span style="color: #993333; font-weight: bold;">BY</span> <span style="color: #ff0000;">`sel %`</span><span style="color: #66cc66;">,</span> s<span style="color: #66cc66;">.</span>TABLE_SCHEMA<span style="color: #66cc66;">,</span> s<span style="color: #66cc66;">.</span>TABLE_NAME          <span style="color: #808080; font-style: italic;">/* Switch to `sel %` DESC for best non-unique indexes */</span>
<span style="color: #993333; font-weight: bold;">LIMIT</span> <span style="color: #cc66cc;">10</span>;</pre></div></div>

<p style="text-align: justify;">Un ejemplo del resultado de esta consulta en un proyecto en producción, retorna índices de campos booleanos o campos que indican el sexo:</p>
<p><a href="http://otroblogmas.com/wp-content/uploads/2010/05/screenshot-phpmyadmin-selectivity.gif"><img class="aligncenter size-full wp-image-1947" title="Screenshot phpMyAdmin Selectivity" src="http://otroblogmas.com/wp-content/uploads/2010/05/screenshot-phpmyadmin-selectivity.gif" alt="Screenshot phpMyAdmin Selectivity" width="638" height="273" /></a></p>


<p>Entradas relacionadas:</p><ol><li><a href='http://otroblogmas.com/diferencias-entre-enum-y-set-en-mysql/' rel='bookmark' title='Permanent Link: Diferencias entre ENUM y SET en MySQL'>Diferencias entre ENUM y SET en MySQL</a></li>
<li><a href='http://otroblogmas.com/trabajando-con-el-tipo-de-campo-bit-de-mysql-en-php/' rel='bookmark' title='Permanent Link: Trabajando con el tipo de campo BIT de MySQL en PHP'>Trabajando con el tipo de campo BIT de MySQL en PHP</a></li>
<li><a href='http://otroblogmas.com/funcion-group_concat-de-mysql/' rel='bookmark' title='Permanent Link: Función GROUP_CONCAT de MySQL'>Función GROUP_CONCAT de MySQL</a></li>
</ol>]]></content:encoded>
			<wfw:commentRss>http://otroblogmas.com/selectividad-indices-mysql/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Diferencias entre mysql, mysqli y PDO en PHP</title>
		<link>http://otroblogmas.com/diferencias-entre-mysql-mysqli-pdo-php/</link>
		<comments>http://otroblogmas.com/diferencias-entre-mysql-mysqli-pdo-php/#comments</comments>
		<pubDate>Fri, 12 Feb 2010 07:00:12 +0000</pubDate>
		<dc:creator>otroblogmas.com</dc:creator>
				<category><![CDATA[mysql]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://otroblogmas.com/?p=1609</guid>
		<description><![CDATA[Existen m&#225;s, pero hay las tres formas m&#225;s populares de conectarse desde PHP a una base de datos de MySQL: mysql, mysqli y PDO (PHP Data Objects). En cada proyecto se puede usar una manera u otra, pero para saber cu&#225;l es la m&#225;s recomendada, hay que conocer en que se distinguen: mysql es la [...]


Entradas relacionadas:<ol><li><a href='http://otroblogmas.com/diferencias-entre-enum-y-set-en-mysql/' rel='bookmark' title='Permanent Link: Diferencias entre ENUM y SET en MySQL'>Diferencias entre ENUM y SET en MySQL</a></li>
<li><a href='http://otroblogmas.com/trabajando-con-el-tipo-de-campo-bit-de-mysql-en-php/' rel='bookmark' title='Permanent Link: Trabajando con el tipo de campo BIT de MySQL en PHP'>Trabajando con el tipo de campo BIT de MySQL en PHP</a></li>
<li><a href='http://otroblogmas.com/diferencias-url-uri-urn/' rel='bookmark' title='Permanent Link: Diferencias entre URL, URI y URN'>Diferencias entre URL, URI y URN</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p><img alt="PDO 150x118 Diferencias entre mysql, mysqli y PDO en PHP" class="size-thumbnail wp-image-1612 alignright" height="118" src="http://otroblogmas.com/wp-content/uploads/2010/02/PDO-150x118.jpg" title="PDO" width="150" /> Existen m&aacute;s, pero hay<strong> las tres formas m&aacute;s populares de conectarse desde PHP a una base de datos de MySQL</strong>: mysql, mysqli y PDO (PHP Data Objects). En cada proyecto se puede usar una manera u otra, pero para saber cu&aacute;l es la m&aacute;s recomendada, hay que conocer en que se distinguen:</p>
<ul>
<li><a href="http://www.php.net/manual/en/ref.mysql.php">mysql</a> es la <strong>API hist&oacute;rica</strong> que ofrece PHP desde hay varias versiones.</li>
<li><a href="http://www.php.net/manual/en/intro.mysqli.php">mysqli</a> es la nueva versi&oacute;n de mysql, <strong>orientada a objetos</strong>.</li>
<li><a href="http://php.net/manual/en/book.pdo.php">PDO</a> es una <strong>capa de abstracci&oacute;n de base de datos</strong>, con soporte para MySQL y otros sistemas gestores de bases de datos. Proporciona comandos preparados y otra serie de operaciones adaptadas al driver necesario.</li>
</ul>
<p>Si no hubiera ning&uacute;n motivo que hiciera variar la elecci&oacute;n, se recomienda usar <strong>PDO</strong>; y si no es posible, entonces <strong>mysqli</strong>. Como &uacute;ltimo recurso, usar <strong>mysql</strong>. Visto en <a href="http://stackoverflow.com/questions/2190737/what-is-difference-between-mysql-mysqli-and-pdo">stackowerflow</a></p>
<p><strong>ACTUALIZACI&Oacute;N (2010/08/01):</strong> En el foro &quot;Foros del web&quot;, se abr&iacute;o un hilo hace meses, hablando de los <a href="http://www.forosdelweb.com/f68/pdo-mysqli-pros-contras-796673/">pros y contras sobre PDO o MySQLi</a>. Desde ah&iacute;, se puede acceder a un art&iacute;culo muy interesante del blog TuFunci&oacute;n: &quot;<a href="http://www.tufuncion.com/select-mysqli-pdo-php">PHP y MySql: una estrecha relaci&oacute;n</a>&quot;. Se muestran los resultados de unos test. para comprobar el rendimiento de los diferentes drivers. El driver MySqli demuestra un rendimiento de casi el doble respecto a PDO.</p>
<p>Las conclusiones del art&iacute;culo son:</p>
<ul>
<li><strong>Rendimiento</strong>: MySqli o MySql</li>
<li><strong>Caracter&iacute;sticas</strong>: MySqli</li>
<li><strong>Facilidad de uso</strong>: PDO</li>
</ul>


<p>Entradas relacionadas:</p><ol><li><a href='http://otroblogmas.com/diferencias-entre-enum-y-set-en-mysql/' rel='bookmark' title='Permanent Link: Diferencias entre ENUM y SET en MySQL'>Diferencias entre ENUM y SET en MySQL</a></li>
<li><a href='http://otroblogmas.com/trabajando-con-el-tipo-de-campo-bit-de-mysql-en-php/' rel='bookmark' title='Permanent Link: Trabajando con el tipo de campo BIT de MySQL en PHP'>Trabajando con el tipo de campo BIT de MySQL en PHP</a></li>
<li><a href='http://otroblogmas.com/diferencias-url-uri-urn/' rel='bookmark' title='Permanent Link: Diferencias entre URL, URI y URN'>Diferencias entre URL, URI y URN</a></li>
</ol>]]></content:encoded>
			<wfw:commentRss>http://otroblogmas.com/diferencias-entre-mysql-mysqli-pdo-php/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Trabajando con el tipo de campo BIT de MySQL en PHP</title>
		<link>http://otroblogmas.com/trabajando-con-el-tipo-de-campo-bit-de-mysql-en-php/</link>
		<comments>http://otroblogmas.com/trabajando-con-el-tipo-de-campo-bit-de-mysql-en-php/#comments</comments>
		<pubDate>Mon, 16 Nov 2009 07:00:16 +0000</pubDate>
		<dc:creator>otroblogmas.com</dc:creator>
				<category><![CDATA[mysql]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://otroblogmas.com/?p=1369</guid>
		<description><![CDATA[El tipo de dato BIT en Mysql, antes de la versión 5.0.3 era almacenado como un TINYINT. En las versiones posteriores es utilizado para almacenar bits, y ya es soportado por los motores de almacenamiento MyISAM, Memory, InnoDB y NDBCluster. Al ser el tipo de dato de MySQL que se traduce como un booleano de [...]


Entradas relacionadas:<ol><li><a href='http://otroblogmas.com/diferencias-entre-enum-y-set-en-mysql/' rel='bookmark' title='Permanent Link: Diferencias entre ENUM y SET en MySQL'>Diferencias entre ENUM y SET en MySQL</a></li>
<li><a href='http://otroblogmas.com/diferencias-entre-mysql-mysqli-pdo-php/' rel='bookmark' title='Permanent Link: Diferencias entre mysql, mysqli y PDO en PHP'>Diferencias entre mysql, mysqli y PDO en PHP</a></li>
<li><a href='http://otroblogmas.com/funcion-group_concat-de-mysql/' rel='bookmark' title='Permanent Link: Función GROUP_CONCAT de MySQL'>Función GROUP_CONCAT de MySQL</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;"><a href="http://otroblogmas.com/wp-content/uploads/2009/11/bits.jpg"><img class="alignright size-full wp-image-1394" title="Bits" src="http://otroblogmas.com/wp-content/uploads/2009/11/bits.jpg" alt="Bits" width="156" height="156" /></a>El tipo de dato <a href="http://dev.mysql.com/doc/refman/5.1/en/numeric-types.html">BIT </a>en Mysql, antes de la versión 5.0.3 era almacenado como un TINYINT. En las versiones posteriores es utilizado para <strong>almacenar bits</strong>, y ya es soportado por los motores de almacenamiento MyISAM, Memory, InnoDB y NDBCluster. Al ser el tipo de dato de MySQL que <strong>se traduce como un booleano</strong> de los lenguajes de programación, es común usarlo para los campos en que almenamos <strong>información en que solo tiene dos estados</strong>: si es activo o no, si es apto o no, si es público o no, &#8230; No confundir con el tipo de datos BOOL, que en realidad es un TINYINT.</p>
<p style="text-align: justify;"><span id="more-1369"></span>Al tipo de datos BIT se le puede <strong>especificar el número de bits</strong>, que va de 1 a 64. Si no se especifica, por defecto se toma que BIT solo contiene un bit. Para <strong>especificar los valores</strong> en MySQL, se puede utilizar una notación que muestro con el siguiente ejemplo, en que tengo una tabla de jugadores, con su ID que es un número y el vampo &#8216;lesionado&#8217; que es un BIT(2):</p>

<div class="wp_syntax"><div class="code"><pre class="mysql" style="font-family:monospace;"><span style="color: #990099; font-weight: bold;">INSERT</span> <span style="color: #990099; font-weight: bold;">INTO</span> jugador <span style="color: #FF00FF;">&#40;</span>idjugador<span style="color: #000033;">,</span> lesionado<span style="color: #FF00FF;">&#41;</span>
	<span style="color: #990099; font-weight: bold;">VALUES</span> <span style="color: #FF00FF;">&#40;</span><span style="color: #008080;">1</span><span style="color: #000033;">,</span> b<span style="color: #008000;">'01'</span><span style="color: #FF00FF;">&#41;</span><span style="color: #000033;">,</span> <span style="color: #FF00FF;">&#40;</span><span style="color: #008080;">2</span><span style="color: #000033;">,</span> b<span style="color: #008000;">'11'</span><span style="color: #FF00FF;">&#41;</span><span style="color: #000033;">;</span></pre></div></div>

<p style="text-align: justify;">Existen <strong>otras notaciones</strong> para también pasar valores hexadecimales o octales. Para ver unos ejemplos, entrad en el siguiente <a href="http://dev.mysql.com/doc/refman/5.1/en/bit-field-values.html">enlace</a>.</p>
<p style="text-align: justify;"><a href="http://otroblogmas.com/wp-content/uploads/2009/11/phpmyadmin-bit1.png"><img class="alignright size-full wp-image-1377" title="phpmyadmin-bit" src="http://otroblogmas.com/wp-content/uploads/2009/11/phpmyadmin-bit1.png" alt="phpmyadmin bit1 Trabajando con el tipo de campo BIT de MySQL en PHP" width="155" height="70" /></a>Si viéramos <strong>los valores desde el phpmyadmin</strong>, veríamos <em>símbolos raros</em>. En realidad intentan representar los valores del campo. Si hicieramos una <strong>consulta desde PHP a la base de datos</strong>, veriamos el mismo valor al hacer un <em><a href="http://php.net/manual/en/function.echo.php">echo</a></em> o un <em><a href="http://otroblogmas.com/dbug-clase-en-php-para-substituir-a-var_dump-o-print_r/">var_dump</a></em>. El valor que nos retorna es <strong>el carácter </strong><a href="http://www.asciitable.com/"><strong>ASCii</strong></a><strong> que concuerda con los bits almacenados</strong>.</p>
<p style="text-align: justify;">Para poder trabajar con esos valores para hacer comparaciones o demás operaciones, necesitamos las funciones ord y chr de PHP. La función <a href="http://www.php.net/manual/en/function.ord.php">ord</a> nos <strong>devuelve el número decimal de un carácter ASCii </strong>pasado por parámetro.</p>
<p style="text-align: justify;">En el ejemplo, es una <em>tontería</em> usar 2 bits, ya que <strong>con un bit puedo guardar el estado</strong>, si esta lesionado o no el jugador. Pero he usado dos bits para que se entienda mejor que la función <em>ord</em> devuelve el valor decimal (&#8217;11&#8242; en decimal es un 3).</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$registros</span> <span style="color: #339933;">=</span> <span style="color: #990000;">mysql_query</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;SELECT idjugador, lesionado
				FROM jugador&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">while</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$reg</span> <span style="color: #339933;">=</span> <span style="color: #990000;">mysql_fetch_assoc</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$registros</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #b1b100;">echo</span> <span style="color: #000088;">$reg</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'idjugador'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">ord</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$reg</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'lesionado'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> <span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;No esta lesionado&quot;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #b1b100;">else</span> <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">ord</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$reg</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'lesionado'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> <span style="color: #cc66cc;">3</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;Esta lesionado&quot;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p style="text-align: justify;">Cuando queramos pasar un valor a la base de datos, ya sea para hacer un INSERT o un UPDATE, hemos de utilizar la función <a href="http://es2.php.net/manual/en/function.chr.php">chr</a>, que nos <strong>convierte un número decimal en su representación en ASCii</strong>.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #990000;">mysql_query</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;UPDATE jugador
	SET lesionado = '&quot;</span> <span style="color: #339933;">.</span> <span style="color: #990000;">chr</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">2</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">&quot;'
	WHERE idjugador=1&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Todo y las explicaciones, creo que <strong>no es muy recomendable usar este tipo de dato</strong>, principalmente por dos motivos:</p>
<ul>
<li><strong>Ocupa más espacio</strong> del número de bits que le asignamos</li>
<li><strong>Necesita una transformación</strong> para ser utilitzado en PHP</li>
</ul>
<p>Despendiendo de lo que necesitemos, sería más conveniente un <strong>TINYINT</strong> o un <strong>SET</strong>.</p>


<p>Entradas relacionadas:</p><ol><li><a href='http://otroblogmas.com/diferencias-entre-enum-y-set-en-mysql/' rel='bookmark' title='Permanent Link: Diferencias entre ENUM y SET en MySQL'>Diferencias entre ENUM y SET en MySQL</a></li>
<li><a href='http://otroblogmas.com/diferencias-entre-mysql-mysqli-pdo-php/' rel='bookmark' title='Permanent Link: Diferencias entre mysql, mysqli y PDO en PHP'>Diferencias entre mysql, mysqli y PDO en PHP</a></li>
<li><a href='http://otroblogmas.com/funcion-group_concat-de-mysql/' rel='bookmark' title='Permanent Link: Función GROUP_CONCAT de MySQL'>Función GROUP_CONCAT de MySQL</a></li>
</ol>]]></content:encoded>
			<wfw:commentRss>http://otroblogmas.com/trabajando-con-el-tipo-de-campo-bit-de-mysql-en-php/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Función GROUP_CONCAT de MySQL</title>
		<link>http://otroblogmas.com/funcion-group_concat-de-mysql/</link>
		<comments>http://otroblogmas.com/funcion-group_concat-de-mysql/#comments</comments>
		<pubDate>Mon, 19 Oct 2009 07:00:18 +0000</pubDate>
		<dc:creator>otroblogmas.com</dc:creator>
				<category><![CDATA[mysql]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://otroblogmas.com/?p=1052</guid>
		<description><![CDATA[Descubrí el otro día la función GROUP_CONCAT, que puede ser muy útil cuando hacemos consultas a MySQL donde usamos el GROUP BY. Sirve para concatenar con un separador, todos los registros afectados por un GROUP BY en un solo campo de salida. Lo mejor es explicarlo con un ejemplo. Tenemos dos tablas, Contenidos y Categorías [...]


Entradas relacionadas:<ol><li><a href='http://otroblogmas.com/selectividad-indices-mysql/' rel='bookmark' title='Permanent Link: La selectividad de los índices en MySQL'>La selectividad de los índices en MySQL</a></li>
<li><a href='http://otroblogmas.com/trabajando-con-el-tipo-de-campo-bit-de-mysql-en-php/' rel='bookmark' title='Permanent Link: Trabajando con el tipo de campo BIT de MySQL en PHP'>Trabajando con el tipo de campo BIT de MySQL en PHP</a></li>
<li><a href='http://otroblogmas.com/diferencias-entre-mysql-mysqli-pdo-php/' rel='bookmark' title='Permanent Link: Diferencias entre mysql, mysqli y PDO en PHP'>Diferencias entre mysql, mysqli y PDO en PHP</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;"><a rel="attachment wp-att-1072" href="http://otroblogmas.com/funcion-group_concat-de-mysql/mysql_logo/"><img class="alignright size-medium wp-image-1072" title="MySQL logo" src="http://otroblogmas.com/wp-content/uploads/2009/10/mysql_logo-300x174.jpg" alt="MySQL logo" width="180" height="104" /></a>Descubrí el otro día la función <a href="http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_group-concat"><strong>GROUP_CONCAT</strong></a>, que puede ser muy útil cuando hacemos consultas a MySQL donde usamos el GROUP BY. Sirve para<strong> concatenar con un separador, todos los registros afectados por un GROUP BY en un solo campo de salida</strong>. Lo mejor es explicarlo con un ejemplo.</p>
<p style="text-align: justify;">Tenemos dos tablas, <em>Contenidos</em> y <em>Categorías</em> (o cualquier relación típica de 1:N o N:N). El objetivo es <strong>sacar todos los contenidos, y en cada registro de contenidos, las categorías de cada uno de ellos</strong>.</p>
<p style="text-align: justify;"><span id="more-1052"></span>Si hiciéramos una consulta en que relacionamos las tablas, hicieramos el GROUP BY, y pidieramos los campos <em>nombre_contenido</em> y <em>nombre_categoria</em>, solamente<strong> retornaría el nombre de una categoría, la primera que encuentre</strong>:</p>

<div class="wp_syntax"><div class="code"><pre class="mysql" style="font-family:monospace;"><span style="color: #990099; font-weight: bold;">SELECT</span> nombre_contenido<span style="color: #000033;">,</span> nombre_categoria
<span style="color: #990099; font-weight: bold;">FROM</span> contenidos
	<span style="color: #990099; font-weight: bold;">INNER</span> <span style="color: #990099; font-weight: bold;">JOIN</span> categorias_contenidos <span style="color: #990099; font-weight: bold;">USING</span> <span style="color: #FF00FF;">&#40;</span>id_contenido<span style="color: #FF00FF;">&#41;</span>
	<span style="color: #990099; font-weight: bold;">INNER</span> <span style="color: #990099; font-weight: bold;">JOIN</span> categorias <span style="color: #990099; font-weight: bold;">USING</span> <span style="color: #FF00FF;">&#40;</span>id_categoria<span style="color: #FF00FF;">&#41;</span>
<span style="color: #990099; font-weight: bold;">GROUP BY</span> id_contenido</pre></div></div>

<p style="text-align: justify;">Pero con la función<strong> GROUP_CONCAT</strong>, todas las <em>Categorías</em> que se ven agrupadas por el GROUP BY, serán concatenadas en un campo, con una coma como separador.</p>

<div class="wp_syntax"><div class="code"><pre class="mysql" style="font-family:monospace;"><span style="color: #990099; font-weight: bold;">SELECT</span> nombre_contenido<span style="color: #000033;">,</span> <span style="color: #000099;">GROUP_CONCAT</span><span style="color: #FF00FF;">&#40;</span>nombre_categoria<span style="color: #FF00FF;">&#41;</span>
<span style="color: #990099; font-weight: bold;">FROM</span> contenidos
	<span style="color: #990099; font-weight: bold;">INNER</span> <span style="color: #990099; font-weight: bold;">JOIN</span> categorias_contenidos <span style="color: #990099; font-weight: bold;">USING</span> <span style="color: #FF00FF;">&#40;</span>id_contenido<span style="color: #FF00FF;">&#41;</span>
	<span style="color: #990099; font-weight: bold;">INNER</span> <span style="color: #990099; font-weight: bold;">JOIN</span> categorias <span style="color: #990099; font-weight: bold;">USING</span> <span style="color: #FF00FF;">&#40;</span>id_categoria<span style="color: #FF00FF;">&#41;</span>
<span style="color: #990099; font-weight: bold;">GROUP BY</span> id_contenido</pre></div></div>

<p style="text-align: justify;">La función <em>GROUP_CONCAT</em> <strong>solo tiene un parámetro</strong>, que es una expresión. <strong>Básicamente puede ser el nombre de la columna a concatenar</strong>. Pero permite tres personalizaciones, según nuestras necesidades:</p>
<ul>
<li style="text-align: justify;">Utilizar <strong>DISTINCT</strong>, para <strong>evitar las repeticiones</strong></li>
<li style="text-align: justify;">Añadir un <strong>ORDER BY</strong>, para decidir el <strong>orden de concatenación</strong> del campo</li>
<li style="text-align: justify;">Definir con <strong>SEPARATOR</strong> el <strong>separador a utilizar</strong> para separar los campos (por defecto, el separador es una coma)</li>
</ul>
<p style="text-align: justify;">Pongo un <strong>ejemplo completo</strong> con todas las funcionalidades de <em>GROUP_CONCAT</em>, así no tendremos repeticiones de las categorías, estarán ordenadas alfabéticamente y separadas por un guión:</p>

<div class="wp_syntax"><div class="code"><pre class="mysql" style="font-family:monospace;"><span style="color: #990099; font-weight: bold;">SELECT</span> nombre_contenido<span style="color: #000033;">,</span> <span style="color: #000099;">GROUP_CONCAT</span><span style="color: #FF00FF;">&#40;</span><span style="color: #990099; font-weight: bold;">DISTINCT</span> nombre_categoria
					<span style="color: #990099; font-weight: bold;">ORDER BY</span> nombre_categoria <span style="color: #990099; font-weight: bold;">ASC</span>
					SEPARATOR <span style="color: #008000;">'-'</span><span style="color: #FF00FF;">&#41;</span>
<span style="color: #990099; font-weight: bold;">FROM</span> contenidos
	<span style="color: #990099; font-weight: bold;">INNER</span> <span style="color: #990099; font-weight: bold;">JOIN</span> categorias_contenidos <span style="color: #990099; font-weight: bold;">USING</span> <span style="color: #FF00FF;">&#40;</span>id_contenido<span style="color: #FF00FF;">&#41;</span>
	<span style="color: #990099; font-weight: bold;">INNER</span> <span style="color: #990099; font-weight: bold;">JOIN</span> categorias <span style="color: #990099; font-weight: bold;">USING</span> <span style="color: #FF00FF;">&#40;</span>id_categoria<span style="color: #FF00FF;">&#41;</span>
<span style="color: #990099; font-weight: bold;">GROUP BY</span> id_contenido</pre></div></div>

<p style="text-align: justify;">Una vez recibido el registro, podemos <strong>convertir este campo concatenado en un array</strong>, simplemente utilizando la <strong>función </strong><a href="http://php.net/manual/en/function.explode.php"><strong>explode</strong> </a>de PHP.</p>
<p style="text-align: justify;"><strong><span style="text-decoration: underline;">Actualización</span></strong>: A través del comentario de Daniel, me entero que <strong>la función tiene un límite de 1024 caracteres</strong>, incluidos los separadores. En un ejemplo que he visto, he leído que en una consulta en que la función GROUP_CONCAT <strong>tenía que devolver del 1 al 20.000 separados por comas, solo devolvía hasta el 283</strong>; los números cuadran de la siguiente manera:</p>
<ul>
<li>Del 1 al 9, van <strong>9</strong> caracteres</li>
<li>Del 10 al 99, van 90*2= <strong>180</strong> caracteres</li>
<li>Del 100 al 283, van 184*3= <strong>552</strong> caracteres</li>
<li>Más las 283 comas, que son <strong>283</strong> carácteres más</li>
<li><strong>TOTAL = 9 + 180 + 552 + 283 = 1024</strong> caracteres.</li>
</ul>
<p>Pero esto no es un inconveniente para utilizar la función GROUP_CONCAT. <strong>Este límite se puede modificar</strong> a nuestro gusto, de las dos maneras siguientes:</p>
<ol>
<li><strong>Editando el archivo de configuración </strong><em><strong>my.cnf</strong></em> y modificando la variable:

<div class="wp_syntax"><div class="code"><pre class="ini" style="font-family:monospace;"><span style="color: #000099;">group_concat_max_len</span><span style="color: #000066; font-weight:bold;">=</span><span style="color: #660066;">4096</span></pre></div></div>

</li>
<li><strong>Ejecutando esta orden</strong> antes de realizar la consulta:

<div class="wp_syntax"><div class="code"><pre class="mysql" style="font-family:monospace;"><span style="color: #990099; font-weight: bold;">SET</span> <span style="color: #990099; font-weight: bold;">GLOBAL</span> group_concat_max_len<span style="color: #CC0099;">=</span><span style="color: #008080;">4096</span></pre></div></div>

</li>
</ol>
<p>Fuentes &#8211; <a href="http://www.syntaxerror.es/2006/11/20/mysql-usando-el-group_concat/">Syntax Error</a> y <a href="http://www.mysqlperformanceblog.com/2006/09/04/group_concat-useful-group-by-extension/">MySQL Performance Blog</a> (mirar también los comentarios)</p>


<p>Entradas relacionadas:</p><ol><li><a href='http://otroblogmas.com/selectividad-indices-mysql/' rel='bookmark' title='Permanent Link: La selectividad de los índices en MySQL'>La selectividad de los índices en MySQL</a></li>
<li><a href='http://otroblogmas.com/trabajando-con-el-tipo-de-campo-bit-de-mysql-en-php/' rel='bookmark' title='Permanent Link: Trabajando con el tipo de campo BIT de MySQL en PHP'>Trabajando con el tipo de campo BIT de MySQL en PHP</a></li>
<li><a href='http://otroblogmas.com/diferencias-entre-mysql-mysqli-pdo-php/' rel='bookmark' title='Permanent Link: Diferencias entre mysql, mysqli y PDO en PHP'>Diferencias entre mysql, mysqli y PDO en PHP</a></li>
</ol>]]></content:encoded>
			<wfw:commentRss>http://otroblogmas.com/funcion-group_concat-de-mysql/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Diferencias entre ENUM y SET en MySQL</title>
		<link>http://otroblogmas.com/diferencias-entre-enum-y-set-en-mysql/</link>
		<comments>http://otroblogmas.com/diferencias-entre-enum-y-set-en-mysql/#comments</comments>
		<pubDate>Wed, 23 Sep 2009 23:01:54 +0000</pubDate>
		<dc:creator>otroblogmas.com</dc:creator>
				<category><![CDATA[mysql]]></category>

		<guid isPermaLink="false">http://otroblogmas.com/?p=663</guid>
		<description><![CDATA[Existes dos tipos de campo en MySQL que siempre los he visto iguales. He investigado un poco en sus diferencias y lo que voy a comentar sirve tanto para MySQL 5.1 como MySQL 5.4. Tanto ENUM como SET, sirven para determinar los valores que puede tener un campo de una tabla, es decir, puedes determinar [...]


Entradas relacionadas:<ol><li><a href='http://otroblogmas.com/diferencias-entre-mysql-mysqli-pdo-php/' rel='bookmark' title='Permanent Link: Diferencias entre mysql, mysqli y PDO en PHP'>Diferencias entre mysql, mysqli y PDO en PHP</a></li>
<li><a href='http://otroblogmas.com/trabajando-con-el-tipo-de-campo-bit-de-mysql-en-php/' rel='bookmark' title='Permanent Link: Trabajando con el tipo de campo BIT de MySQL en PHP'>Trabajando con el tipo de campo BIT de MySQL en PHP</a></li>
<li><a href='http://otroblogmas.com/diferencias-url-uri-urn/' rel='bookmark' title='Permanent Link: Diferencias entre URL, URI y URN'>Diferencias entre URL, URI y URN</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;"><a href="http://otroblogmas.com/wp-content/uploads/2009/09/mysql_avanzado.gif"><img class="alignright size-medium wp-image-685" title="MySQL Avanzado" src="http://otroblogmas.com/wp-content/uploads/2009/09/mysql_avanzado-233x300.gif" alt="MySQL Avanzado" width="140" height="180" /></a>Existes <strong>dos tipos de campo en <a href="http://www.mysql.com/">MySQL</a></strong> que siempre los he visto iguales. He investigado un poco en sus diferencias y lo que voy a comentar sirve tanto para <a href="http://dev.mysql.com/doc/refman/5.1/en/index.html">MySQL 5.1</a> como <a href="http://dev.mysql.com/doc/refman/5.4/en/index.html">MySQL 5.4</a>.</p>
<p style="text-align: justify;">Tanto <a href="http://dev.mysql.com/doc/refman/5.1/en/enum.html">ENUM</a> como <a href="http://dev.mysql.com/doc/refman/5.1/en/set.html">SET</a>, <strong>sirven para determinar los valores que puede tener un campo</strong> de una tabla, es decir, puedes determinar que en <strong>un campo solamente pueda contener valores de una lista definida </strong>por ti. La <strong>principal diferencia</strong> es que un campo del tipo <strong>ENUM siempre contiene sólo un valor de la lista</strong>; y un campo del tipo<strong> SET puede contener ninguno, uno o varios valores</strong> de la lista.</p>
<p style="text-align: justify;">Hay <strong>más características</strong> de estos dos campos de MySQL, que les hace diferenciarse y es <strong>necesario conocerlas para decidir cual es más apropiado</strong> para nuestro diseño de la base de datos.</p>
<p style="text-align: justify;"><span id="more-663"></span>El <strong>tipo de campo <a href="http://dev.mysql.com/doc/refman/5.1/en/enum.html">ENUM</a></strong> se caracteriza por:</p>

<div class="wp_syntax"><div class="code"><pre class="mysql" style="font-family:monospace;"><span style="color: #990099; font-weight: bold;">CREATE</span> <span style="color: #990099; font-weight: bold;">TABLE</span> sizes <span style="color: #FF00FF;">&#40;</span>
	size <span style="color: #999900; font-weight: bold;">ENUM</span><span style="color: #FF00FF;">&#40;</span><span style="color: #008000;">'small'</span><span style="color: #000033;">,</span> <span style="color: #008000;">'medium'</span><span style="color: #000033;">,</span> <span style="color: #008000;">'large'</span><span style="color: #FF00FF;">&#41;</span> <span style="color: #CC0099; font-weight: bold;">NOT</span> <span style="color: #9900FF; font-weight: bold;">NULL</span> <span style="color: #990099; font-weight: bold;">DEFAULT</span> <span style="color: #008000;">'medium'</span>
<span style="color: #FF00FF;">&#41;</span><span style="color: #000033;">;</span></pre></div></div>

<ul>
<li style="text-align: justify;"><strong>Sólo contiene un valor</strong></li>
<li style="text-align: justify;">Se puede definir la lista de <strong>hasta 65535 valores distintos</strong></li>
<li style="text-align: justify;">Si se permite NULL, este será el <strong>valor por defecto</strong>; sinó, y si no se define con DEFAULT, será <strong>el primer valor de la lista</strong> (en el ejemplo de arriba, si no defino el DEFAULT &#8216;medium&#8217;, por defecto sería &#8216;small&#8217;)</li>
<li style="text-align: justify;"><strong>Cada valor de la lista es numerado con un índice</strong> (empieza desde el 1), pudiendo usar el índice en vez del valor de la lista (en el ejemplo de arriba: 1=&gt;&#8217;small&#8217;, 2=&gt;&#8217;medium&#8217; y 3=&gt;&#8217;large&#8217;)</li>
<li style="text-align: justify;">En caso de introducir un <strong>valor no perteciente a la lista</strong>, el campo pasará a valer &#8221;, una cadena vacía, que tiene <strong>el índice zero</strong></li>
<li style="text-align: justify;">El índice de NULL es NULL,</li>
<li style="text-align: justify;">Para <strong>retornar el índice de un campo del tipo ENUM</strong>, podemos sumar zero al campo (SELECT size+0 FROM &#8230;)</li>
<li style="text-align: justify;">De <a href="http://dev.mysql.com/doc/refman/5.1/en/storage-requirements.html">almacenamiento físico</a>, ocupará<strong> 1 byte</strong> si hay 255 o menos valores en la lista,<strong> o 2 bytes</strong> si hay 256 o más valores</li>
</ul>
<p style="text-align: justify;">El <strong>tipo de campo <a href="http://dev.mysql.com/doc/refman/5.1/en/set.html">SET</a></strong> se caracteriza por:</p>

<div class="wp_syntax"><div class="code"><pre class="mysql" style="font-family:monospace;"><span style="color: #990099; font-weight: bold;">CREATE</span> <span style="color: #990099; font-weight: bold;">TABLE</span> letters <span style="color: #FF00FF;">&#40;</span>
	letter <span style="color: #990099; font-weight: bold;">SET</span><span style="color: #FF00FF;">&#40;</span><span style="color: #008000;">'a'</span><span style="color: #000033;">,</span> <span style="color: #008000;">'b'</span><span style="color: #000033;">,</span> <span style="color: #008000;">'c'</span><span style="color: #000033;">,</span> <span style="color: #008000;">'d'</span><span style="color: #FF00FF;">&#41;</span>
<span style="color: #FF00FF;">&#41;</span><span style="color: #000033;">;</span></pre></div></div>

<ul>
<li style="text-align: justify;"><strong>Contiene zero, uno o varios valores</strong></li>
<li style="text-align: justify;">Se puede definir la lista de <strong>hasta 64 valores distintos</strong></li>
<li style="text-align: justify;"><strong>Los valores no pueden contener comas</strong>, ya que los valores asignados son separados por comas</li>
<li style="text-align: justify;"><strong>Cada valor de la lista representa un bit</strong> de la cadena de bits del campo</li>
<li style="text-align: justify;"><strong>El valor decimal del campo determina los bits</strong>, marcando los valores que contiene el campo,de manera que si todos los bits estan a 1, es que ese campo contiene todos los valores (<strong>ejemplo</strong>: si el valor decimal es 7, en binario sería 0111, y eso quiere decir que el campo contiene los valore &#8216;a&#8217;, &#8216;b&#8217; y &#8216;c&#8217;)<br />
<table style="margin-top: 0pt; margin-right: auto; margin-bottom: 0pt; margin-left: auto; width: 200px; height: 104px;" border="0" cellpadding="5">
<tbody>
<tr>
<td>SET</td>
<td>Decimal</td>
<td>Bytes</td>
</tr>
<tr>
<td>&#8216;a&#8217;</td>
<td>1</td>
<td>0001</td>
</tr>
<tr>
<td>&#8216;b&#8217;</td>
<td>2</td>
<td>0010</td>
</tr>
<tr>
<td>&#8216;c&#8217;</td>
<td>4</td>
<td>0100</td>
</tr>
<tr>
<td>&#8216;d&#8217;</td>
<td>8</td>
<td>1000</td>
</tr>
</tbody>
</table>
</li>
<li style="text-align: justify;">De <a href="http://dev.mysql.com/doc/refman/5.1/en/storage-requirements.html">almacenamiento físico</a>, ocupará <strong>1, 2, 3, 4, o 8 bytes</strong>, según la longitud de la lista de valores (si N es el número de valores, la formula es <code>(<em><code>N</code></em>+7)/8</code> bytes)</li>
</ul>
<p style="text-align: justify;">Conociendo más a fondo los tipos de campos, y sabiendo sus posibilidades, ahora es fácil decidirse y justicarse.</p>


<p>Entradas relacionadas:</p><ol><li><a href='http://otroblogmas.com/diferencias-entre-mysql-mysqli-pdo-php/' rel='bookmark' title='Permanent Link: Diferencias entre mysql, mysqli y PDO en PHP'>Diferencias entre mysql, mysqli y PDO en PHP</a></li>
<li><a href='http://otroblogmas.com/trabajando-con-el-tipo-de-campo-bit-de-mysql-en-php/' rel='bookmark' title='Permanent Link: Trabajando con el tipo de campo BIT de MySQL en PHP'>Trabajando con el tipo de campo BIT de MySQL en PHP</a></li>
<li><a href='http://otroblogmas.com/diferencias-url-uri-urn/' rel='bookmark' title='Permanent Link: Diferencias entre URL, URI y URN'>Diferencias entre URL, URI y URN</a></li>
</ol>]]></content:encoded>
			<wfw:commentRss>http://otroblogmas.com/diferencias-entre-enum-y-set-en-mysql/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Procedure de estadísticas que haga un INSERT o un UPDATE (II)</title>
		<link>http://otroblogmas.com/procedure-de-estadisticas-que-haga-un-insert-o-un-update-ii/</link>
		<comments>http://otroblogmas.com/procedure-de-estadisticas-que-haga-un-insert-o-un-update-ii/#comments</comments>
		<pubDate>Sun, 09 Aug 2009 07:00:56 +0000</pubDate>
		<dc:creator>otroblogmas.com</dc:creator>
				<category><![CDATA[mysql]]></category>
		<category><![CDATA[optimización]]></category>
		<category><![CDATA[procedure]]></category>
		<category><![CDATA[stored procedure]]></category>

		<guid isPermaLink="false">http://otroblogmas.com/?p=128</guid>
		<description><![CDATA[Como vimos en la entrada anterior, creamos una stored procedure para hacer el incremento típico de unas estadísticas. Pero se puede dar el caso, de que se quieren incremenetar una serie de registros a la vez. Por poner otro ejemplo, tenemos una tabla de tags, donde se almacenan las veces que son asignadas a una [...]


Entradas relacionadas:<ol><li><a href='http://otroblogmas.com/procedure-que-haga-un-insert-o-un-update/' rel='bookmark' title='Permanent Link: Procedure de estadísticas que haga un INSERT o un UPDATE (I)'>Procedure de estadísticas que haga un INSERT o un UPDATE (I)</a></li>
<li><a href='http://otroblogmas.com/wordpress-y-problemas-con-el-modsecurity/' rel='bookmark' title='Permanent Link: WordPress y problemas con el módulo ModSecurity de Apache'>WordPress y problemas con el módulo ModSecurity de Apache</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;"><a href="http://otroblogmas.com/wp-content/uploads/2009/08/MySQL_Stored_Procedure_Programming1.jpg"><img class="alignright size-full wp-image-116" title="MySQL_Stored_Procedure_Programming" src="http://otroblogmas.com/wp-content/uploads/2009/08/MySQL_Stored_Procedure_Programming1.jpg" alt="MySQL Stored Procedure Programming1 Procedure de estadísticas que haga un INSERT o un UPDATE (II)" width="149" height="194" /></a>Como vimos en la <strong><a title="Procedure de estadísticas que haga un INSERT o un UPDATE (I)" href="http://otroblogmas.com/procedure-de-estadisticas-que-haga-un-insert-o-un-update-i">entrada anterior</a></strong>, creamos una stored procedure para hacer el incremento típico de unas estadísticas.</p>
<p style="text-align: justify;">Pero se puede dar el caso, de que se quieren<strong> incremenetar una serie de registros a la vez</strong>. Por poner otro ejemplo, tenemos una tabla de tags, donde se almacenan las veces que son asignadas a una entrada. Cuando se crea una entrada, hay que incrementar todas las tags que tiene la entrada asignadas.</p>
<p style="text-align: justify;"><span id="more-128"></span>A la hora de programarlo, tenemos tres opciones:</p>
<ul style="text-align: justify;">
<li>Por código, se hace <strong>una llamada a la procedure por cada tag</strong> que tiene la entrada asignada, haciendo tantas llamadas a la procedure como tags asignadas.</li>
<li style="text-align: justify;">Modificamos la procedure anterior, para que <strong>reciba una cadena de tags con un separador</strong>, así la procedure se encarga de <strong>ir cortando y cogiendo las tags y incrementandolas</strong>.</li>
</ul>

<div class="wp_syntax"><div class="code"><pre class="mysql" style="font-family:monospace;"><span style="color: #990099; font-weight: bold;">CREATE</span> <span style="color: #990099; font-weight: bold;">PROCEDURE</span> increment_tags <span style="color: #FF00FF;">&#40;</span>tags <span style="color: #999900; font-weight: bold;">VARCHAR</span><span style="color: #FF00FF;">&#40;</span><span style="color: #008080;">100000</span><span style="color: #FF00FF;">&#41;</span><span style="color: #FF00FF;">&#41;</span>
<span style="color: #990099; font-weight: bold;">BEGIN</span>
	<span style="color: #990099; font-weight: bold;">DECLARE</span> tag <span style="color: #999900; font-weight: bold;">VARCHAR</span><span style="color: #FF00FF;">&#40;</span><span style="color: #008080;">10</span><span style="color: #FF00FF;">&#41;</span><span style="color: #000033;">;</span>	<span style="color: #CC0099;">--</span>Variable donde se irán guardando las tags
&nbsp;
	WHILE <span style="color: #000099;">LENGTH</span><span style="color: #FF00FF;">&#40;</span>tags<span style="color: #FF00FF;">&#41;</span><span style="color: #CC0099;">&amp;</span>gt<span style="color: #000033;">;</span><span style="color: #008080;">0</span> <span style="color: #990099; font-weight: bold;">DO</span>
		<span style="color: #990099; font-weight: bold;">SET</span> tag <span style="color: #CC0099;">=</span> <span style="color: #000099;">SUBSTRING_INDEX</span><span style="color: #FF00FF;">&#40;</span>tags<span style="color: #000033;">,</span> <span style="color: #008000;">','</span><span style="color: #000033;">,</span> <span style="color: #008080;">1</span><span style="color: #FF00FF;">&#41;</span><span style="color: #000033;">;</span>	<span style="color: #CC0099;">--</span>El separador es una coma
		<span style="color: #990099; font-weight: bold;">SET</span> tags <span style="color: #CC0099;">=</span> SUBSTR <span style="color: #FF00FF;">&#40;</span>tags<span style="color: #000033;">,</span> <span style="color: #000099;">LENGTH</span><span style="color: #FF00FF;">&#40;</span>tag<span style="color: #FF00FF;">&#41;</span><span style="color: #CC0099;">+</span><span style="color: #008080;">2</span><span style="color: #FF00FF;">&#41;</span><span style="color: #000033;">;</span>	<span style="color: #CC0099;">--</span>La cadena de tags es recortada por el tag actual
		<span style="color: #990099; font-weight: bold;">INSERT</span> <span style="color: #990099; font-weight: bold;">INTO</span> tbl_tags <span style="color: #FF00FF;">&#40;</span>tag<span style="color: #000033;">,</span> ranking<span style="color: #FF00FF;">&#41;</span> <span style="color: #990099; font-weight: bold;">VALUES</span> <span style="color: #FF00FF;">&#40;</span>tag<span style="color: #000033;">,</span> <span style="color: #008080;">1</span><span style="color: #FF00FF;">&#41;</span>
			<span style="color: #990099; font-weight: bold;">ON</span> <span style="color: #990099; font-weight: bold;">DUPLICATE KEY</span> <span style="color: #990099; font-weight: bold;">UPDATE</span> ranking <span style="color: #CC0099;">=</span> ranking <span style="color: #CC0099;">+</span><span style="color: #008080;">1</span><span style="color: #000033;">;</span>
	<span style="color: #009900;">END</span> WHILE<span style="color: #000033;">;</span>
<span style="color: #009900;">END</span></pre></div></div>

<ul style="text-align: justify;">
<li>Modificar la procedure que va cortando la cadena de tags para que, en vez de incrementar cada vez que coge una tag, haga una <strong>cadena de texto que seráuna <a href="http://dev.mysql.com/doc/refman/5.0/es/sqlps.html">sentencia preparada</a></strong>, un INSERT con todos las tags a incrementar, y al final la ejecute, consiguiendo <strong>una petición a la Base de Datos, y un solo INSERT</strong>.</li>
</ul>

<div class="wp_syntax"><div class="code"><pre class="mysql" style="font-family:monospace;"><span style="color: #990099; font-weight: bold;">CREATE</span> <span style="color: #990099; font-weight: bold;">PROCEDURE</span> increment_tags <span style="color: #FF00FF;">&#40;</span>tags <span style="color: #999900; font-weight: bold;">VARCHAR</span><span style="color: #FF00FF;">&#40;</span><span style="color: #008080;">100000</span><span style="color: #FF00FF;">&#41;</span><span style="color: #FF00FF;">&#41;</span>
<span style="color: #990099; font-weight: bold;">BEGIN</span>
	<span style="color: #990099; font-weight: bold;">DECLARE</span> tag <span style="color: #999900; font-weight: bold;">VARCHAR</span><span style="color: #FF00FF;">&#40;</span><span style="color: #008080;">10</span><span style="color: #FF00FF;">&#41;</span><span style="color: #000033;">;</span>	<span style="color: #CC0099;">--</span>Variable donde se irán guardando las tags
	<span style="color: #990099; font-weight: bold;">DECLARE</span> txt_insert <span style="color: #999900; font-weight: bold;">VARCHAR</span><span style="color: #FF00FF;">&#40;</span><span style="color: #008080;">105000</span><span style="color: #FF00FF;">&#41;</span> <span style="color: #990099; font-weight: bold;">DEFAULT</span> <span style="color: #008000;">''</span><span style="color: #000033;">;</span>		<span style="color: #CC0099;">--</span>Contendrá el <span style="color: #990099; font-weight: bold;">INSERT</span> que se va formando
&nbsp;
	WHILE <span style="color: #000099;">LENGTH</span><span style="color: #FF00FF;">&#40;</span>tags<span style="color: #FF00FF;">&#41;</span><span style="color: #CC0099;">&amp;</span>gt<span style="color: #000033;">;</span><span style="color: #008080;">0</span> <span style="color: #990099; font-weight: bold;">DO</span>
		<span style="color: #990099; font-weight: bold;">SET</span> tag <span style="color: #CC0099;">=</span> <span style="color: #000099;">SUBSTRING_INDEX</span><span style="color: #FF00FF;">&#40;</span>tags<span style="color: #000033;">,</span> <span style="color: #008000;">','</span><span style="color: #000033;">,</span> <span style="color: #008080;">1</span><span style="color: #FF00FF;">&#41;</span><span style="color: #000033;">;</span>
		<span style="color: #990099; font-weight: bold;">SET</span> tags <span style="color: #CC0099;">=</span> SUBSTR<span style="color: #FF00FF;">&#40;</span>tags<span style="color: #000033;">,</span> <span style="color: #000099;">LENGTH</span><span style="color: #FF00FF;">&#40;</span>tag<span style="color: #FF00FF;">&#41;</span><span style="color: #CC0099;">+</span><span style="color: #008080;">2</span><span style="color: #FF00FF;">&#41;</span><span style="color: #000033;">;</span>
		<span style="color: #990099; font-weight: bold;">SET</span> txt_insert <span style="color: #CC0099;">=</span> <span style="color: #000099;">CONCAT</span><span style="color: #FF00FF;">&#40;</span>txt_insert<span style="color: #000033;">,</span> <span style="color: #008000;">',('</span><span style="color: #000033;">,</span> tag<span style="color: #000033;">,</span> <span style="color: #008000;">', 1)'</span><span style="color: #FF00FF;">&#41;</span><span style="color: #000033;">;</span>
	<span style="color: #009900;">END</span> WHILE<span style="color: #000033;">;</span>
&nbsp;
	<span style="color: #990099; font-weight: bold;">SET</span> @sql <span style="color: #CC0099;">=</span> <span style="color: #000099;">CONCAT</span><span style="color: #FF00FF;">&#40;</span><span style="color: #008000;">'INSERT INTO tags (tag, ranking) VALUES '</span>
					<span style="color: #000033;">,</span> SUBSTR<span style="color: #FF00FF;">&#40;</span>txt_insert<span style="color: #000033;">,</span> <span style="color: #008080;">2</span><span style="color: #FF00FF;">&#41;</span>
					<span style="color: #000033;">,</span> <span style="color: #008000;">' ON DUPLICATE KEY UPDATE ranking = ranking +1;'</span><span style="color: #FF00FF;">&#41;</span><span style="color: #000033;">;</span>
	PREPARE stmt1 <span style="color: #990099; font-weight: bold;">FROM</span> @sql<span style="color: #000033;">;</span>
	EXECUTE stmt1<span style="color: #000033;">;</span>
	DEALLOCATE PREPARE stmt1<span style="color: #000033;">;</span>
<span style="color: #009900;">END</span></pre></div></div>



<p>Entradas relacionadas:</p><ol><li><a href='http://otroblogmas.com/procedure-que-haga-un-insert-o-un-update/' rel='bookmark' title='Permanent Link: Procedure de estadísticas que haga un INSERT o un UPDATE (I)'>Procedure de estadísticas que haga un INSERT o un UPDATE (I)</a></li>
<li><a href='http://otroblogmas.com/wordpress-y-problemas-con-el-modsecurity/' rel='bookmark' title='Permanent Link: WordPress y problemas con el módulo ModSecurity de Apache'>WordPress y problemas con el módulo ModSecurity de Apache</a></li>
</ol>]]></content:encoded>
			<wfw:commentRss>http://otroblogmas.com/procedure-de-estadisticas-que-haga-un-insert-o-un-update-ii/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Procedure de estadísticas que haga un INSERT o un UPDATE (I)</title>
		<link>http://otroblogmas.com/procedure-que-haga-un-insert-o-un-update/</link>
		<comments>http://otroblogmas.com/procedure-que-haga-un-insert-o-un-update/#comments</comments>
		<pubDate>Sat, 08 Aug 2009 07:00:48 +0000</pubDate>
		<dc:creator>otroblogmas.com</dc:creator>
				<category><![CDATA[mysql]]></category>
		<category><![CDATA[optimización]]></category>
		<category><![CDATA[procedure]]></category>
		<category><![CDATA[stored procedure]]></category>

		<guid isPermaLink="false">http://otroblogmas.com/?p=102</guid>
		<description><![CDATA[La típica tabla de estadísticas, tiene una serie de registros, donde se almacenan valores que se van incrementando: visitas, votos, puntos, &#8230; Para la operación de incrementar las estadísticas, tenemos que contemplar dos casos: Si no existen estadísticas sobre este registro, se tiene que crear el registro en la tabla de estadísticas con un INSERT [...]


Entradas relacionadas:<ol><li><a href='http://otroblogmas.com/procedure-de-estadisticas-que-haga-un-insert-o-un-update-ii/' rel='bookmark' title='Permanent Link: Procedure de estadísticas que haga un INSERT o un UPDATE (II)'>Procedure de estadísticas que haga un INSERT o un UPDATE (II)</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;"><a href="http://otroblogmas.com/wp-content/uploads/2009/08/MySQL_Stored_Procedure_Programming1.jpg"><img class="alignright size-full wp-image-116" title="MySQL_Stored_Procedure_Programming" src="http://otroblogmas.com/wp-content/uploads/2009/08/MySQL_Stored_Procedure_Programming1.jpg" alt="MySQL Stored Procedure Programming1 Procedure de estadísticas que haga un INSERT o un UPDATE (I)" width="149" height="194" /></a>La típica tabla de estadísticas, tiene una serie de registros, donde se almacenan <strong>valores que se van incrementando</strong>: visitas, votos, puntos, &#8230; Para la operación de incrementar las estadísticas, tenemos que contemplar dos casos:</p>
<ul style="text-align: justify;">
<li><strong>Si no existen</strong> estadísticas sobre este registro, se tiene que crear el registro en la tabla de estadísticas con un <strong>INSERT</strong></li>
<li><strong>Si ya existen</strong> estadísticas, se tiene que incremenetar el valor del registro de la tabla de estadísticas con un <strong>UPDATE</strong></li>
</ul>
<p style="text-align: justify;">Hay tres opciones a la hora de programar el <strong>sistema que incremente las estadísticas</strong> en MySQL<span id="more-102"></span>:</p>
<ul>
<li style="text-align: justify;">Se hace una consulta a la Base de Datos con un SELECT, para saber si ya existe el registro o no en la tabla de estadísticas. Si no existe, hacemos otra petición a la Base de Datos haciendo un INSERT, y si existe, la petición será un UPDATE. En resumen, <strong>dos peticiones a la Base de Datos, con una operación cada una</strong>.</li>
<li style="text-align: justify;">Se puede programar una <a href="http://dev.mysql.com/doc/refman/5.0/es/create-procedure.html">STORED PROCEDURE</a> que reciba el registro de las estadísticas. La Procedure se encarga de comprobar que exista el registro o no con un SELECT, y dependiendo del caso, hará la operación pertinente. En resumen, <strong>una petición a la Base de Datos, que al final ejecutará dos operaciones</strong>.</li>
</ul>

<div class="wp_syntax"><div class="code"><pre class="mysql" style="font-family:monospace;"><span style="color: #990099; font-weight: bold;">CREATE</span> <span style="color: #990099; font-weight: bold;">PROCEDURE</span> <span style="color: #008000;">`increment<span style="color: #008080; font-weight: bold;">_</span>stadistics`</span><span style="color: #FF00FF;">&#40;</span> <span style="color: #990099; font-weight: bold;">IN</span> uid <span style="color: #999900; font-weight: bold;">int</span>  <span style="color: #FF00FF;">&#41;</span>
<span style="color: #990099; font-weight: bold;">BEGIN</span>
<span style="color: #990099; font-weight: bold;">DECLARE</span> is_uid <span style="color: #999900; font-weight: bold;">INT</span><span style="color: #000033;">;</span>
<span style="color: #990099; font-weight: bold;">SELECT</span> id <span style="color: #990099; font-weight: bold;">INTO</span> is_uid <span style="color: #990099; font-weight: bold;">FROM</span> stadistics <span style="color: #990099; font-weight: bold;">WHERE</span> id <span style="color: #CC0099;">=</span> uid <span style="color: #990099; font-weight: bold;">LIMIT</span> <span style="color: #008080;">1</span><span style="color: #000033;">;</span>
<span style="color: #009900;">IF</span> is_uid <span style="color: #CC0099; font-weight: bold;">IS</span> <span style="color: #9900FF; font-weight: bold;">NULL</span> <span style="color: #009900;">THEN</span>
<span style="color: #990099; font-weight: bold;">INSERT</span> <span style="color: #990099; font-weight: bold;">INTO</span> stadistics  <span style="color: #FF00FF;">&#40;</span>id<span style="color: #000033;">,</span> stats<span style="color: #FF00FF;">&#41;</span> <span style="color: #990099; font-weight: bold;">values</span> <span style="color: #FF00FF;">&#40;</span>uid<span style="color: #000033;">,</span> <span style="color: #008080;">1</span><span style="color: #FF00FF;">&#41;</span><span style="color: #000033;">;</span>
<span style="color: #009900;">ELSE</span>
<span style="color: #990099; font-weight: bold;">UPDATE</span> stadistics  <span style="color: #990099; font-weight: bold;">SET</span> stats <span style="color: #CC0099;">=</span> stats<span style="color: #CC0099;">+</span><span style="color: #008080;">1</span> <span style="color: #990099; font-weight: bold;">WHERE</span> id <span style="color: #CC0099;">=</span> uid <span style="color: #990099; font-weight: bold;">LIMIT</span> <span style="color: #008080;">1</span><span style="color: #000033;">;</span>
<span style="color: #009900;">END</span> <span style="color: #009900;">IF</span><span style="color: #000033;">;</span>
<span style="color: #009900;">END</span></pre></div></div>

<ul>
<li style="text-align: justify;">Igual que el anterior, pero directamente hacer el <a href="http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html"><strong>INSERT &#8230; ON DUPLICATE KEY UPDATE</strong></a>, y que él mismo detecte a traves de un índice UNIQUE que ya existe el registro, y entonces lo incremente. En resumen,<strong> una petición a la Base de Datos, y una operación</strong>, pero <strong>es necesario un <a href="http://dev.mysql.com/doc/refman/5.0/es/constraint-primary-key.html">índice UNIQUE</a></strong> que puede ser la PRIMARY KEY de la tabla si nos sirve.</li>
</ul>

<div class="wp_syntax"><div class="code"><pre class="mysql" style="font-family:monospace;"><span style="color: #990099; font-weight: bold;">CREATE</span> <span style="color: #990099; font-weight: bold;">PROCEDURE</span> increment_stadistics <span style="color: #FF00FF;">&#40;</span> <span style="color: #990099; font-weight: bold;">IN</span> uid <span style="color: #999900; font-weight: bold;">int</span> <span style="color: #FF00FF;">&#41;</span>
<span style="color: #990099; font-weight: bold;">BEGIN</span>
<span style="color: #990099; font-weight: bold;">DECLARE</span> is_uid <span style="color: #999900; font-weight: bold;">INT</span><span style="color: #000033;">;</span>
<span style="color: #990099; font-weight: bold;">INSERT</span> <span style="color: #990099; font-weight: bold;">INTO</span> stadistics <span style="color: #FF00FF;">&#40;</span>id<span style="color: #000033;">,</span> stats<span style="color: #FF00FF;">&#41;</span> <span style="color: #990099; font-weight: bold;">VALUES</span> <span style="color: #FF00FF;">&#40;</span>uid<span style="color: #000033;">,</span> <span style="color: #008080;">1</span><span style="color: #FF00FF;">&#41;</span>
<span style="color: #990099; font-weight: bold;">ON</span> <span style="color: #990099; font-weight: bold;">DUPLICATE KEY</span> <span style="color: #990099; font-weight: bold;">UPDATE</span> stats <span style="color: #CC0099;">=</span> stats <span style="color: #CC0099;">+</span><span style="color: #008080;">1</span><span style="color: #000033;">;</span>
<span style="color: #009900;">END</span></pre></div></div>

<p style="text-align: justify;">El <strong>inconveniente de los índices</strong>, es que cuando se modifica la tabla (INSERT, UPDATE o DELETE), <strong>se han de regenerar</strong>. El caso de índice UNIQUE, implica además  que antes de hacer un INSERT, tendrá que comprobar que no se dupliquen los registros. Como va a tener que comprobarlo, si no lo encuentra, hace el INSERT, y si lo encuentra, hace <strong>el UPDATE automáticamente</strong>.</p>
<p style="text-align: justify;">En la <strong><a title="Procedure de estadísticas que haga un INSERT o un UPDATE (II)" href="http://otroblogmas.com/procedure-de-estadisticas-que-haga-un-insert-o-un-update-ii">siguiente entrada</a></strong>, veremos como modificar la procedure para que haga el <strong>incremento de una serie de registros con una sola llamada a la procedure</strong>.</p>


<p>Entradas relacionadas:</p><ol><li><a href='http://otroblogmas.com/procedure-de-estadisticas-que-haga-un-insert-o-un-update-ii/' rel='bookmark' title='Permanent Link: Procedure de estadísticas que haga un INSERT o un UPDATE (II)'>Procedure de estadísticas que haga un INSERT o un UPDATE (II)</a></li>
</ol>]]></content:encoded>
			<wfw:commentRss>http://otroblogmas.com/procedure-que-haga-un-insert-o-un-update/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>STRAIGHT_JOIN y el order de las tablas en JOINs de MySQL</title>
		<link>http://otroblogmas.com/straight_join-y-el-order-de-las-tablas-en-joins-de-mysql/</link>
		<comments>http://otroblogmas.com/straight_join-y-el-order-de-las-tablas-en-joins-de-mysql/#comments</comments>
		<pubDate>Tue, 28 Jul 2009 18:57:26 +0000</pubDate>
		<dc:creator>otroblogmas.com</dc:creator>
				<category><![CDATA[mysql]]></category>
		<category><![CDATA[optimización]]></category>

		<guid isPermaLink="false">http://otroblogmas.com/?p=4</guid>
		<description><![CDATA[Según leo en un artículo, el optimizador de JOINs de MySQL puede cambiar el orden en que se realizan los JOINs. Al autor del artículo, las consultas de una aplicación le tardaban casi un minuto. Después de buscar una solución, decubrió que poniendo &#8220;SELECT STRAIGHT_JOIN &#8230;&#8220;, obligaba a MySQL a tratar las tablas de los [...]


Entradas relacionadas:<ol><li><a href='http://otroblogmas.com/diferencias-entre-mysql-mysqli-pdo-php/' rel='bookmark' title='Permanent Link: Diferencias entre mysql, mysqli y PDO en PHP'>Diferencias entre mysql, mysqli y PDO en PHP</a></li>
<li><a href='http://otroblogmas.com/diferencias-entre-enum-y-set-en-mysql/' rel='bookmark' title='Permanent Link: Diferencias entre ENUM y SET en MySQL'>Diferencias entre ENUM y SET en MySQL</a></li>
<li><a href='http://otroblogmas.com/funcion-group_concat-de-mysql/' rel='bookmark' title='Permanent Link: Función GROUP_CONCAT de MySQL'>Función GROUP_CONCAT de MySQL</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;"><img class="size-medium wp-image-8 alignright" style="padding: 10px; display: block;" title="High Performance MySQL" src="http://otroblogmas.com/wp-content/uploads/2009/07/51Q8pDAxS2L-228x300.jpg" alt="High Performance MySQL" width="150" height="197" />Según leo en <a title="Optimizing MySQL: Importance of JOIN Order" href="http://www.webdevelopmentstuff.com/119/optimizing-mysql-importance-of-join-order.html">un artículo</a>, el optimizador de JOINs de MySQL puede cambiar el orden en que se realizan los JOINs.</p>
<p style="text-align: justify;">Al autor del artículo, las consultas de una aplicación le tardaban casi un minuto. Después de buscar una solución, decubrió que poniendo &#8220;<em>SELECT STRAIGHT_JOIN &#8230;</em>&#8220;, <strong>obligaba a MySQL a tratar las tablas de los JOINs en el orden en que se establecían</strong>, es decir, primero la de la izquierda y después la de la derecha.</p>
<p style="text-align: justify;"><span id="more-5"></span>Según el manual de MySQL:</p>
<blockquote style="text-align: justify;">
<p style="text-align: justify;">STRAIGHT_JOIN is similar to JOIN, except that <strong>the left table is always read before the right table</strong>. This can be used for those (few) cases for which the join optimizer puts the tables in the wrong order.</p>
</blockquote>


<p>Entradas relacionadas:</p><ol><li><a href='http://otroblogmas.com/diferencias-entre-mysql-mysqli-pdo-php/' rel='bookmark' title='Permanent Link: Diferencias entre mysql, mysqli y PDO en PHP'>Diferencias entre mysql, mysqli y PDO en PHP</a></li>
<li><a href='http://otroblogmas.com/diferencias-entre-enum-y-set-en-mysql/' rel='bookmark' title='Permanent Link: Diferencias entre ENUM y SET en MySQL'>Diferencias entre ENUM y SET en MySQL</a></li>
<li><a href='http://otroblogmas.com/funcion-group_concat-de-mysql/' rel='bookmark' title='Permanent Link: Función GROUP_CONCAT de MySQL'>Función GROUP_CONCAT de MySQL</a></li>
</ol>]]></content:encoded>
			<wfw:commentRss>http://otroblogmas.com/straight_join-y-el-order-de-las-tablas-en-joins-de-mysql/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
