{"componentChunkName":"component---src-templates-post-template-jsx","path":"/works/posts/2021-02-04--001","result":{"data":{"site":{"siteMetadata":{"title":"Blog by Eunyoung","subtitle":"작업 기록 블로그","copyright":"© All rights reserved.","author":{"name":"EunYoung","twitter":"#"},"disqusShortname":"","url":"https://ssongey.github.io"}},"markdownRemark":{"id":"354739af-79c0-591d-978f-5d7263bd98ba","html":"<p>현재 프로젝트중인 사이트에서 에이징 테스트 중에 DB 서버 CPU 사용량이 점차 증가하여 사용율이 90%까지 올라가는 현상이 발생했다.<br>\n결론적으로는 index를 생성하지 않아 select가 많은 특정 테이블에서 약 50만건 데이터를 계속해서 full scan 하여 해당 현상이 발생되었다.</p>\n<h3>#. 이를 위해 무엇을 확인했나?</h3>\n<h4>#1. slow query 확인</h4>\n<ul>\n<li>1초 이상 수행되는 쿼리 검출</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"sql\"><pre class=\"language-sql\"><code class=\"language-sql\"><span class=\"token keyword\">select</span> <span class=\"token operator\">*</span>\n<span class=\"token keyword\">from</span> leaf_cert \n<span class=\"token keyword\">where</span> actor<span class=\"token operator\">=</span><span class=\"token string\">'MO'</span> <span class=\"token operator\">and</span> cn<span class=\"token operator\">=</span><span class=\"token string\">'KREVPABCDEF0052'</span> <span class=\"token operator\">and</span> valid<span class=\"token operator\">=</span><span class=\"token number\">1</span> <span class=\"token operator\">and</span> last_issued<span class=\"token operator\">=</span><span class=\"token number\">1</span><span class=\"token punctuation\">;</span> \n\n<span class=\"token keyword\">select</span> <span class=\"token operator\">*</span>\n<span class=\"token keyword\">from</span> leaf_cert leafcert0_ \n<span class=\"token keyword\">where</span> actor<span class=\"token operator\">=</span><span class=\"token string\">'CPS'</span> <span class=\"token operator\">and</span> valid<span class=\"token operator\">=</span><span class=\"token number\">1</span> <span class=\"token operator\">and</span> last_issued<span class=\"token operator\">=</span><span class=\"token number\">1</span><span class=\"token punctuation\">;</span> </code></pre></div>\n<br>\n<h4>#2. 조건절로 사용되는 컬럼의 cardinality 와 선택률</h4>\n<ul>\n<li>위의 쿼리문 확인 결과, leaf_cert 테이블에서는  </li>\n<li><span style=\"color:green; font-weight:500\">cn</span> 컬럼은 cardinality 가 높다<br>\n— 1년마다 인증서 갱신이 되면 동일 cn의 row 가 발생, 인증서 폐지 시 동일 cn으로 row가 발생할수 있다.  </li>\n<li><span style=\"color:green; font-weight:500\">last_issued</span> 컬럼은 cardinality가 낮지만 선택률이 낮다.<br>\n— 값은 true 또는 false 이다.<br>\n— 한개의 row만 true 이다.   </li>\n<li><span style=\"color:green; font-weight:500\">actor</span>가 CPS 일 경우 선택률이 낮다.</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">- cardinality  \n    -- 값의 균형을 나타냄  \n    -- 모든 레코드에 다른 값이 들어있으면 cadinality 가 높다.  \n    -- 높을 수록, 즉 값이 평균치에서 많이 흩어져 있을수록 좋은 인덱스 후보이다.  \n\n- 선택률  \n    -- 테이블 전체에서 몇 개의 레코드가 선택되는지를 나타냄  \n    -- 선택률이 낮을 수록, 즉 한 번의 선택으로 레코드가 조금만 선택되는 것이 좋은 후보이다.  </code></pre></div>\n<br>\n<h3>#.인덱스 생성</h3>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">create index idx__cn on leaf_cert(cn);\ncreate index idx__last_issued on leaf_cert(last_issued);\ncreate index idx__vaild on leaf_cert(valid);</code></pre></div>\n<h3>#.근데?</h3>\n<p>확인해보니 에이징 테스트 셋이 잘못됐었다..<br>\n운영시 실제로는 cn 컬럼의 데이터가 중복 발생 할 경우가 낮아 cn의 cadinality는 높아야 하는데…<br>\n테스트 셋을 300개만 생성하여 테스트를 하니 동일 cn으로 생성/폐지가 계속 발생하게 되었다.</p>\n<p>폐지가 계속 발생되는 테스트이다보니… cn은 cardinality 가 낮아지고, 폐지 여부 컬럼인 valid 가 선택률이 낮게 되었다.\n어쩔 수 없이 valid 컬럼에 인덱스를 추가 생성했다.</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">create index idx__valid on leaf_cert(valid);</code></pre></div>\n<br>\n<h3>테스트 결과</h3>\n<ul>\n<li>결론적으로 CPU 사용량 및 응답속도에서 약 65~75% 의 개선 효과가 관찰됨.</li>\n<li>인덱스 작업 전 CPU 사용량\n\n  <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/devHistoryBlog/static/4ba4f99899220e04996580bc1b4eb2c9/098c1/001-01.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n  \n  <span\n    class=\"gatsby-resp-image-wrapper\"\n    style=\"position: relative; display: block;  max-width: 960px; margin-left: auto; margin-right: auto;\"\n  >\n    <span\n      class=\"gatsby-resp-image-background-image\"\n      style=\"padding-bottom: 28.750000000000004%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAYAAADDl76dAAAACXBIWXMAABYlAAAWJQFJUiTwAAAA30lEQVQY001Q0W7EIAzr///WtodNp33Gbr2HrVAKlAA+k5GpICsiDo6T5XtdEVNEkYJaK1pvaO2C3v5zlbDjQoTfd4QQ8ON2HCkhxojFOw85C/gLVSqkULgIo6FoHLlj29g8IeWk8cynIqeMQg0VFCbKQZIdSyRhkTkF38att0/c3j/w9vIK/+sgVkMI+T9BER2h9T7H6+gT9tYc7/F44P51V4itZ6JTI9H1UjhSomXd39zbyA30yy5zpgPCzskRhxnl+XcYUMGNewk+wDmnhepsivSL29HQBKzmymM6fAJJxtUUqw5dHwAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n    >\n      <img\n        class=\"gatsby-resp-image-image\"\n        style=\"width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;\"\n        alt=\"001 01\"\n        title=\"\"\n        src=\"/devHistoryBlog/static/4ba4f99899220e04996580bc1b4eb2c9/d9199/001-01.png\"\n        srcset=\"/devHistoryBlog/static/4ba4f99899220e04996580bc1b4eb2c9/8ff5a/001-01.png 240w,\n/devHistoryBlog/static/4ba4f99899220e04996580bc1b4eb2c9/e85cb/001-01.png 480w,\n/devHistoryBlog/static/4ba4f99899220e04996580bc1b4eb2c9/d9199/001-01.png 960w,\n/devHistoryBlog/static/4ba4f99899220e04996580bc1b4eb2c9/07a9c/001-01.png 1440w,\n/devHistoryBlog/static/4ba4f99899220e04996580bc1b4eb2c9/098c1/001-01.png 1578w\"\n        sizes=\"(max-width: 960px) 100vw, 960px\"\n      />\n    </span>\n  </span>\n  \n  </a>\n    </li>\n<li>인덱스 작업 전 응답시간\n\n  <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/devHistoryBlog/static/70721dc15ae9d6e7dfc8f97b6e2b1c62/891d5/001-03.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n  \n  <span\n    class=\"gatsby-resp-image-wrapper\"\n    style=\"position: relative; display: block;  max-width: 960px; margin-left: auto; margin-right: auto;\"\n  >\n    <span\n      class=\"gatsby-resp-image-background-image\"\n      style=\"padding-bottom: 30.83333333333333%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAYAAADDl76dAAAACXBIWXMAABYlAAAWJQFJUiTwAAABaUlEQVQY002QSUtCYRiF748K2pSlJbVqWvQDIiIaNBsoi6BltJF21aZF1C8IIZTMKRWHNC2TLFRCHK5DF83hDqfvvha4eDgf532/88LhFEVC5buDTKEBodlFqy0SkiRDlmWU6220OxKqQof8xo+IriiRly00oSgKmi0RNTbvdCVwgII830IsXadgNVSlK8q0mMoJ+Mw3EE7VkMwIiH/U4Y3z8L1UcHWXhT1UxLUthxt7jv5wsXQNu2cJmC8S2DtPYNUSxYrlCYbTGBZPIlg4DmP+KIDZAz+mzD5M7/swse3B5I4X+k0PtEY3NOsu6ExuXFoz4G4f8xhYcpA5tOYkHf5DY3BhhKHdcEOnYurpOAsaM/VURb/VC55hRzmrL4/B5QeMGl0EBbChqv1e/+zfV990gIWrx+cOWeBXqQlbsEhdOCIl3DM8zzypO1YmnNEy9eaMluBn3VGHCR6B1wpCb1VE32sIJqu09wt5sHdaqnp+sAAAAABJRU5ErkJggg=='); background-size: cover; display: block;\"\n    >\n      <img\n        class=\"gatsby-resp-image-image\"\n        style=\"width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;\"\n        alt=\"001 03\"\n        title=\"\"\n        src=\"/devHistoryBlog/static/70721dc15ae9d6e7dfc8f97b6e2b1c62/d9199/001-03.png\"\n        srcset=\"/devHistoryBlog/static/70721dc15ae9d6e7dfc8f97b6e2b1c62/8ff5a/001-03.png 240w,\n/devHistoryBlog/static/70721dc15ae9d6e7dfc8f97b6e2b1c62/e85cb/001-03.png 480w,\n/devHistoryBlog/static/70721dc15ae9d6e7dfc8f97b6e2b1c62/d9199/001-03.png 960w,\n/devHistoryBlog/static/70721dc15ae9d6e7dfc8f97b6e2b1c62/07a9c/001-03.png 1440w,\n/devHistoryBlog/static/70721dc15ae9d6e7dfc8f97b6e2b1c62/891d5/001-03.png 1520w\"\n        sizes=\"(max-width: 960px) 100vw, 960px\"\n      />\n    </span>\n  </span>\n  \n  </a>\n    </li>\n</ul>\n<br>\n<ul>\n<li>인덱스 작업 후 CPU 사용량\n\n  <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/devHistoryBlog/static/44bb4660498f26b26e3993eba8f22549/bd82c/001-02.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n  \n  <span\n    class=\"gatsby-resp-image-wrapper\"\n    style=\"position: relative; display: block;  max-width: 960px; margin-left: auto; margin-right: auto;\"\n  >\n    <span\n      class=\"gatsby-resp-image-background-image\"\n      style=\"padding-bottom: 27.916666666666668%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAYAAADDl76dAAAACXBIWXMAABYlAAAWJQFJUiTwAAAA3klEQVQY03VQ0W7CMAzM/3/eRkDT9jgElLHSpk0cp8lhh5QJaVg6xbbO9l3M936Pvu8RQkCMEcuyvERK6QmX64hhGCrOv1c452B0GRGhlAKNV8tyznWJ5kVyrUkExAaiCGaGYSFp5EbKsvg/6EFdpkOpHdGeyrhLQa2NWl2SEPQ6N2i+9ta+HOPR4bixeLcWu90WHLnN8GPWVLnOI7gZPMs/Th5RXj9OIK3XnidM3Q8ObxZ2s8XXxydm5chclPkK4ZnucIT3AadTJ1YS1lBb5WHmbosiIYqaP0564mjcAEit1Hc3TLztAAAAAElFTkSuQmCC'); background-size: cover; display: block;\"\n    >\n      <img\n        class=\"gatsby-resp-image-image\"\n        style=\"width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;\"\n        alt=\"001 02\"\n        title=\"\"\n        src=\"/devHistoryBlog/static/44bb4660498f26b26e3993eba8f22549/d9199/001-02.png\"\n        srcset=\"/devHistoryBlog/static/44bb4660498f26b26e3993eba8f22549/8ff5a/001-02.png 240w,\n/devHistoryBlog/static/44bb4660498f26b26e3993eba8f22549/e85cb/001-02.png 480w,\n/devHistoryBlog/static/44bb4660498f26b26e3993eba8f22549/d9199/001-02.png 960w,\n/devHistoryBlog/static/44bb4660498f26b26e3993eba8f22549/07a9c/001-02.png 1440w,\n/devHistoryBlog/static/44bb4660498f26b26e3993eba8f22549/bd82c/001-02.png 1585w\"\n        sizes=\"(max-width: 960px) 100vw, 960px\"\n      />\n    </span>\n  </span>\n  \n  </a>\n    </li>\n<li>인덱스 작업 후 응답시간\n\n  <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/devHistoryBlog/static/6cbf1f4c05306f02c3a609ebaa0c2682/6bfbb/001-04.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n  \n  <span\n    class=\"gatsby-resp-image-wrapper\"\n    style=\"position: relative; display: block;  max-width: 960px; margin-left: auto; margin-right: auto;\"\n  >\n    <span\n      class=\"gatsby-resp-image-background-image\"\n      style=\"padding-bottom: 31.25%; position: relative; bottom: 0; left: 0; background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAGCAYAAADDl76dAAAACXBIWXMAABYlAAAWJQFJUiTwAAABEUlEQVQY001Q20rDQBTMz/qgiCi1iiD4AYIX6g0R/Baf+qZJG/0HQzVtc9lLNhnPnDTShWFn55yZPbtRZTxC2wLoUNYNjAuwgnzt4Juer0qP2jZwPvSa7ORd16GovfZUpsG68ohKEVhsQosstyilUNugnDr5z8qJsQ8keCnBQF5mpIdheeEQFZXTdCLLDQopkH//GjH1+mJp1cAQTjogyBBLCSk302mgsR796jSATa18gRHDoNvN81r9GiinzsUv4KKPnmiaLjC6n+HkcY6ju5nys+cUp08pjh/mGAnGUhvLzp7zl0/s38QKanvXsfbtXL6rN3qLM+xefeiBgds4nGydJ4OWbNWT//3gNsHF6xf+AGQYrA7BJ8qIAAAAAElFTkSuQmCC'); background-size: cover; display: block;\"\n    >\n      <img\n        class=\"gatsby-resp-image-image\"\n        style=\"width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;\"\n        alt=\"001 04\"\n        title=\"\"\n        src=\"/devHistoryBlog/static/6cbf1f4c05306f02c3a609ebaa0c2682/d9199/001-04.png\"\n        srcset=\"/devHistoryBlog/static/6cbf1f4c05306f02c3a609ebaa0c2682/8ff5a/001-04.png 240w,\n/devHistoryBlog/static/6cbf1f4c05306f02c3a609ebaa0c2682/e85cb/001-04.png 480w,\n/devHistoryBlog/static/6cbf1f4c05306f02c3a609ebaa0c2682/d9199/001-04.png 960w,\n/devHistoryBlog/static/6cbf1f4c05306f02c3a609ebaa0c2682/07a9c/001-04.png 1440w,\n/devHistoryBlog/static/6cbf1f4c05306f02c3a609ebaa0c2682/6bfbb/001-04.png 1514w\"\n        sizes=\"(max-width: 960px) 100vw, 960px\"\n      />\n    </span>\n  </span>\n  \n  </a>\n    </li>\n</ul>\n<br>\n<h3>느낀점</h3>\n<p>이번 프로젝트를 진행하면서 많은 경험을 하는것 같다.<br>\n실 운영 상황에 맞게 테스트 셋을 만들었어야 했고, 미리 index 작업을 했었어야 했다.<br>\n놓쳤던 부분이 많았다.  </p>\n<p>특히 인덱스 부분에서는 50만개 full scan 정도야 했는데… 이로인해 응답속도지연과 cpu 사용률이 문제가 되다니…<br>\nDB를 너무 신뢰했던거 같다.\n반성한다.</p>","fields":{"tagSlugs":["/tags/mysql/","/tags/index/"],"slug":"/works/posts/2021-02-04--001"},"frontmatter":{"title":"[작업로그] Mysql Index 미생성 이슈","tags":["mysql","index"],"date":"2021-02-04","description":""}}},"pageContext":{"slug":"/works/posts/2021-02-04--001"}},"staticQueryHashes":[]}