{"id":721,"date":"2014-05-26T22:56:54","date_gmt":"2014-05-26T20:56:54","guid":{"rendered":"http:\/\/blog.gladiusgames.es\/?p=721"},"modified":"2014-05-26T22:56:54","modified_gmt":"2014-05-26T20:56:54","slug":"optimizando-codigo-trucos-de-perro-viejo-i","status":"publish","type":"post","link":"https:\/\/blog.gladiusgames.es\/index.php\/2014\/05\/26\/optimizando-codigo-trucos-de-perro-viejo-i\/","title":{"rendered":"Optimizando c\u00f3digo – Trucos de perro viejo I"},"content":{"rendered":"

En muchas ocasiones, al trabajar en equipo con otros programadores, he encontrado casos en los que por desconocimiento o por costumbre se tiende hacer c\u00f3digo ineficiente o al menos no tan eficiente como podr\u00eda serlo, desperdiciando recursos y\/o aumentando el tiempo de ejecuci\u00f3n.<\/p>\n

Para la mayor\u00eda de programadores experimentados, estas practicas son mas conocidas, pero aun as\u00ed no esta de m\u00e1s recordarlas.<\/p>\n

Bajo este criterio, comenzamos un nuevo \u201chilo\u201d de art\u00edculos, que he titulado \u201ctrucos de perro viejo\u201d, ir\u00e9 a\u00f1adiendo seg\u00fan me encuentre este tipo de casos o bien recuerde alguno que me encontrara en el pasado.<\/p>\n

Para comenzar, un caso que he encontrado ya m\u00faltiples veces cuando realizamos un listado, con el t\u00edpico bot\u00f3n\/link de \u201cver m\u00e1s\u201d.<\/p>\n

No usar \u201ccount\u201d para listados con \u201cver m\u00e1s\u201d<\/h3>\n

Por ejemplo un listado con los \u00faltimos 10 art\u00edculos de una web, con un link de ver m\u00e1s.<\/p>\n

He perdido la cuenta de las ocasiones que al heredar c\u00f3digo ajeno, me encuentro implementaciones ineficientes, basadas en dos query, una para mostrar los X resultados del listado y una de \u201ccount\u201d para saber, si debe aparecer el bot\u00f3n de ver m\u00e1s o no.<\/p>\n

\r\n<?php\r\n$lSQL ='SELECT * FROM articulos ORDER BY FechaPublic DESC LIMIT 10';\r\n$lSQLCount = 'SELECT COUNT(*) NumReg FROM articulos';\r\n\/\/Obtenemos los registros\r\n$resultado = $mysqli->query($lSQL);\r\n$resultado->data_seek(0);\r\nwhile($fila=$resultado->fetch_assoc()){\r\n\/\/Codigo de pintado de la pagina linea\r\n}\r\n\/\/Miramos si tenemos que a\u00f1adir el link\r\n$resultado=$mysqli->query($lSQLCount);\r\n$fila=$resultado->fetch_assoc();\r\nif($fila['NumReg']>10){\r\n\/\/Cremos el link\r\n}\r\n\r\n\u2026\r\n<\/pre>\n

Cuando se puede resolver de forma mucho m\u00e1s elegante y eficiente con una \u00fanica query. Solicitando en vez de X articulos, X+1, en el pintado, nos aseguraremos de solo pintar los X articulos, pero si el numero de registros recuperado es X+1 , sabremos que tenemos que pintar el link<\/p>\n

\r\n<?php\r\n$lSQL ='SELECT * FROM articulos ORDER BY FechaPublic DESC LIMIT 11';\r\n$resultado = $mysqli->query($lSQL);\r\n$resultado->data_seek(0);\r\nfor ($num_fila = 0; $num_fila<$resultado->num_rows && $num_fila<10;$num_fila++){\r\n  $resultado->data_seek($num_fila);\r\n  $fila=$resultado->fetch_assoc();\r\n  \/\/Codigo de pintado de la pagina linea\r\n}\r\nif($resultado->num_rows>10){\r\n\/\/Cremos el link\r\n}\r\n\r\n<\/pre>\n

En el segundo caso, evitamos hacer dos consultaras a la BD, y controlamos el numero de resultados mostrados v\u00eda c\u00f3digo.<\/p>\n

Las consultas a bd en entornos como el del ejemplo php y mysql, suelen ser el mayor lastre. Por lo que trucos como este mejoran considerablemente el rendimiento de nuestra aplicaci\u00f3n web.<\/p>\n

A\u00f1adir Limit en las querys que solo retornan un registro<\/h3>\n

Otra mejora, bastante simple de implementar es el uso de los limites, en las querys aunque estos parezcan obvios<\/p>\n

Por ejemplo la siguiente query :<\/p>\n

 SELECT * FROM articulos WHERE Ruta LIKE 'ciudad-romana';<\/pre>\n

Si la ejecutamos una vez, tarda 0,0039seg en obtener el registro, el campo Ruta es unique, por lo que solo puede retornar un resultado.<\/p>\n

Si ejecutamos varias veces esta misma query, podremos ver que el tiempo de respuesta baja, pues mysql ya lo tiene cacheado, pero tras varias ejecuciones podemos ver que no baja de 0,0030seg<\/p>\n

Pero simplemente a\u00f1adiendole un limite de 1 registro, dado que sabemos que no puede retornar m\u00e1s, observaremos que mejoramos su rendimiento bajando a 0.0007 seg<\/p>\n

SELECT * FROM articulos WHERE Ruta LIKE 'ciudad-romana' LIMIT 1;<\/pre>\n

Como vemos, se puede apreciar una mejora sustancial.<\/p>\n

Esto se debe a que Mysql, aunque la columna sea unique, sigue buscando en la tabla m\u00e1s coincidencias, aunque ya lo ha encontrado.
\nAl a\u00f1adir el limite evitamos que siga escaneando la tabla en busca de resultados una vez encuentre el primero.<\/p>\n","protected":false},"excerpt":{"rendered":"

En muchas ocasiones, al trabajar en equipo con otros programadores, he encontrado casos en los que por desconocimiento o por costumbre se tiende hacer c\u00f3digo ineficiente o al menos no tan eficiente como podr\u00eda serlo, desperdiciando recursos y\/o aumentando el tiempo de ejecuci\u00f3n. Para la mayor\u00eda de programadores experimentados, estas practicas son mas conocidas, pero […]<\/p>\n","protected":false},"author":4,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[100,140,101],"tags":[],"_links":{"self":[{"href":"https:\/\/blog.gladiusgames.es\/index.php\/wp-json\/wp\/v2\/posts\/721"}],"collection":[{"href":"https:\/\/blog.gladiusgames.es\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.gladiusgames.es\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.gladiusgames.es\/index.php\/wp-json\/wp\/v2\/users\/4"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.gladiusgames.es\/index.php\/wp-json\/wp\/v2\/comments?post=721"}],"version-history":[{"count":9,"href":"https:\/\/blog.gladiusgames.es\/index.php\/wp-json\/wp\/v2\/posts\/721\/revisions"}],"predecessor-version":[{"id":730,"href":"https:\/\/blog.gladiusgames.es\/index.php\/wp-json\/wp\/v2\/posts\/721\/revisions\/730"}],"wp:attachment":[{"href":"https:\/\/blog.gladiusgames.es\/index.php\/wp-json\/wp\/v2\/media?parent=721"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.gladiusgames.es\/index.php\/wp-json\/wp\/v2\/categories?post=721"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.gladiusgames.es\/index.php\/wp-json\/wp\/v2\/tags?post=721"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}