{"id":1304,"date":"2011-05-05T11:39:49","date_gmt":"2011-05-05T09:39:49","guid":{"rendered":"http:\/\/blog.unelink.es\/?p=1304"},"modified":"2019-11-15T10:45:17","modified_gmt":"2019-11-15T09:45:17","slug":"detectar-consultas-lentas-en-mysql","status":"publish","type":"post","link":"https:\/\/hosting.airetech.es\/blog\/wiki\/detectar-consultas-lentas-en-mysql\/","title":{"rendered":"Detectar consultas lentas en MySQL"},"content":{"rendered":"<p>Es posible que, a veces, las p\u00e1ginas web alojadas en nuestro servidor tarden mucho en cargarse. Si nuestras p\u00e1ginas utilizan MySQL, es posible que algunas consultas no sean \u00f3ptimas y esto sea la causa de la lentitud de las mismas.<\/p>\n<p>A medida que crecen las aplicaciones es m\u00e1s dif\u00edcil localizar qu\u00e9 consultas son las que est\u00e1n ralentizando nuestro servidor, y localizar el problema puede ser un trabajo largo y complicado.<\/p>\n<p>Afortunadamente, el propio MySQL nos facilita esta tarea, brind\u00e1ndonos la posibilidad de obtener un registro completo de las consultas lentas que se ejecutan en nuestro servidor. Para ello, tan solo debemos activar el <strong>log de consultas lentas<\/strong> para que MySQL las vaya recopilando y as\u00ed poder ver cu\u00e1les son aquellas que m\u00e1s se repiten y poder actuar en consecuencia.<\/p>\n<p>Dependiendo de la versi\u00f3n de MySQL instalada en el servidor tendr\u00e1s que realizar unas u otras modificaciones. Vamos a ver c\u00f3mo hacerlo para versiones anteriores a la versi\u00f3n 5.7 y en la versi\u00f3n 5.7 y posteriores.<\/p>\n<p>Para consultar la versi\u00f3n de MySQL instalada, ejecuta el siguiente comando por SSH.<\/p>\n<pre>mysql -V<\/pre>\n<p>Y obtendr\u00e1s un resultado similar a este, donde puedes ver la versi\u00f3n de MySQL.<\/p>\n<pre>mysql Ver 14.14 Distrib 5.7.27, for Linux (x86_64) using EditLine wrapper<\/pre>\n<p><strong>Versiones anteriores a MySQL 5.7<\/strong><\/p>\n<p>Accede por SSH al servidor y abre el archivo de configuraci\u00f3n de MySQL utilizando el comando<\/p>\n<pre>\/etc\/mysql\/my.cnf<\/pre>\n<p>Localiza las l\u00edneas donde se configura el log:<\/p>\n<pre># Here you can see queries with especially long duration\n#log_slow_queries = \/var\/log\/mysql\/mysql-slow.log\n#long_query_time = 2\n#log-queries-not-using-indexes<\/pre>\n<p>Y descomenta las l\u00edneas que necesites. Este es el significado de cada una de ellas:<\/p>\n<p>- <em>log_slow_queries<\/em>: indicamos el nombre del fichero que crear\u00e1 el<br \/>\nservidor.<\/p>\n<p>- <em>long_query_time<\/em>: indicamos el valor, en segundos, a partir del cual MySQL ha de considerar que una consulta es lenta.<\/p>\n<p>- <em>log-queries-not-using-indexes<\/em>: si descomentamos esta l\u00ednea, MySQL tambi\u00e9n almacenar\u00e1 en el log aquellas consultas que no usan ning\u00fan \u00edndice.<\/p>\n<p>En este ejemplo solo vamos a descomentar las dos primeras, indicando que guarde en el log aquellas consultas cuyo tiempo de ejecuci\u00f3n supere los 2 segundos. El archivo quedar\u00eda as\u00ed:<\/p>\n<pre># Here you can see queries with especially long duration\nlog_slow_queries = \/var\/log\/mysql\/mysql-slow.log\nlong_query_time = 2\n#log-queries-not-using-indexes<\/pre>\n<p>Guarda el fichero y reinicia el servicio MySQL con el comando:<\/p>\n<pre>\/etc\/init.d\/mysql restart<\/pre>\n<p><strong>Versiones posteriores a MySQL 5.7<\/strong><\/p>\n<p>Accede por SSH al servidor y abre el archivo de configuraci\u00f3n de MySQL utilizando el comando<\/p>\n<pre>nano \/etc\/my.cnf<\/pre>\n<p>Localizamos las l\u00edneas donde se configura el log:<\/p>\n<pre># Here you can see queries with especially long duration\n# slow-query-log = 1\n# slow-query-log-file = \/var\/lib\/mysql\/slow.log\n# long-query-time = 2\n# log-queries-not-using-indexes<\/pre>\n<p>Y descomentamos las l\u00edneas que nos interesen. Este es el significado de cada una de ellas:<\/p>\n<p>- <em>slow-query-log: <\/em>activar o desactivar el log de consultas lentas.<\/p>\n<p>- <em>slow-query-log-file<\/em>: indicamos el nombre del fichero que crear\u00e1 el servidor.<\/p>\n<p>-<em> long-query-time: <\/em>indicamos el valor, en segundos, a partir del cual MySQL ha de considerar que una consulta es lenta.<\/p>\n<p><em>- log-queries-not-using-indexes: <\/em>si descomentamos esta l\u00ednea, MySQL tambi\u00e9n almacenar\u00e1 en el log aquellas consultas que no utilizan ning\u00fan \u00edndice, independientemente del tiempo que se tarde en ejecutar.<\/p>\n<p>En nuestro ejemplo, vamos a descomentar las tres primeras l\u00edneas, ind\u00edcandole que guarde en el log aquellas consultas cuyo tiempo de ejecuci\u00f3n supere los 2 segundos. Por tanto, las l\u00edneas quedar\u00edan as\u00ed:<\/p>\n<pre># Here you can see queries with especially long duration\nslow-query-log = 1\nslow-query-log-file = \/var\/lib\/mysql\/slow.log\nlong-query-time = 2\n#log-queries-not-using-indexes<\/pre>\n<p>Guardamos el fichero y reiniciamos el servicio <em>MySQL<\/em>:<\/p>\n<pre>\/etc\/init.d\/mysql restart<\/pre>\n<p>A partir del reinicio, MySQL empezar\u00e1 a recoger en el fichero de log aquellas consultas que tarden m\u00e1s de 2 segundos en ejecutarse.<\/p>\n<p>Ahora solo queda esperar a que se recojan los suficientes datos para poder tener un listado completo de aquellas consultas que est\u00e1n dando problemas.<\/p>\n<p>Para consultar el log, MySQL tambi\u00e9n nos proporciona una herramienta: <strong>mysqldumpslow<\/strong>. Con ella, podremos leer el log filtrando y ordenando los resultados de forma que nos resulte f\u00e1cil interpretar los datos. Por ejemplo, una lectura com\u00fan es que s\u00f3lo queramos ver las 15 consultas m\u00e1s lentas almacenadas en el log. Para ello utilizaremos la siguiente l\u00ednea de comandos:<\/p>\n<pre>mysqldumpslow -s c -t 15 \/var\/mysql-slow.log<\/pre>\n<p>Con la opci\u00f3n \"-s\" indicamos el criterio de ordenaci\u00f3n (en el ejemplo, \"c\" es por n\u00famero de ejecuciones de la consulta) y con \"-t\" indicamos el n\u00famero de consultas que nos ha de mostrar en pantalla (en nuestro ejemplo ser\u00e1n 15).<\/p>\n<p>Para ampliar la informaci\u00f3n, pod\u00e9is dirigiros a la p\u00e1gina oficial de <em>MySQL<\/em> sobre el <a href=\"https:\/\/dev.mysql.com\/doc\/refman\/8.0\/en\/slow-query-log.html\" target=\"_blank\" rel=\"noopener noreferrer\">log de consultas lentas<\/a> o consultar al detalle el <a href=\"https:\/\/dev.mysql.com\/doc\/refman\/8.0\/en\/mysqldumpslow.html\" target=\"_blank\" rel=\"noopener noreferrer\">uso de mysqldumpslow<\/a> <em>(en ingl\u00e9s)<\/em>.<\/p>\n<p>\u00a1Esperamos que os sirva de ayuda!<\/p>\n<p><em>Nota: las rutas utilizadas pueden variar dependiendo de la distribuci\u00f3n Linux instalada en el servidor.<\/em><\/p>\n","protected":false},"excerpt":{"rendered":"Es posible que, a veces, las p\u00e1ginas web alojadas en nuestro servidor tarden mucho en cargarse. Si nuestras p\u00e1ginas utilizan MySQL, es posible que algunas consultas no sean \u00f3ptimas y esto sea la causa de la lentitud de las mismas. A medida que crecen las aplicaciones es m\u00e1s dif\u00edcil localizar qu\u00e9 consultas son las que est\u00e1n ralentizando nuestro servidor, y&nbsp;<a href=\"https:\/\/hosting.airetech.es\/blog\/wiki\/detectar-consultas-lentas-en-mysql\/\" class=\"read-more\">Seguir leyendo<\/a>","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"footnotes":""},"categories":[10,118,7,8,349,507,6],"tags":[216,20,213,214],"class_list":["post-1304","post","type-post","status-publish","format-standard","hentry","category-linux","category-mysql-2","category-servidores-dedicados","category-servidores-virtuales-vps","category-ssh","category-ssh-servidores-dedicados","category-wiki","tag-linux","tag-mysql","tag-servidores-dedicados","tag-servidores-virtuales-vps","cat-10-id","cat-118-id","cat-7-id","cat-8-id","cat-349-id","cat-507-id","cat-6-id"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/hosting.airetech.es\/blog\/wp-json\/wp\/v2\/posts\/1304","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/hosting.airetech.es\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/hosting.airetech.es\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/hosting.airetech.es\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/hosting.airetech.es\/blog\/wp-json\/wp\/v2\/comments?post=1304"}],"version-history":[{"count":10,"href":"https:\/\/hosting.airetech.es\/blog\/wp-json\/wp\/v2\/posts\/1304\/revisions"}],"predecessor-version":[{"id":8670,"href":"https:\/\/hosting.airetech.es\/blog\/wp-json\/wp\/v2\/posts\/1304\/revisions\/8670"}],"wp:attachment":[{"href":"https:\/\/hosting.airetech.es\/blog\/wp-json\/wp\/v2\/media?parent=1304"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/hosting.airetech.es\/blog\/wp-json\/wp\/v2\/categories?post=1304"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/hosting.airetech.es\/blog\/wp-json\/wp\/v2\/tags?post=1304"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}