MySql :: Tips de Optimización
Hola,
Estas son unas recomendaciones básicas para mejorar el rendimiento de MySQL y que se hacen vitales cuando tratamos con grandes cantidades de información:
1) Evitar utilizar el tipo de dato BIGINT y utilizar en su lugar INT. Para conocer el tipo de dato recomendado por MySql podemos utilizar la siguiente consulta:
SELECT id_comercio FROM bbdd.comercios PROCEDURE ANALYSE()\G
La cual nos devuelve el tipo de dato óptimo en el campo "Optimal_fieldtype".
2) Es importante evitar que los tipos de dato numéricos se traten como "Strings" en las sentencias.
Por ejemplo:
- Incorrecto: SELECT COUNT(*) FROM bbdd.pedidos WHERE id_pedido='10';
- Correcto: SELECT COUNT(*) FROM bbdd.pedidos WHERE id_pedido = 10;
- Incorrecto: INSERT INTO tabla_x VALUES ('94','1','99');
- Correcto: INSERT INTO tabla_x VALUES (94, 1, 99);
Puede parecer bastante insignificante pero cuando hablamos de millares de consultas o más, estamos obligando al servidor MySql a hacer un CAST de String a Entero por consulta lo cual, nos lo podemos ahorrar.
3) NO crear índices si el valor que vamos a guardar tiene menos de 20 posibles variantes.
Ejemplos:
- NO crear índices en campos del tipo 0/1 o boleanos.
- NO crear índices en campos cuyo calor sea un rango de números del 1 al 10.
4) Es muy aconsejable utilizar la sentencia EXPLAIN en todas las consultas para saber si estamos utilizando correctamente los índices o en caso contrario, el servidor está haciendo un "table scan". Es importante saber que aunque especifiquemos índices en la cláusula WHERE, MySql no tiene por qué utilizarlos si no lo ve conveniente.
5) No utilizar funciones de tipo NOW o CURDATE ya que las consultas que las utilizan NO las guardan en CACHE.
6) Si se realizan cargas de datos en tablas, es mejor utilizar Inserts múltiples: INSERT INTO bbdd.tabla (campo1,campo2) VALUES (1,2),(3,2),(3,6).
Ejemplo en PHP:
...
$sQuery = "SELECT campo1, campo2 FROM tabla";
$iIdQuery = mysql_query($sQuery, $iIdConn);
foreach(mysql_fetch_row($iIdQuery) as $aValue)
{
$aValues[] = "(".$aValue['campo1'].",".$aValue['campo2'].")";
}
$sQueryInsert = "INSERT INTO tabla2 (campo1, campo2) VALUES ". implode(",",$aValues);
mysql_query($sQueryInsert,$iIdConn);
...
Espero que os sean de utilidad. En cuanto recopile otra lista volveré a postearlos.
Posted on 12:58 a. m. by skarvin and filed under
linux,
mysql,
optimizar mysql
| 0 Comments »
Estas son unas recomendaciones básicas para mejorar el rendimiento de MySQL y que se hacen vitales cuando tratamos con grandes cantidades de información:
1) Evitar utilizar el tipo de dato BIGINT y utilizar en su lugar INT. Para conocer el tipo de dato recomendado por MySql podemos utilizar la siguiente consulta:
SELECT id_comercio FROM bbdd.comercios PROCEDURE ANALYSE()\G
La cual nos devuelve el tipo de dato óptimo en el campo "Optimal_fieldtype".
2) Es importante evitar que los tipos de dato numéricos se traten como "Strings" en las sentencias.
Por ejemplo:
- Incorrecto: SELECT COUNT(*) FROM bbdd.pedidos WHERE id_pedido='10';
- Correcto: SELECT COUNT(*) FROM bbdd.pedidos WHERE id_pedido = 10;
- Incorrecto: INSERT INTO tabla_x VALUES ('94','1','99');
- Correcto: INSERT INTO tabla_x VALUES (94, 1, 99);
Puede parecer bastante insignificante pero cuando hablamos de millares de consultas o más, estamos obligando al servidor MySql a hacer un CAST de String a Entero por consulta lo cual, nos lo podemos ahorrar.
3) NO crear índices si el valor que vamos a guardar tiene menos de 20 posibles variantes.
Ejemplos:
- NO crear índices en campos del tipo 0/1 o boleanos.
- NO crear índices en campos cuyo calor sea un rango de números del 1 al 10.
4) Es muy aconsejable utilizar la sentencia EXPLAIN en todas las consultas para saber si estamos utilizando correctamente los índices o en caso contrario, el servidor está haciendo un "table scan". Es importante saber que aunque especifiquemos índices en la cláusula WHERE, MySql no tiene por qué utilizarlos si no lo ve conveniente.
5) No utilizar funciones de tipo NOW o CURDATE ya que las consultas que las utilizan NO las guardan en CACHE.
6) Si se realizan cargas de datos en tablas, es mejor utilizar Inserts múltiples: INSERT INTO bbdd.tabla (campo1,campo2) VALUES (1,2),(3,2),(3,6).
Ejemplo en PHP:
...
$sQuery = "SELECT campo1, campo2 FROM tabla";
$iIdQuery = mysql_query($sQuery, $iIdConn);
foreach(mysql_fetch_row($iIdQuery) as $aValue)
{
$aValues[] = "(".$aValue['campo1'].",".$aValue['campo2'].")";
}
$sQueryInsert = "INSERT INTO tabla2 (campo1, campo2) VALUES ". implode(",",$aValues);
mysql_query($sQueryInsert,$iIdConn);
...
Espero que os sean de utilidad. En cuanto recopile otra lista volveré a postearlos.
0 comentarios:
Publicar un comentario