10 consejos para acelerar tu base de datos SQL

Publicado por Soy Larry
hace 10 años

<p>En la mayoría de los sitios web, el contenido es guardado en una base de datos y servido a los visitantes en cada petición. Las consultas a la base de datos son muy rápidas, pero de todas formas hay muchas cosas que podemos hacer para mejorar esta velocidad y asegurarnos de no desperdiciar recursos. Aca vemos 10 consejos muy útiles para otpimizar la velocidad de nuestras bases de datos!</p>

<h2>Diseñar la base de datos con cuidado</h2>

<p>Aunque suene obvio, el hecho es que la mayoría de los problemas con las bases de datos son causados por un mal diseño inicial en la estructura de tablas. Una mala normalización por ejemplo utilizando más columnas de las necesarias, o poner información diferente en la misma tabla.</p>

<p>La normalización, la disposición de las tablas y los nombres de los campos son de suma importancia al momento de crear una base de datos.</p>

<h2>Saber lo que necesitamos optimizar</h2>

<p>Si queremos optimizar una consulta en específico, es muy útil obvservar profundamente el resultado de esa consulta. Para ello podemos valernos de la sentencia EXPLAIN, con la que obtendremos un montón de información útil sobre el resultado producido por una consulta en particular. Ejemplo.</p>

<pre class="prettyprint"> EXPLAIN SELECT * FROM usuarios LEFT JOIN ventas ON usuarios.id = ventas.usuarioid;</pre>

<h2>Todas las consultas consumen recursos</h2>

<p>Al momento de realizar una consulta a la base de datos, por más insignificante que parezca, esta consume recursos de nuestro servidor. Es por esto que en sitios web de alto tráfico, lo mejor que podemos hacer es guardar los resultados de las consultas en caché. Una de las soluciones más populares es por ejemplo http://www.memcached.org/</p>

<h2>Solo seleccionar lo que necesitamos</h2>

<p>A veces por pereza, o por facilidad de uso, es muy común usar el símbolo * para obtener todos los datos de una tabla.</p>

<pre class="prettyprint"> SELECT * FROM usuarios;</pre>

<p>En un sitio web pequeño no habría mucha diferencia. Pero en uno con gran cantidad de tráfico es muy importante que seleccionemos solo aquellos campos que vayamos a utilizar</p>

<pre class="prettyprint"> SELECT nombre, edad FROM usuarios;</pre>

<h2>Utilizar LIMIT</h2>

<p>Solemos olvidar ste parámetro, pero siempre es importante restringir la cantidad de registros que se seleccionarán desde una tabla. Sería un desperdicio traer 1000 registros cuando solo necesitamos mostrar los primeros 10.</p>

<pre class="prettyprint"> SELECT titulo FROM posts LIMIT 10;</pre>

<h2>Evitar las consultas dentro de ciclos</h2>

<p>Muchos programadores se ven tentados a utilizar consultas dentro de ciclos cuando con un poco de esfuerzo podríamos construir una consulta más eficiente. Ejemplo:</p>

<pre class="prettyprint"> <?php foreach( $orden as $id => $posicion ) { mysql_query("UPDATE categorias SET posicion = $posicion WHERE id = $id"); }</pre>

<p>Generará tantas consultas como items en el array $orden. Lo siguiente es una forma más eficiente:</p>

<pre class="prettyprint"> UPDATE categorias SET posicion = CASE id WHEN 1 THEN 3 WHEN 2 THEN 5 WHEN 3 THEN 4 END WHERE id IN (1,2,3)</pre>

<h2>Cambiar las sub-consultas por Joins</h2>

<p>Las sub-consultas son muy útiles para ahorrarnos tiempo. Pero pueden ser reemplazadas por un join, lo cuál es mucho más rápido para ejecutar. Ejemplo:</p>

<pre class="prettyprint"> SELECT u.id, ( SELECT MAX( fecha) FROM posts WHERE autor = u.id ) AS ultimo_post FROM usuarios u;</pre>

<p>Puede ser reemplazado por la siguiente consulta:</p>

<pre class="prettyprint"> SELECT u.id, MAX( p.fecha ) AS ultimo_post FROM usuarios u INNER JOIN posts p ON u.id = p.autor GROUP BY u.id</pre>

<h2>Cuidado con los caracteres comodín</h2>

<p>Un comodín es un caracter que puede ser sustituído por uno o más caracteres cuando se consulta una base de datos. No es malo utilizarlos siempre que se haga con precausión. Hay que tratar de evitar el uso de comodines al principio y al final. Hacer eso en una tabla con miles de registros sería un problema.</p>

<pre class="prettyprint"> -- Evitar SELECT * FROM posts WHERE titulo LIKE '%hola%'</pre>

<h2>Utilizar UNION en lugar de OR</h2>

<p>Con la sentencia UNION podemos combinar los resultados de dos o más consultas. Y el resultado es más rápido que al utilizar OR. Ejemplo.</p>

<pre class="prettyprint"> SELECT * FROM a, b WHERE a.c = b.c OR a.d = b.d</pre>

<p>Puede reemplazarse por la siguiente consulta:</p>

<pre class="prettyprint"> SELECT FROM a, b WHERE a.c = b.c UNION SELECT FROM a, b WHERE a.d = b.d</pre>

<p>Y será mucho más rápida que la primera</p>

<h2>Utilizar índices</h2>

<p>Los índices son como los índices de los libros. Permiten que la base de datos encuentre la información mucho más rápido, ya que sabe en dónde empezar a buscar.</p>

<p>Los índices pueden ser creados en una columna o en una combinación de columnas de una tabla. Son estructuras de las bases de datos que organizan los valores de una o más columnas de una tabla en base a un orden específico.</p>

<p>Con la siguiente consulta creamos un índice en la columna usuario de la tabla pagos. El índice se llama idxUsuario</p>

<pre class="prettyprint"> CREATE INDEX idxUsuario ON pagos ( usuario);</pre>

<p>Bueno, eso es todo por ahora, espero que les haya gustado!! Hasta el próximo articulo</p>

sql