{"id":95518,"date":"2020-09-30T19:42:27","date_gmt":"2020-09-30T17:42:27","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/istoriya-o-fizicheskom-udalenii-300-millionov-zapisej-v-mysql"},"modified":"2020-09-30T19:42:27","modified_gmt":"2020-09-30T17:42:27","slug":"istoriya-o-fizicheskom-udalenii-300-millionov-zapisej-v-mysql","status":"publish","type":"post","link":"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/istoriya-o-fizicheskom-udalenii-300-millionov-zapisej-v-mysql","title":{"rendered":"Historia sobre la eliminaci\u00f3n f\u00edsica de 300 millones de registros en MySQL","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<h2>Introducci\u00f3n<\/h2>\n<p>\nHola. Soy ningenMe, desarrollador web.<\/p>\n<p>Como se menciona en el t\u00edtulo, mi historia es sobre la eliminaci\u00f3n f\u00edsica de 300 millones de registros en MySQL.<\/p>\n<p>Me interes\u00f3 esto, as\u00ed que decid\u00ed hacer un recordatorio (instrucci\u00f3n).<\/p>\n<h2>Inicio \u2014 Alerta<\/h2>\n<p>\nEn el procesamiento por lotes <a class=\"wpil_keyword_link\" href=\"https:\/\/prohoster.info\/es\/server\/dts-dronten\/\"   title=\"servidor\" data-wpil-keyword-link=\"linked\"  data-wpil-monitor-id=\"2600\">servidor<\/a>, que utilizo y mantengo, hay un proceso regular que una vez al d\u00eda recopila datos del \u00faltimo mes de MySQL. <\/p>\n<p>Normalmente, este proceso termina aproximadamente en 1 hora, pero esta vez no finalizaba en 7 u 8 horas, y la alerta segu\u00eda apareciendo... <noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Busca la causa<\/h2>\n<p>\nIntent\u00e9 reiniciar el proceso, revisar los registros, pero no vi nada alarmante. <br \/>\nLa consulta se index\u00f3 correctamente. Pero cuando pens\u00e9 en qu\u00e9 podr\u00eda estar mal, me di cuenta de que el tama\u00f1o de la base de datos es bastante grande. <\/p>\n<pre><code class=\"sql\">hoge_table | 350'000'000 |<\/code><\/pre>\n<p>\n350 millones de registros. Parece que la indexaci\u00f3n funcion\u00f3 correctamente, solo que muy lenta.<\/p>\n<p>Los datos requeridos para el mes eran alrededor de 12 000 000 de registros. Parece que el comando select tom\u00f3 mucho tiempo y la transacci\u00f3n no se ejecut\u00f3 durante mucho tiempo. <\/p>\n<h2>DB<\/h2>\n<p>\nB\u00e1sicamente, es una tabla que aumenta aproximadamente en 400 000 registros cada d\u00eda. La base de datos solo deber\u00eda haber recopilado datos del \u00faltimo mes, por lo tanto, el c\u00e1lculo fue para que pudiera manejar exactamente este volumen de datos, pero, desafortunadamente, la operaci\u00f3n rotate no estaba habilitada.<\/p>\n<p>Esta base de datos no fue dise\u00f1ada por m\u00ed. La tom\u00e9 de otro desarrollador, as\u00ed que me qued\u00f3 la sensaci\u00f3n de que es una deuda t\u00e9cnica. <\/p>\n<p>Lleg\u00f3 un momento en que el volumen de datos insertados diariamente se hizo grande y finalmente alcanz\u00f3 su l\u00edmite. Se supone que al trabajar con un gran volumen de datos, deber\u00edan dividirse, pero desafortunadamente, eso no se hizo.<\/p>\n<p>Y ah\u00ed es donde entr\u00e9 yo.<\/p>\n<h2>Correcci\u00f3n<\/h2>\n<p>\nEra m\u00e1s razonable reducir la base de datos en s\u00ed y acortar el tiempo de procesamiento que cambiar la l\u00f3gica misma.<\/p>\n<p>La situaci\u00f3n deber\u00eda cambiar significativamente si eliminara 300 millones de registros, as\u00ed que decid\u00ed hacerlo\u2026 Ah, pens\u00e9 que definitivamente funcionar\u00eda.<\/p>\n<h2>Acci\u00f3n 1<\/h2>\n<p>\nDespu\u00e9s de preparar una copia de seguridad confiable, finalmente comenc\u00e9 a enviar las consultas.<\/p>\n<p>\u300cEnviando consulta\u300d<\/p>\n<pre><code class=\"sql\">DELETE FROM hoge_table WHERE create_time &lt;= &#039;YYYY-MM-DD HH:MM:SS&#039;;<\/code><\/pre>\n<p>\n\u00ab\u2026\u00bb<\/p>\n<p>\u00ab\u2026\u00bb<\/p>\n<p>\u201cHmm... No hay respuesta. \u00bfPuede que el proceso est\u00e9 tardando mucho tiempo?\u201d \u2014 pens\u00e9, pero por si acaso mir\u00e9 en grafana y vi que la carga del disco estaba aumentando r\u00e1pidamente. <br \/>\n\u00abEs peligroso\u00bb \u2014 pens\u00e9 una vez m\u00e1s y detuve la solicitud de inmediato.<\/p>\n<h2>Acci\u00f3n 2<\/h2>\n<p>\nDespu\u00e9s de analizar todo, me di cuenta de que el volumen de datos era demasiado grande para eliminarlo todo de una vez.<\/p>\n<p>Decid\u00ed escribir un script que pudiera eliminar alrededor de 1,000,000 de registros y lo lanc\u00e9.<\/p>\n<p>\u300cVoy a implementar el script\u300d<\/p>\n<p>\u201cAhora definitivamente funcionar\u00e1\u201d, pens\u00e9.<\/p>\n<h2>Acci\u00f3n 3<\/h2>\n<p>\nEl segundo m\u00e9todo funcion\u00f3, pero result\u00f3 ser muy laborioso.<br \/>\nPara hacerlo todo de manera ordenada y sin nervios de m\u00e1s, se necesitar\u00edan alrededor de dos semanas. Sin embargo, este escenario no cumpl\u00eda con los requisitos del servicio, por lo que tuve que abandonarlo.<\/p>\n<p>Por eso, esto es lo que decid\u00ed hacer:<\/p>\n<h3>Copiar la tabla y renombrarla<\/h3>\n<p>\nDel paso anterior, entend\u00ed que eliminar un volumen tan grande de datos genera una carga igual de grande. Por lo tanto, decid\u00ed crear una nueva tabla desde cero usando \u2018insert\u2019 y mover a ella los datos que planeaba eliminar.<\/p>\n<pre><code class=\"sql\">| hoge_table     | 350'000'000|\n| tmp_hoge_table |  50'000'000|<\/code><\/pre>\n<p>\nSi se crea una nueva tabla del mismo tama\u00f1o que se indica arriba, la velocidad de procesamiento de datos tambi\u00e9n deber\u00eda aumentar en 1\/7.<\/p>\n<p>Despu\u00e9s de crear la tabla y renombrarla, comenc\u00e9 a utilizarla como tabla maestra. Ahora, si elimino la tabla con 300 millones de registros, todo deber\u00eda estar bien.<br \/>\nDescubr\u00ed que \u2018truncate\u2019 o \u2018drop\u2019 generan menos carga que \u2018delete\u2019 y decid\u00ed usar este m\u00e9todo.<\/p>\n<h3>Ejecuci\u00f3n<\/h3>\n<p>\n\u300cEnviando consulta\u300d<\/p>\n<pre><code class=\"sql\">INSERT INTO tmp_hoge_table SELECT FROM hoge_table create_time &gt; 'YYYY-MM-DD HH:MM:SS';<\/code><\/pre>\n<p>\n\u00ab\u2026\u00bb<br \/>\n\u00ab\u2026\u00bb<br \/>\n\u00abem\u2026?\u00bb<\/p>\n<h2>Acci\u00f3n 4<\/h2>\n<p>\nPens\u00e9 que la idea anterior funcionar\u00eda, pero despu\u00e9s de enviar la solicitud de \u2018insert\u2019, apareci\u00f3 un error m\u00faltiple. MySQL no perdona.<\/p>\n<p>Ya estaba tan cansado que empec\u00e9 a pensar que no quer\u00eda hacer esto m\u00e1s.<\/p>\n<p>Me sent\u00e9 a pensar y comprend\u00ed que, tal vez, para una sola vez, hab\u00eda demasiadas solicitudes de \u2018insert\u2019...<br \/>\nIntent\u00e9 enviar una solicitud de \u2018insert\u2019 para un volumen de datos que la base de datos deber\u00eda procesar en un d\u00eda. \u00a1Funciona!<\/p>\n<p>Y despu\u00e9s de eso, seguimos enviando solicitudes para el mismo volumen de datos. Como hay que eliminar el volumen mensual de datos, repetimos esta operaci\u00f3n unas 35 veces.<\/p>\n<h3>Renombrar la tabla <\/h3>\n<p>\nAqu\u00ed la suerte estuvo de mi lado: todo sali\u00f3 bien.<\/p>\n<h3>La alerta desapareci\u00f3.<\/h3>\n<p>\nLa velocidad de procesamiento por lotes aument\u00f3.<\/p>\n<p>Antes, este proceso tardaba alrededor de una hora, ahora toma aproximadamente 2 minutos. <\/p>\n<p>Despu\u00e9s de asegurarme de que se resolvieron todos los problemas, elimin\u00e9 300 millones de registros. Borr\u00e9 la tabla y me sent\u00ed como renacido.<\/p>\n<h2>Resumen<\/h2>\n<p>\nMe di cuenta de que se hab\u00eda pasado por alto el procesamiento de rotaci\u00f3n en el procesamiento por lotes, y esa era la principal problem\u00e1tica. Tal error en la arquitectura resulta en una p\u00e9rdida de tiempo in\u00fatil. <\/p>\n<p>\u00bfAlguna vez piensas en la carga durante la replicaci\u00f3n de datos al eliminar registros de la base de datos? No sobrecarguemos MySQL.<\/p>\n<p>Aquellos que est\u00e1n bien versados en bases de datos no enfrentar\u00e1n este problema. A los dem\u00e1s, espero que este art\u00edculo les haya sido \u00fatil.<\/p>\n<p><i>\u00a1Gracias por leer!<\/p>\n<p>Estar\u00edamos muy contentos si nos dijeras si te gust\u00f3 este art\u00edculo, si la traducci\u00f3n fue clara y si te fue \u00fatil.<\/i><br \/>\n<br \/>Fuente: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/521226\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u041f\u0440\u0438\u0432\u0435\u0442. \u042f ningenMe, \u0432\u0435\u0431-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a. \u041a\u0430\u043a \u0441\u043a\u0430\u0437\u0430\u043d\u043e \u0432 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0438, \u043c\u043e\u044f \u0438\u0441\u0442\u043e\u0440\u0438\u044f \u2014 \u044d\u0442\u043e \u0438\u0441\u0442\u043e\u0440\u0438\u044f \u043e \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u043e\u043c \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0438 300 \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u043e\u0432 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u0432 MySQL. \u042f \u0437\u0430\u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043e\u0432\u0430\u043b\u0441\u044f \u044d\u0442\u0438\u043c, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0440\u0435\u0448\u0438\u043b \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043f\u0430\u043c\u044f\u0442\u043a\u0443 (\u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e). \u041d\u0430\u0447\u0430\u043b\u043e \u2014 Alert \u0412 \u043f\u0430\u043a\u0435\u0442\u043d\u043e\u043c \u0441\u0435\u0440\u0432\u0435\u0440\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e \u0438 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u044e, \u0438\u043c\u0435\u0435\u0442\u0441\u044f \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0434\u0438\u043d \u0440\u0430\u0437 \u0432 \u0434\u0435\u043d\u044c \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0437\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u043c\u0435\u0441\u044f\u0446 \u0438\u0437 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-95518","post","type-post","status-publish","format-standard","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.2 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u041f\u0440\u0438\u0432\u0435\u0442.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/istoriya-o-fizicheskom-udalenii-300-millionov-zapisej-v-mysql\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"es_ES\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u0418\u0441\u0442\u043e\u0440\u0438\u044f \u043e \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u043e\u043c \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0438 300 \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u043e\u0432 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u0432 MySQL | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u041f\u0440\u0438\u0432\u0435\u0442.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/istoriya-o-fizicheskom-udalenii-300-millionov-zapisej-v-mysql\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-09-30T17:42:27+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-09-30T17:42:27+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Historia sobre la eliminaci\u00f3n f\u00edsica de 300 millones de registros en MySQL | ProHoster","description":"Introducci\u00f3n Hola.","canonical_url":"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/istoriya-o-fizicheskom-udalenii-300-millionov-zapisej-v-mysql","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"es_ES","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u0418\u0441\u0442\u043e\u0440\u0438\u044f \u043e \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u043e\u043c \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0438 300 \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u043e\u0432 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u0432 MySQL | ProHoster","og:description":"\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u041f\u0440\u0438\u0432\u0435\u0442.","og:url":"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/istoriya-o-fizicheskom-udalenii-300-millionov-zapisej-v-mysql","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-09-30T17:42:27+00:00","article:modified_time":"2020-09-30T17:42:27+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"95518","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 11:04:40","updated":"2026-02-09 21:38:05","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts\/95518","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/comments?post=95518"}],"version-history":[{"count":1,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts\/95518\/revisions"}],"predecessor-version":[{"id":159882,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts\/95518\/revisions\/159882"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/media?parent=95518"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/categories?post=95518"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/tags?post=95518"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}