<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>JIN_CODER</title>
    <link>https://jin-coder.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Sat, 11 Apr 2026 11:51:50 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>JIN_Coder</managingEditor>
    <image>
      <title>JIN_CODER</title>
      <url>https://tistory1.daumcdn.net/tistory/5351925/attach/22f4b20b1eb4411f8715016956f7cf75</url>
      <link>https://jin-coder.tistory.com</link>
    </image>
    <item>
      <title>디비스터디</title>
      <link>https://jin-coder.tistory.com/entry/%EB%94%94%EB%B9%84%EC%8A%A4%ED%84%B0%EB%94%94-1</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;프라이머리 키에 의함 클러스터링&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;InnoDB의 모든 테이블은 기본적으로 프라이머리 키를 기준으로 클러스터링 되어 저장됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;키 값의 순서대로 디스크에 저장됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모든 세컨더리 인덱스는 레코드의 주소 대신 프라이머리 키의 값을 논리적인 주소로 사용됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;레인지 스캔은 빨리 처리됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쿼리의 실행 계획에서 프라이머리 키는 기본적으로 다른 보조 인덱스에 비해 비중이 높게 설정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;InnoDB 스토리지 엔진과는 달리 myISAM 스토리지 엔진에서는 클러스터링 키를 지원하지 않음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;외래키 지원&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;외래키는 데이터베이스 서버 운영의 불편함 때문에 서비스용 데이터베이스에서는 생서하지 않는 경우도 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발 환경에서는 좋은 가드 역할을 하기도 함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;외래키는 부모 자식 테이블의 인덱스 생성이 필요하고, 데이터 유무를 체크 하기 때문에 잠금 및 데드락이 발생 할 수 있어서 주의가 필요함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;외래키로 인한 데이터 수정 및 삭제 잠금 해제하는 쿼리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SET foreign_key_checks = OFF;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터 일관성을 다시 맞춰주고 외래키를 다시 사용해야 함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MVCC(Multi Version Concurrency Control)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일반적으로 레코드 레벨의 트랜잭션을 지원하는 DBMS가 제공하는 기능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MVCC는 잠금을 사용하지 않는 일관된 읽기를 제공함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;InnoDB는 언두로그를 이용하여 MVCC를 구현&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;363&quot; data-origin-height=&quot;286&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bl4YAB/btsznDCQXdC/LVDc20diNK4bxkxZlVXqn0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bl4YAB/btsznDCQXdC/LVDc20diNK4bxkxZlVXqn0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bl4YAB/btsznDCQXdC/LVDc20diNK4bxkxZlVXqn0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbl4YAB%2FbtsznDCQXdC%2FLVDc20diNK4bxkxZlVXqn0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;363&quot; height=&quot;286&quot; data-origin-width=&quot;363&quot; data-origin-height=&quot;286&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;427&quot; data-origin-height=&quot;379&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bHjhUP/btszjG2eyrp/sSydRgx6IXO8CKekEraz9k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bHjhUP/btszjG2eyrp/sSydRgx6IXO8CKekEraz9k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bHjhUP/btszjG2eyrp/sSydRgx6IXO8CKekEraz9k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbHjhUP%2FbtszjG2eyrp%2FsSydRgx6IXO8CKekEraz9k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;427&quot; height=&quot;379&quot; data-origin-width=&quot;427&quot; data-origin-height=&quot;379&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;UPDATE문장이 실행되면 커밋 실행여부와 관계없이 InnoDB의 버퍼풀은 새로운 값으로 업데이트 함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;작업중인 레코드를 조회 하면 어떻게 보여짐?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SELECT * FROM member WHERE m_id = 12;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MySQL 서버의 시스템 변수에 설정된 격리 수준(Isolation Level)에 따라 다름&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;격리수준&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;READ_UNCOMMITTED&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;InnoDB 버퍼풀이 현재 가지고 있는 변경된 데이터를 읽어서 반환함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;커밋이 됐든 아니든 변경된 상태의 데이터를 반환&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;READ_COMMITTED or 그 이상 수준&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;커밋되지 않았기 때문에 InnoDB버퍼풀이나 데이터 파일에 있는 내용 대신 변경되기 이전의 내용을 보관하고 있는 언두영역의 테이터를 반환&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 과정을 DBMS MVCC라고 함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;트랜잭션이 길어지면 예전데이터가 삭제되지 못하고 언두로그에 오랫동안 남아있게 되면서 불필요한 공간이 늘어나는 상황이 생길 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;COMMIT 명령을 실행하면 InnoDB는 더이상의 변경 작업 없이 지금의 상태를 영구적인 데이터로 만듦&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;롤백을 실행하면 InnoDB의 언두로그에 있는 백업된 데이터를 버퍼풀로 복구 하고 언두로그를 삭제&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;잠금없는 일관된 읽기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;InnoDB 스토리지 엔진은 MVCC 기술을 이용해 잠금을 걸지 않고 읽기 작업이 가능함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;잠금을 걸지 않기 때문에 InnoDB에서 읽기 작업은 다른 트랜잭션이 가지고 있는 잠금을 기다리지 않고 읽기 작업이 가능함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;격리 수준이 SERIALIZABLE이 아닌 다른 수준에서는 INSERT와 경결되지 않은 순수한 읽기 작업은 다른 트랜잭션의 변경 작업과 관계없이 항상 잠금을 대기하지 않고 바로 실행됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;318&quot; data-origin-height=&quot;362&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CEC7c/btszjDj4ZRy/2mYudMU9UtP3AWoq8wo2S0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CEC7c/btszjDj4ZRy/2mYudMU9UtP3AWoq8wo2S0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CEC7c/btszjDj4ZRy/2mYudMU9UtP3AWoq8wo2S0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCEC7c%2FbtszjDj4ZRy%2F2mYudMU9UtP3AWoq8wo2S0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;318&quot; height=&quot;362&quot; data-origin-width=&quot;318&quot; data-origin-height=&quot;362&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특정 사용자가 레코드를 변경하고 아직 커밋하기 전 상태일때 다른 사용자가 SELECT 작업을 방해하지 않음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 잠금 없는 일관된 읽기 라고 함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;InnoDB에서 변경되기 전의 데이터를 읽기 위해 언두로그를 사용함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;트랜잭션이 커밋이나 롤백 적용으로 마무리 되어야 언두로그가 삭제됨(불필요공간 정리)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자동 데드락 감지&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;InnoDB 스토리지 엔진은 내부적으로 잠금이 교착 상태에 빠지지 않았는지 체크하기 위해 잠금 대기 목록을 그래프(Wait-for List)형태로 관리함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데드락 감지 스레드가 주기적으로 잠금 대기 그래프를 검사해 교착 상태에 빠진 트랜잭션들을 찾아서 그 중 하나를 강제 종료함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어떤 트랜잭션을 먼저 종료할지는 언두로그의 양이고, 언두로그 레코드를 적게 가진 트랜잭션이 일반적으로 롤백의 대상이 됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;언두로그 레코드가 적으면 롤백해도 처리할 양이 적어 서버의 부하가 적게감&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;innodb_table_locks 시스템 변수를 활성화 하면 InnoDB 스토리지 엔진 내부의 레코드 잠금뿐만 아니라 테이블 레벨의 잠금까지 감지 할 수 있게 됨(가능하면 innodb_table_locks을 활성화 하자)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데드락 감지 스레드는 잠금 목록을 검사해야 하기 때문에 잠금 상태가 변경되지 않도록 잠금 목록이 저장된 리스트에 새로운 잠금을 걸고 데드락 스레드를 찾음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자동화된 장애 복구&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MySQL 서버가 시작될때 완료되지 못한 트랜잭션이나 디스크 일부에 기록된 데이터 페이지 등 일련의 복구 작업이 자동으로 진행됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MySQl 서버가 시작될 때 항상 자동복구를 수행함&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;734&quot; data-origin-height=&quot;76&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zxIqu/btszpBY50EO/n103jYTk1T8ISi8B6VW3O0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zxIqu/btszpBY50EO/n103jYTk1T8ISi8B6VW3O0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zxIqu/btszpBY50EO/n103jYTk1T8ISi8B6VW3O0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzxIqu%2FbtszpBY50EO%2Fn103jYTk1T8ISi8B6VW3O0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;734&quot; height=&quot;76&quot; data-origin-width=&quot;734&quot; data-origin-height=&quot;76&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;740&quot; data-origin-height=&quot;118&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vnOqh/btszmyIywEe/130YBBOk2IBGGtSFdkTHlK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vnOqh/btszmyIywEe/130YBBOk2IBGGtSFdkTHlK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vnOqh/btszmyIywEe/130YBBOk2IBGGtSFdkTHlK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvnOqh%2FbtszmyIywEe%2F130YBBOk2IBGGtSFdkTHlK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;740&quot; height=&quot;118&quot; data-origin-width=&quot;740&quot; data-origin-height=&quot;118&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MySQL 서버가 기동되고 InnoDB 테이블이 인식된다면 mysqldump를 이용해 데이터를 가능한 만큼 백업하고 그 데이터로 MySQL 서버의 DB와 테이블을 다시 생성하는 것이 좋음&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;751&quot; data-origin-height=&quot;578&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/caau4g/btszrMzhNKi/vEcBAZUcBQWwMcJtzr9NhK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/caau4g/btszrMzhNKi/vEcBAZUcBQWwMcJtzr9NhK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/caau4g/btszrMzhNKi/vEcBAZUcBQWwMcJtzr9NhK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcaau4g%2FbtszrMzhNKi%2FvEcBAZUcBQWwMcJtzr9NhK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;751&quot; height=&quot;578&quot; data-origin-width=&quot;751&quot; data-origin-height=&quot;578&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;735&quot; data-origin-height=&quot;735&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VG6K1/btszllXdieT/bV8YWbKr8pAvkE0J5dnLDK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VG6K1/btszllXdieT/bV8YWbKr8pAvkE0J5dnLDK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VG6K1/btszllXdieT/bV8YWbKr8pAvkE0J5dnLDK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVG6K1%2FbtszllXdieT%2FbV8YWbKr8pAvkE0J5dnLDK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;735&quot; height=&quot;735&quot; data-origin-width=&quot;735&quot; data-origin-height=&quot;735&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 방법을 써도 복구가 안되면 백업을 이용해서 다시 구축하는 방법뿐임&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;InnoDB 복구를 이용하는 것보다 풀 백업과 바이너리 로그로 복구하는 편이 데이터 손실이 저 적을 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;InnoDB 버퍼 풀&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Innodb 스토리지 엔진에서 가장 핵심적인 부분&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;디스크의 데이터 파일이나 인덱스 정보를 메모리에 캐시해 두는 공간&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;버퍼풀 크기 설정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MySQL 5.7이상 부터 InnoDB버퍼풀의 크기를 동적으로 조정할 수 있게 됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가능하면 InnoDB 버퍼풀의 크기를 적절히 작은 값으로 설정해서 조금씩 상황을 봐가면서 증가시키는것이 좋음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;운영체제의 전체 메모리 공간이 8GB 미만이라면 50%만 버퍼풀로 설정, 나머지 메모리 공간으로 MySQL 서버와 운영체제, 다른 프로그램 공간으로 설정하면 좋음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;InnoDB 버퍼풀은 innodb_buffer_pool_size 시스템 변수로 크기를 설정 가능하고 동적으로 버퍼풀 크기를 확장 가능함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;버퍼풀 크기 변경은 크리티컬한 변경이므로 한가한 시점에 해야함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;버퍼풀의 구조&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;InnoDB 스토리지 엔진은 크게 LRU 리스트, 플러시 리스트, 프리 리스트 3개의 자료구조를 관리함&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;337&quot; data-origin-height=&quot;329&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bRar7E/btszj6mgfLm/TEJwXukiHAzwoygC9shSOK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bRar7E/btszj6mgfLm/TEJwXukiHAzwoygC9shSOK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bRar7E/btszj6mgfLm/TEJwXukiHAzwoygC9shSOK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbRar7E%2Fbtszj6mgfLm%2FTEJwXukiHAzwoygC9shSOK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;337&quot; height=&quot;329&quot; data-origin-width=&quot;337&quot; data-origin-height=&quot;329&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LRU 리스트를 관리하는 목적은 디스크로 부터 한번 읽어온 페이지를 최대한 오랫동안 InnoDB버퍼풀 메모리에 유지해서 디스크 읽기를 최소화 하는 것&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <author>JIN_Coder</author>
      <guid isPermaLink="true">https://jin-coder.tistory.com/233</guid>
      <comments>https://jin-coder.tistory.com/entry/%EB%94%94%EB%B9%84%EC%8A%A4%ED%84%B0%EB%94%94-1#entry233comment</comments>
      <pubDate>Mon, 30 Oct 2023 02:23:52 +0900</pubDate>
    </item>
    <item>
      <title>디비 스터디</title>
      <link>https://jin-coder.tistory.com/entry/%EB%94%94%EB%B9%84-%EC%8A%A4%ED%84%B0%EB%94%94-3</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;MySQL 엔진 아키텍처&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;머리 역할 : MySQL 엔진&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;손발 역할 : 스토리지 엔진&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;495&quot; data-origin-height=&quot;499&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Yu84r/btsyWgIh4zF/4IoODYfRSkR6xtWbkO0lgK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Yu84r/btsyWgIh4zF/4IoODYfRSkR6xtWbkO0lgK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Yu84r/btsyWgIh4zF/4IoODYfRSkR6xtWbkO0lgK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYu84r%2FbtsyWgIh4zF%2F4IoODYfRSkR6xtWbkO0lgK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;495&quot; height=&quot;499&quot; data-origin-width=&quot;495&quot; data-origin-height=&quot;499&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MySQL은 일반 상용 RDBMS와 같이 대부분의 프로그래밍 언어로부터 접근 방법을 모두 지원&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모든 언어로 MySQL서버에서 쿼리를 사용 할 수 있게 지원&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MySQL 엔진&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클라이언트로부터의 접속 및 쿼리 요청을 처리하는 커넥션핸들러, SQL 파서 및 전처리기, 쿼리의 최적화된 실행을 위한 옵티마이저가 중심을 이룸&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스토리지 엔진&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MySQL 엔진은 요청된 SQL 문장을 분석하거나 최적화 하는 등 DBMS의 두뇌에 해당하는 처리를 수행&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제 데이터를 디스크 스토리지에 저장하거나 디스크 스토리지로부터 데이터를 읽어오는 부분은 스토리지 엔진 담당&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MySQL은 하나지만, 스토리지 엔진은 여러개를 동시에 사용 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 스토리지 엔진은 성능 향상을 위햐 키 캐시나 InnoDB 버퍼풀 같은 기능 내장&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;핸들러 API&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;핸들러 요청 : 데이터를 쓰거나 읽어야 할 땐느 각 스토리지 엔진에 쓰기 또는 읽기 요청&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때 사용 되는 API 를 핸들러 API 라고함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;InnoDB 스토리지 엔진 또한 이 핸들러 API를 이용해 MySQL 엔진과 데이터를 주고 받음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MySQL 스레딩 구조&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;564&quot; data-origin-height=&quot;376&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bTqgem/btsyVhAF0J3/jgBe1xtOZS2jcMfQyw0tR0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bTqgem/btsyVhAF0J3/jgBe1xtOZS2jcMfQyw0tR0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bTqgem/btsyVhAF0J3/jgBe1xtOZS2jcMfQyw0tR0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbTqgem%2FbtsyVhAF0J3%2FjgBe1xtOZS2jcMfQyw0tR0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;564&quot; height=&quot;376&quot; data-origin-width=&quot;564&quot; data-origin-height=&quot;376&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MySQL 서버는 프로세스 기반이 아니라 스레드 기반으로 작동하며, 크게 포그라운드 스레드와 백그라운드 스레드로 구분할 수 있음&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;757&quot; data-origin-height=&quot;61&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OZcow/btsyT3JxKsU/K3RFSMTf46UU6jPrpgSirk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OZcow/btsyT3JxKsU/K3RFSMTf46UU6jPrpgSirk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OZcow/btsyT3JxKsU/K3RFSMTf46UU6jPrpgSirk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOZcow%2FbtsyT3JxKsU%2FK3RFSMTf46UU6jPrpgSirk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;757&quot; height=&quot;61&quot; data-origin-width=&quot;757&quot; data-origin-height=&quot;61&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;750&quot; data-origin-height=&quot;109&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mHONr/btsyUPxwWh5/y3Q6NIYa1xrGCKNq47mnJ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mHONr/btsyUPxwWh5/y3Q6NIYa1xrGCKNq47mnJ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mHONr/btsyUPxwWh5/y3Q6NIYa1xrGCKNq47mnJ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmHONr%2FbtsyUPxwWh5%2Fy3Q6NIYa1xrGCKNq47mnJ1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;750&quot; height=&quot;109&quot; data-origin-width=&quot;750&quot; data-origin-height=&quot;109&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;thread/sql/one_connection 스레드만 실제 사용자의 요청을 처리하는 포그라운드 스레드&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;동일한 이름의 스레드가 2개 이상씩 보이는 것은 MySQL 서버의 설정에 따라 스레드가 동일 작업을 병렬처리 하는 경우&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스레드 풀에서는 커넥션과 포그라운드 스레드는 1:1관계가 아니라 하나의 스레드가 여러개의 커넥션 요청을 전담&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;포그라운드 스레드(클라이언트 스레드)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;포그라운드 스레든느 최소한 MySQL 서버에 접속된 클라이언트의 수만큼 존재&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주로 각 클라이언트 사용자가 요청하는 쿼리문장을 처리함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;작업 후 커넥션을 종료하면 스레드는 다시 스레드 캐시로 되돌아감&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;백그라운드 스레드&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;백그라운드 스레드로 처리되는 작업들&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;404&quot; data-origin-height=&quot;191&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/caPlht/btsyTtoBZ5g/psngNIBKvkGPpJw8TLxo70/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/caPlht/btsyTtoBZ5g/psngNIBKvkGPpJw8TLxo70/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/caPlht/btsyTtoBZ5g/psngNIBKvkGPpJw8TLxo70/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcaPlht%2FbtsyTtoBZ5g%2FpsngNIBKvkGPpJw8TLxo70%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;404&quot; height=&quot;191&quot; data-origin-width=&quot;404&quot; data-origin-height=&quot;191&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로그 스레드&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쓰기 스레드 : 버퍼의 데이터를 디스크로 내려쓰는 작업&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쓰기, 읽기 스레드는 2개 이상 지정 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쓰기 스레드는 아주 많은 작업을 백그라운드로 처리하기 때문에 일반적인 내장 디스크를 사용할때는 2~4정도, DAS나&amp;nbsp; SAN과 같은 스토리지를 사용할 때는 디스크를 최적으로 사용 할 수 있을 만큼 충분히 설정하는것이 좋음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메모리 할당 및 사용 구조&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MySQL에서 사용되는 메모리 공간은 크게 글로벌 메모리 영역과 로컬 메모리 영역으로 구분 할 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;글로벌 메모리 영역의 모든 메모리 공간은 MySQL서버가 시작되면서 운영체제로부터 할당 됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MySQL의 시스템 변수로 설정해 둔 만큰 운영체제로부터 메모리를 할당 받음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;글로벌 메모리 영역&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일반적으로 클라이언트 스레드의 수과 무관하게 하나의 메모리 공간만 할당됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대표적인 글로벌 메모리 영역&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;테이블캐시&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;InnoDB 버퍼풀&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;InnoDB 어댑티브 해시 인덱스&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;InnoDB 리두 로그 버퍼&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로컬 메모리 영역(세션 메모리 영역)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MySQL 서버상에 존재하는 클라이언트 스레드가 쿼리를 처리하는데 사용하는 메모리&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;406&quot; data-origin-height=&quot;279&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ms6rK/btsy2qDlU9K/P7Ptcq4OKF9O0r3Tsh8viK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ms6rK/btsy2qDlU9K/P7Ptcq4OKF9O0r3Tsh8viK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ms6rK/btsy2qDlU9K/P7Ptcq4OKF9O0r3Tsh8viK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fms6rK%2Fbtsy2qDlU9K%2FP7Ptcq4OKF9O0r3Tsh8viK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;406&quot; height=&quot;279&quot; data-origin-width=&quot;406&quot; data-origin-height=&quot;279&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클라이언트가 사용하는 메모리 공간&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클라이언트와 MySQL 서버와의 커넥션을 세션이라고 함, 세션 메모리 영역이라고 함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로컬 메모리는 각 클라이언트 스레드별로 독립적으로 할당되며 정대 공유되어 사용되지 않음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;적절한 메모리 공간설정하는것이 중요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 쿼리의 용도별로 필요할 때만 공간이 할당되고, 필요하지 않은 경우에는 MySQL이 메모리 공간을 할당조차도 하지 않을 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;커넥션이 열러있는동안 계속 할당 된 상태로 남아있는 공간(커넥션 버퍼나 결과 버퍼), 쿼리를 실행하는 순간에만 할당했다가 다시 해제한느 공간(소트 버퍼, 조인버퍼)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로컬메모리 대표 영역&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정렬버퍼&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;조인버퍼&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;바이너리 로그 캐시&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;네트워크 버퍼&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;플로그인 스토리지 엔진 모델&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;561&quot; data-origin-height=&quot;336&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HOOVt/btsyUfKalw9/jk7NfzHLPU038ypVrO44yK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HOOVt/btsyUfKalw9/jk7NfzHLPU038ypVrO44yK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HOOVt/btsyUfKalw9/jk7NfzHLPU038ypVrO44yK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHOOVt%2FbtsyUfKalw9%2Fjk7NfzHLPU038ypVrO44yK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;561&quot; height=&quot;336&quot; data-origin-width=&quot;561&quot; data-origin-height=&quot;336&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;705&quot; data-origin-height=&quot;193&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bt8ABX/btsyUOyCq0Z/SSDQLbCT1MeLWy1PeySWR0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bt8ABX/btsyUOyCq0Z/SSDQLbCT1MeLWy1PeySWR0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bt8ABX/btsyUOyCq0Z/SSDQLbCT1MeLWy1PeySWR0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbt8ABX%2FbtsyUOyCq0Z%2FSSDQLbCT1MeLWy1PeySWR0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;705&quot; height=&quot;193&quot; data-origin-width=&quot;705&quot; data-origin-height=&quot;193&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 처리 영역에서 데이터 읽기/쓰기 작업은 대부분 1건의 레코드 단위로 처리됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;핸들러 : 프로그래밍 언어에서는 어떤 기능을 호출하기 위해 사용하는 운전대와 같은 역할을 하는 객체&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MySQL 엔진은 사람 역할, 스토리지 엔진은 자동차 역할, MySQL 엔진이 스토리지 엔진을 조정하기 위해 핸들러라는 것을 사용함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MySQL엔진이 각 스토리지 엔진에게 데이터를 읽어오거나 저장하도록 명령하려면 반드시 핸들러를 통해야 한다는 점&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컴포넌트&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MySQL8.0부터는 기존의 플러그인 아키텍처를 대체하기 위해 컴포넌트 아키텍처가 지원됨&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;633&quot; data-origin-height=&quot;134&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ADJT5/btsyU3QedPb/Mykywk5RxnMPqWpgzNBkhk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ADJT5/btsyU3QedPb/Mykywk5RxnMPqWpgzNBkhk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ADJT5/btsyU3QedPb/Mykywk5RxnMPqWpgzNBkhk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FADJT5%2FbtsyU3QedPb%2FMykywk5RxnMPqWpgzNBkhk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;633&quot; height=&quot;134&quot; data-origin-width=&quot;633&quot; data-origin-height=&quot;134&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쿼리 실행 구조&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;490&quot; data-origin-height=&quot;353&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/clhpsv/btsyV1Ee0Gf/A1nkjgnhBN04EX0XCwBiok/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/clhpsv/btsyV1Ee0Gf/A1nkjgnhBN04EX0XCwBiok/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/clhpsv/btsyV1Ee0Gf/A1nkjgnhBN04EX0XCwBiok/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fclhpsv%2FbtsyV1Ee0Gf%2FA1nkjgnhBN04EX0XCwBiok%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;490&quot; height=&quot;353&quot; data-origin-width=&quot;490&quot; data-origin-height=&quot;353&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쿼리파서&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자 요청으로 들어온 쿼리 문장을 토큰으로 분리해 트리 형태의 구조로 만들어 내는 작업&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본문법 오류는 이곳에서 발견&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전처리기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파서 과정에서 만들어진 파서 트리를 기반으로 쿼리 문장에 구조적인 문제점이 있는지 확인&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당객체의 존재 여부와 객체의 접근 권한등을 확인하는 과정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;옵티마이저&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자의 요청으로 들어온 쿼리문장을 저렴한 비용으로 가장 빠르게 처리할지 결정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실행 엔진&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;옵티마이저는 회사의 경영진, 실행엔진은 중간관리자, 핸들러는 각업무의 실무자&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;635&quot; data-origin-height=&quot;257&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Y9aJF/btsyVag47ur/zAN5IqTCzs8cvekN1o2uX1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Y9aJF/btsyVag47ur/zAN5IqTCzs8cvekN1o2uX1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Y9aJF/btsyVag47ur/zAN5IqTCzs8cvekN1o2uX1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FY9aJF%2FbtsyVag47ur%2FzAN5IqTCzs8cvekN1o2uX1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;635&quot; height=&quot;257&quot; data-origin-width=&quot;635&quot; data-origin-height=&quot;257&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실행 엔진으로 만들어진 계획대로 각 핸들러에게 요청해서 받은 결과를 또 다른 핸들러요청의 입력으로 연결하는 역할을 수행함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쿼리캐시&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쿼리캐시는 SQL의 실행 결과를 메모리에 캐시하고, 동일 SQL 쿼리가 실행되면 테이블을 읽지 않고 즉시 결과를 반환하기 때문에 매우 빠른 성능 보유&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터가 변경되는 캐시에 저장된 결과 주에서 변경된 테이블과 관련되 것들은 모두 삭제해야했는데, 이는 심각한 동시 처리 성능 저하를 유발함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MySQL 8.0부터는 쿼리 캐시는 MySQL서버의 기능에서 완전히 제거되고 시스템 변수도 모두 제거됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스레드 풀&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내부적으로 사용자의 요청을 처리하는 스레드 개수를 줄여서 동시 처리되는 요철리 많다하더라도 MySQL 서버의 CPU가 제한된 개수의 스레드 처리에만 집중 할 수 있게해서 서버의 자원소모를 줄이는 것이 목적&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다만, 스레드 풀이 실제 서비스에서 눈에 띄는 성능 향상을 보여준느 경우는 드뭄..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스케줄링 과정에서 CPU시간을 제대로 확보하지 못하는 경우에는 쿼리 처리가 더 느려지는 사례도 발생할 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스레드풀은 CPU코어의 개수와 맞추는것이 CPu 프로세서 친화도를 높이는데 좋음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모든 스레드 그룹의 스레드가 각자 작업을 처리하고 있는 상태에서 새로운 쿼리 요청이 들어오더라도 스레드풀은 thread_[ool_stall_limit 시간동안 기다려야만 새로운 요청을 처리 할수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;트랜잭션 지원 메타데이터&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터 딕셔너리, 메타데이터 : 데이터베이스 서버에서 테이블의 구조 정보과 스토어드 프로그램등의 정보&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MySQL 8.0부터는테이블의 구조 정보나 스토어드 프로그램의 코드관련 정보를 모두 InnoDB의 데이블에 저장하도록 개선됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <author>JIN_Coder</author>
      <guid isPermaLink="true">https://jin-coder.tistory.com/232</guid>
      <comments>https://jin-coder.tistory.com/entry/%EB%94%94%EB%B9%84-%EC%8A%A4%ED%84%B0%EB%94%94-3#entry232comment</comments>
      <pubDate>Mon, 23 Oct 2023 04:09:29 +0900</pubDate>
    </item>
    <item>
      <title>디비 스터디</title>
      <link>https://jin-coder.tistory.com/entry/%EB%94%94%EB%B9%84-%EC%8A%A4%ED%84%B0%EB%94%94-2</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;GROUP BY 처리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GROUP BY, ORDER BY 은 스트리밍 처리가 불가능함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GROUP BY에 사용된 조건은 인덱스를 사용할 수 없기 때문에 HAVING 절을 튜닝 하려고 인덱스를 생성하거나 다른 방법을 써도 인덱스를 사용할 수 없음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인덱스 스캔 : 인덱스를 차례로 읽는 방법&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;루스 인덱스 스캔 : 인덱스를 건너뛰면서 읽는 방법&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인덱스를 사용하지 못하는 쿼리에서 GROUP BY는 임시테이블 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인덱스 스캔을 이용한 GROUP BY(타이트 인덱스 스캔)&lt;br /&gt;GROUP BY칼럼으로 인덱스가 있다면 인덱스를 차례로 읽으면서 그루핑을 수행하고 그 결과를 조인함&lt;br /&gt;GROUP BY가 인덱스를 통해 처리되는 쿼리는 이미 정렬된 인덱스를 읽는 것이므로 쿼리 실행 시점에 추가적인 정렬 작업이나 내부 임시 테이블은 필요하지 않음&lt;br /&gt;&lt;br /&gt;루스 인덱스 스캔을 이용하는 GROUP BY&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;925&quot; data-origin-height=&quot;288&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cgheLy/btsuk21QiPi/RxKMlD6xXRscXa04QjiuL1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cgheLy/btsuk21QiPi/RxKMlD6xXRscXa04QjiuL1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cgheLy/btsuk21QiPi/RxKMlD6xXRscXa04QjiuL1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcgheLy%2Fbtsuk21QiPi%2FRxKMlD6xXRscXa04QjiuL1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;925&quot; height=&quot;288&quot; data-origin-width=&quot;925&quot; data-origin-height=&quot;288&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;루스 인덱스 스캔 방법은 단일 테이블에 대해 수행되는 GROUP BY 처리에만 사용 가능함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;루스 인덱스 스캔에서는 인덱스의 유니크한 값의 수가 적을수록 성능이 향상됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;루스 인덱스 스캔을 할 수 있는 쿼리들&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;855&quot; data-origin-height=&quot;245&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RfMg1/btsueiqUWtR/i49bM7yUVUJWqbBA4lhdfk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RfMg1/btsueiqUWtR/i49bM7yUVUJWqbBA4lhdfk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RfMg1/btsueiqUWtR/i49bM7yUVUJWqbBA4lhdfk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRfMg1%2FbtsueiqUWtR%2Fi49bM7yUVUJWqbBA4lhdfk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;855&quot; height=&quot;245&quot; data-origin-width=&quot;855&quot; data-origin-height=&quot;245&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;루스 인덱스 스캔을 할 수 없는 쿼리들&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1021&quot; data-origin-height=&quot;323&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dk1hFy/btsubJQaHGw/fzz6bCUOAHOHVmW58vWtd1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dk1hFy/btsubJQaHGw/fzz6bCUOAHOHVmW58vWtd1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dk1hFy/btsubJQaHGw/fzz6bCUOAHOHVmW58vWtd1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdk1hFy%2FbtsubJQaHGw%2Ffzz6bCUOAHOHVmW58vWtd1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1021&quot; height=&quot;323&quot; data-origin-width=&quot;1021&quot; data-origin-height=&quot;323&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;임시 테이블을 사용하는 GROUP BY&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GROUP BY의 기준 칼럼이 드라이빙 테이블에 있거나 드리븐 테이블에 있거나 상관없이 인덱스를 전혀 사용하지 못할 때 사용됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GROUP BY가 필요한 경우 내부적으로 GROUP BY 절의 칼럼들로 구성된 유니크 인덱스를 가진 임시 테이블을 만들어서 중복 제거와 집함 함수 연산을 수행함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DISTINCT 처리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특정 칼럼의 유니크한 값만 조회 하려면 DISTINCT를 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;집합함수가 없는 경우&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MIN(), MAX(), COUNT() 같은 집합 함수와 함께 사용되는 경우&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구분한 이유는 각 경우에 DISTINCT 키워드가 영향을 미치는 범위가 달라짐&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DISTINCT 처리가 인덱스를 사용하지 못할 땐 임시 테이블을 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SELECT DISTINCT ...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SELECT 에서 유니크한 값을 가져오기 위해 DISTINCT를 사용하면 GROUP BY와 같은 방식으로 처리됨&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;933&quot; data-origin-height=&quot;99&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OqGxb/btst7ueQsbt/YYqvjGvIBbSiV0YwN4UklK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OqGxb/btst7ueQsbt/YYqvjGvIBbSiV0YwN4UklK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OqGxb/btst7ueQsbt/YYqvjGvIBbSiV0YwN4UklK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOqGxb%2Fbtst7ueQsbt%2FYYqvjGvIBbSiV0YwN4UklK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;933&quot; height=&quot;99&quot; data-origin-width=&quot;933&quot; data-origin-height=&quot;99&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DISTINCT는 SELECT 하는 레코드를 유니크하게 조회 하는것이지 특정 칼럼만 가져오는게 아님&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SELECT DISTINCT first_name, last_name FROM employee;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;first_name만 유니크한 값을 찾는게 아니라 (first_name, last_name) 조합이 유니크한 값을 찾는거임&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SELECT DISTINCT(first_name), last_name FROM employee;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;에러는 안나지만, DISTINCT는 함수가 아니라 ()를 사용하지 않고, ()는 제거하고 쿼리문이 실행되서 위 쿼리랑 같은 동작을 함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SELECT 절에 사용한 DISTINCT은 코든 칼럼에 영향을 미친다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;?? 칼럼? 레코드가 아니라?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;집합 항수와 함께 사용된 DISTINCT&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;집합 함수 내에서 사용된 DISTINCT는 그 집합 함수의 인자로 전달된 칼럼 값이 유니크한 것들을 가져옴&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;918&quot; data-origin-height=&quot;84&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xlkU7/btsubK2DRzt/OIFHNOIp8pEMVQwnGFVagK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xlkU7/btsubK2DRzt/OIFHNOIp8pEMVQwnGFVagK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xlkU7/btsubK2DRzt/OIFHNOIp8pEMVQwnGFVagK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxlkU7%2FbtsubK2DRzt%2FOIFHNOIp8pEMVQwnGFVagK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;918&quot; height=&quot;84&quot; data-origin-width=&quot;918&quot; data-origin-height=&quot;84&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;984&quot; data-origin-height=&quot;90&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nDtwi/btsueg7JKtG/sayKAUjbyxSXEJveC2JqP0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nDtwi/btsueg7JKtG/sayKAUjbyxSXEJveC2JqP0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nDtwi/btsueg7JKtG/sayKAUjbyxSXEJveC2JqP0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnDtwi%2Fbtsueg7JKtG%2FsayKAUjbyxSXEJveC2JqP0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;984&quot; height=&quot;90&quot; data-origin-width=&quot;984&quot; data-origin-height=&quot;90&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내부적으로는 COUNT(DISTINCT s.salary)를 처리하기 위해 임시테이블을 사용함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;employee, salary 테이블을 조인한 결과에서 salary 칼럼의 값만 저장하기 위한 임시테이블을 만들어 사용함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1000&quot; data-origin-height=&quot;215&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HT2Mh/btsugjpj7tr/bwBW8RiJNJucQWosEy7Wr0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HT2Mh/btsugjpj7tr/bwBW8RiJNJucQWosEy7Wr0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HT2Mh/btsugjpj7tr/bwBW8RiJNJucQWosEy7Wr0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHT2Mh%2Fbtsugjpj7tr%2FbwBW8RiJNJucQWosEy7Wr0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1000&quot; height=&quot;215&quot; data-origin-width=&quot;1000&quot; data-origin-height=&quot;215&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;COUNT(DISTINCT s.salary), COUNT(DISTINCT e.last_name)를 처리하기 위해 임시테이블을 2개를 사용함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;838&quot; data-origin-height=&quot;85&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cDhzz4/btsudKOO1vk/fUNVNuPmZsZaRhjrFloxh1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cDhzz4/btsudKOO1vk/fUNVNuPmZsZaRhjrFloxh1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cDhzz4/btsudKOO1vk/fUNVNuPmZsZaRhjrFloxh1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcDhzz4%2FbtsudKOO1vk%2FfUNVNuPmZsZaRhjrFloxh1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;838&quot; height=&quot;85&quot; data-origin-width=&quot;838&quot; data-origin-height=&quot;85&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인데스된 칼럼에 대해 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;DISTINCT 처리를 수행 하면 인덱스를 푸스캔하거나 레인지 스캔하면서 임시 테이블 없이 최적화된 처리가 가능함&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;내부 임시 테이블 활용&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;일반적으로 MySQL 엔진이 사용하는 임시 테이블은 처은에는 메모리에 생성됐다가 테이블의 크기가 커지면 디스크로 옮김&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;내부적인 임시테이블은 쿼리의 처리가 완료되면 자동 삭제됨&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메모리 임시 테이블과 디스크 임시 테이블&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MySQL 8.0부터 메모리는 TempTable이라는 스토리지 엔진을 사용하고, 디스트에 저장되는 임시 테이블은 InnoDB스토리지 엔진을 사용하도록 개선함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;임시 테이블이 필요한 쿼리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MySQL 엔진에서 별도의 데이터 가공 작업을 필요로 하므로 대표적인 내부 임시 테이블으 생성하는 케이스&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;994&quot; data-origin-height=&quot;246&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JHn6V/btsuh4rTmVE/alQQszTkA2XrkETIxolG50/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JHn6V/btsuh4rTmVE/alQQszTkA2XrkETIxolG50/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JHn6V/btsuh4rTmVE/alQQszTkA2XrkETIxolG50/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJHn6V%2Fbtsuh4rTmVE%2FalQQszTkA2XrkETIxolG50%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;994&quot; height=&quot;246&quot; data-origin-width=&quot;994&quot; data-origin-height=&quot;246&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일반적으로 유니크 인덱스가 있는 내부 임시 테이블은 그렇지 않은 쿼리보다 처리 성능이 상당히 느림&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;임시테이블이 디스크에 생성되는 경우&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;내부 임시 테이블은 기본적으로 메모리 상에 만들어지지만, 메모리 임시 테이블을 사용할 수 없는 경우에는 디스크 기반의 임시테이블을 사용&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;856&quot; data-origin-height=&quot;162&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bhk7F1/btsuh4ZKwT9/SVZzYOKmSv8DZ42CHgKRKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bhk7F1/btsuh4ZKwT9/SVZzYOKmSv8DZ42CHgKRKk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bhk7F1/btsuh4ZKwT9/SVZzYOKmSv8DZ42CHgKRKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbhk7F1%2Fbtsuh4ZKwT9%2FSVZzYOKmSv8DZ42CHgKRKk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;856&quot; height=&quot;162&quot; data-origin-width=&quot;856&quot; data-origin-height=&quot;162&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <author>JIN_Coder</author>
      <guid isPermaLink="true">https://jin-coder.tistory.com/231</guid>
      <comments>https://jin-coder.tistory.com/entry/%EB%94%94%EB%B9%84-%EC%8A%A4%ED%84%B0%EB%94%94-2#entry231comment</comments>
      <pubDate>Mon, 18 Sep 2023 03:07:06 +0900</pubDate>
    </item>
    <item>
      <title>디비 스터디</title>
      <link>https://jin-coder.tistory.com/entry/%EB%94%94%EB%B9%84-%EC%8A%A4%ED%84%B0%EB%94%94-1</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;쿼리의 실행 절차&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DBMS에서 쿼리의 실행 계획을 수립하는 것은 옵티마이저&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1단계 : SQL 파싱, MySQL서버의 SQL 파서 라는 모듈로 처리, SQL 문장이 문법적으로 잘못됐다면 여기서 걸러짐&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SQL 파스 트리가 만들어짐&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2단계 : 최적화 및 실행 계획 수립 단계&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;불필요한 조건 제거 및 복잡한 연산의 단순화&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여러 테이블의 조인이 있는 경우 어떤 순서로 테이블을 읽을지 결정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 테이블에 사용된 조건과 인덱스 통계정보를 이용해 사용할 인덱스를 결정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가져온 레코드들을 임시테이블에 넣고 다시 한번 가공해야 하는지 결정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3단계 : 수립된 실행 계획대로 스토리지 엔진에 에코드를 읽어오도록 요청하고, MySQL엔진에서는 스토리지 엔진으로 부터 받은 레코드를 조인하거나 정렬하는 작업 수행&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;옵티마이저 종류&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;옵티마이저는 DB 서버에서 두뇌 같은 역할을 담당&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비용 기반 최적화 방법 : 워리를 처리하기 위한 여러가지 가능한 방법을 만들고, 각 단위 작업의 비용(부하) 정보와 대상 테이블의 예측된 통계정보를 이용해 실행 계획별 비용을 산출함(요즘 많이 사용됨, MySQL)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;규칙 기반 최적화 방법 : 테이블의 에코드 건수나 선택도 등을 고려하지 않고 옵티마이저에 내장된 우선순위에 따라 실행계획을 수립하는 방식(초기방식)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본 데이터 처리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;풀 테이블 스캔, 풀 인덱스 스캔&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;풀 테이블 스캔&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;테이블의 레코드 건수가 너무 작아서 인덱스를 통해 읽는것 보다 풀 테이블 스캔을 하는편이 더 빠를경우&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;WHERE 절이나 ON 절에 인덱스를 이용할 수 있는 조건이 없는 경우&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인덱스 레인지 스캔을 사용할 수 있는 쿼리라도 조건 일치 레코드 건수가 너무 많은 경우&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;병렬 처리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MySQL 서버에서도 쿼리의 병렬 처리가 가능함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;병렬처리는 하나의 쿼리를 여러 스레드가 작업을 나누어 동시에 처리하는 것을 의미&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;innodb_parallel_readtheads라는 시스템 변수를 이용해 하나의 쿼리를 최대 몇개의 스레드를 이용해서 처리할지 변경 할 수 있음&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;889&quot; data-origin-height=&quot;507&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cIwsqF/btstCHKNvJD/lCfXNDoYkgzkCz2llWFizK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cIwsqF/btstCHKNvJD/lCfXNDoYkgzkCz2llWFizK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cIwsqF/btstCHKNvJD/lCfXNDoYkgzkCz2llWFizK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcIwsqF%2FbtstCHKNvJD%2FlCfXNDoYkgzkCz2llWFizK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;889&quot; height=&quot;507&quot; data-origin-width=&quot;889&quot; data-origin-height=&quot;507&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만, 병렬 처리용 스레드 개수를 아무리 늘리더라도 서버에 장작된 CPU의 코어 개수를 넘어서는 경우에는 오히려 성능이 떨어질 수도 있으니 주의&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ORDER BY 처리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정렬을 처리하는 방법 : 인덱스를 이용하는 방법, 쿼리가 실행될 때 Filesort라는 별도의 처리를 이용하는 방법&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;945&quot; data-origin-height=&quot;351&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ebYIGz/btstx32bRKZ/pfW3nRwZroXU3wScdKxehk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ebYIGz/btstx32bRKZ/pfW3nRwZroXU3wScdKxehk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ebYIGz/btstx32bRKZ/pfW3nRwZroXU3wScdKxehk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FebYIGz%2Fbtstx32bRKZ%2FpfW3nRwZroXU3wScdKxehk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;945&quot; height=&quot;351&quot; data-origin-width=&quot;945&quot; data-origin-height=&quot;351&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인덱스를 사용하기 어려운 케이스&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정렬 기준이 너무 많아서 요건별로 모두 인덱스를 생성하는 것이 불가능한 경우&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GROUP BY의 결과 DISTINCT 같은 처리의 결과를 정렬해야하는 경우&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;임시 테이블의 결과를 다시 정렬해야 하는 경우&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;랜덤하게 결과 레코드를 가져와야 하는 경우&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인덱스를 이용하지 않고 별도의 정렬처리를 수행했는지는 실행계획의 Extra칼럼에 Using filesort 메시지가 표시되는지 여부로 판단 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;소트버퍼&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MySQL은 정렬을 수행하기 위해 별도의 메모리 공간을 할당받아서 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 메모리 공간을 소트 버퍼라고 함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정렬이 필요한 경우에만 할당, 버퍼의 크기는 정렬해야 할 레코드의 크기에 따라 가변적으로 증가, 메모리 공간은 쿼리 실행이 끝나면 반납&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;소트 버퍼의 크기가 256KB에서 8MB 사이에서 최적의 성능을 가짐&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;832&quot; data-origin-height=&quot;288&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bBNUdX/btstxN52tTF/NJb51VrrH1ez8moqLK4lm1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bBNUdX/btstxN52tTF/NJb51VrrH1ez8moqLK4lm1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bBNUdX/btstxN52tTF/NJb51VrrH1ez8moqLK4lm1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbBNUdX%2FbtstxN52tTF%2FNJb51VrrH1ez8moqLK4lm1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;832&quot; height=&quot;288&quot; data-origin-width=&quot;832&quot; data-origin-height=&quot;288&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정렬 알고리즘&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;레코드를 정렬할 때 레코드 전체를 소트버퍼에 담을지 정렬기준 칼럼만 소트 버퍼에 담을지에 따라 싱글패스, 두패스 2가지 정렬 모드로 나뉨&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;857&quot; data-origin-height=&quot;586&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cy6e6P/btstzkI2R7q/iklfP5BFPb1n3HCjRHqqvK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cy6e6P/btstzkI2R7q/iklfP5BFPb1n3HCjRHqqvK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cy6e6P/btstzkI2R7q/iklfP5BFPb1n3HCjRHqqvK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcy6e6P%2FbtstzkI2R7q%2FiklfP5BFPb1n3HCjRHqqvK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;857&quot; height=&quot;586&quot; data-origin-width=&quot;857&quot; data-origin-height=&quot;586&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;868&quot; data-origin-height=&quot;297&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cNksRa/btsts3a0boc/UKXcyCl8eh05kuMyojA6T0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cNksRa/btsts3a0boc/UKXcyCl8eh05kuMyojA6T0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cNksRa/btsts3a0boc/UKXcyCl8eh05kuMyojA6T0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcNksRa%2Fbtsts3a0boc%2FUKXcyCl8eh05kuMyojA6T0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;868&quot; height=&quot;297&quot; data-origin-width=&quot;868&quot; data-origin-height=&quot;297&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;907&quot; data-origin-height=&quot;195&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/br03nw/btstCWHT6Ge/rGNEFxvwWx8oAuVTrzXfqk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/br03nw/btstCWHT6Ge/rGNEFxvwWx8oAuVTrzXfqk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/br03nw/btstCWHT6Ge/rGNEFxvwWx8oAuVTrzXfqk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbr03nw%2FbtstCWHT6Ge%2FrGNEFxvwWx8oAuVTrzXfqk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;907&quot; height=&quot;195&quot; data-origin-width=&quot;907&quot; data-origin-height=&quot;195&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫번째 방식이 투 패스 정렬방식&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두번째, 세번째 방식이 싱글패스 정렬방식&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;싱글패스 정렬방식&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;소트 버퍼에 정렬 기준 칼럼을 포함해 SELECT 대상이 되는 칼럼 전부를 담아서 정렬을 수행하는 정렬방식&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1051&quot; data-origin-height=&quot;511&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/chdGTN/btstzodCF7V/VAkQ7vCekNIfLQsmw8rEK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/chdGTN/btstzodCF7V/VAkQ7vCekNIfLQsmw8rEK1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/chdGTN/btstzodCF7V/VAkQ7vCekNIfLQsmw8rEK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FchdGTN%2FbtstzodCF7V%2FVAkQ7vCekNIfLQsmw8rEK1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1051&quot; height=&quot;511&quot; data-origin-width=&quot;1051&quot; data-origin-height=&quot;511&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;투패스 정렬방식&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정렬 대상 칼럼과 프라이머리 키 값만 소트 버퍼에 담아서 정렬을 수행하고, 정렬된 순거대로 다시 프라이머리 키로 테이블을 읽어서 SELECT할 칼럼을 가져오는 정렬방식&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;872&quot; data-origin-height=&quot;434&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lQ9id/btstyxvbeGr/DWAL963WXXKgQanYmZ0LXk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lQ9id/btstyxvbeGr/DWAL963WXXKgQanYmZ0LXk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lQ9id/btstyxvbeGr/DWAL963WXXKgQanYmZ0LXk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlQ9id%2FbtstyxvbeGr%2FDWAL963WXXKgQanYmZ0LXk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;872&quot; height=&quot;434&quot; data-origin-width=&quot;872&quot; data-origin-height=&quot;434&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;투패스 방식은 두번 읽어야 하기 때문에 불합리하지만, 싱글패스 방식은 이런 단점이 없음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다만, 싱글패스는 더 많은 소트 버퍼에 공간이 필요함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최신버전에서는 일반적으로 싱글패스 정렬방식을 주로 사용함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;싱글패스는 정렬대상 레코드의 크기나 건수가 작은 경우 빠른 성능을 보여주고, 투패스 방식은 정렬 대상 레코드의 크기나 건수가 상당히 많은 경우 효율적임&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정렬이 필요한 SELECT는 불필요한 칼럼은 가져오지 않는것이 가장 효율적인 방법&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정렬 처리 방법&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ORDER BY가 실행 시 정렬 방법&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인덱스 정렬&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;조인에서 드라이빙 테이블만 정렬&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;조인에서 조인 결과를 임시테이블로 저장 후 정렬&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;843&quot; data-origin-height=&quot;177&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/brEP7F/btstvR9s4s5/mK1Sn9tcqdW8oP52ax0Gh0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/brEP7F/btstvR9s4s5/mK1Sn9tcqdW8oP52ax0Gh0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/brEP7F/btstvR9s4s5/mK1Sn9tcqdW8oP52ax0Gh0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbrEP7F%2FbtstvR9s4s5%2FmK1Sn9tcqdW8oP52ax0Gh0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;843&quot; height=&quot;177&quot; data-origin-width=&quot;843&quot; data-origin-height=&quot;177&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인덱스 정렬&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ORDER BY에 명시된 칼럼이 제일 먼저 읽는 테이블(조인이 사용된 경우 드라이빙 테이블)에 속하고, ORDER BY의 순서대로 생성된 인덱스가 있어야함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;WHERE절에 첫번째로 읽는 테이블의 칼럼에 대한 조건이 있다면 그 조건과 ORDER BY는 같은 인덱스를 사용할 수 있어야 함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인덱스 정렬은 인덱스가 이미 정렬되어 있기 때문에 그대로 읽으면 댐&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;875&quot; data-origin-height=&quot;305&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bO3lsp/btstH1B73Wb/wZ6At5sqXPw1O9CwGaNKWK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bO3lsp/btstH1B73Wb/wZ6At5sqXPw1O9CwGaNKWK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bO3lsp/btstH1B73Wb/wZ6At5sqXPw1O9CwGaNKWK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbO3lsp%2FbtstH1B73Wb%2FwZ6At5sqXPw1O9CwGaNKWK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;875&quot; height=&quot;305&quot; data-origin-width=&quot;875&quot; data-origin-height=&quot;305&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;조인의 드라이빙 테이블만 정렬&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;조인이 수행되면 레코드는 몇배로 늘어나고, 크기도 커짐&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;때문에 조인을 실행하기 전에 첫번째 테이블에서 레코드를 정렬 후 조인을 실행하는게 정렬의 차선책&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;조인에서 첫번째로 읽히는 테이블(드라이빙 테이블)의 칼럼만으로 ORDER BY절을 작성해야함&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;778&quot; data-origin-height=&quot;539&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdmdqN/btstxlaS3vi/jna3WKYP3laZSdSmbPC2AK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdmdqN/btstxlaS3vi/jna3WKYP3laZSdSmbPC2AK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdmdqN/btstxlaS3vi/jna3WKYP3laZSdSmbPC2AK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbdmdqN%2FbtstxlaS3vi%2Fjna3WKYP3laZSdSmbPC2AK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;778&quot; height=&quot;539&quot; data-origin-width=&quot;778&quot; data-origin-height=&quot;539&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;임시 테이블 정렬&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2개 이상의 테이블을 사용하면서 첫번째 테이블의 인덱스만 사용할 수 없을 경우 임시 테이블을 생성하여 정렬&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3가지 방법중 정렬할 레코드가 가장 많기 때문에 가장 느린 정렬방법&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;901&quot; data-origin-height=&quot;580&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bOxvDn/btsts5zT44c/uRZKJk1E2GW0ZvkZK8dKT0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bOxvDn/btsts5zT44c/uRZKJk1E2GW0ZvkZK8dKT0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bOxvDn/btsts5zT44c/uRZKJk1E2GW0ZvkZK8dKT0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbOxvDn%2Fbtsts5zT44c%2FuRZKJk1E2GW0ZvkZK8dKT0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;901&quot; height=&quot;580&quot; data-origin-width=&quot;901&quot; data-origin-height=&quot;580&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정렬 처리 방법의 성능 비교&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ORDER BY나 GROUP BY 같은 작업은 WHERE조건을 만족하는 레코드를 LIMIT건수 만큼만 가져와서 처리가 불가능함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;조건을 만족하는 모든 레코드를 가져온 뒤 정렬을 수행하거나 그루핑 작업을 실행해야지만 LIMIT을 걸 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;잘못된 ORDER BY, GROUP BY 때문에 쿼리가 느려지는 경우가 많음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쿼리가 처리되는 방법 : 스트리밍 처리, 버퍼링 처리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스트리밍 방식&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버쪽에서 처리할 데이터가 얼마인지에 관계없이 조건에 일치하는 레코드가 검색될 때마다 바로바로 클라이언트로 전송해주는 방식&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쿼리를 요청하고 원했던 첫 레코드를 전달받고, 마지막 레코드는 언제 받을지 모르지만 상관없음&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;771&quot; data-origin-height=&quot;227&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/A2gPD/btstx6kjKlD/dEwyevBKzfkQfymW0b4Sp1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/A2gPD/btstx6kjKlD/dEwyevBKzfkQfymW0b4Sp1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/A2gPD/btstx6kjKlD/dEwyevBKzfkQfymW0b4Sp1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FA2gPD%2Fbtstx6kjKlD%2FdEwyevBKzfkQfymW0b4Sp1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;771&quot; height=&quot;227&quot; data-origin-width=&quot;771&quot; data-origin-height=&quot;227&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쿼리가 얼마나 많은 레코드를 조회하느냐에 상관없이 빠른 응답시간을 보장해줌&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LIMIT까지 사용하면 마지막 데이터까지 받는데 시간이 단축됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;버퍼링 방식&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ORDER BY, GROUP BY 처리는 쿼리의 결과가 스트리밍 되는 것을 불가능하게함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모든 레코드를 조회하고, 정렬하는동안 클라이언트는 무한 대기하기 때문에 응답속도가 느려짐&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;790&quot; data-origin-height=&quot;262&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bghlS0/btstxORpM2K/kwxarfKJHhZ8WlqRK1xo7K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bghlS0/btstxORpM2K/kwxarfKJHhZ8WlqRK1xo7K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bghlS0/btstxORpM2K/kwxarfKJHhZ8WlqRK1xo7K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbghlS0%2FbtstxORpM2K%2FkwxarfKJHhZ8WlqRK1xo7K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;790&quot; height=&quot;262&quot; data-origin-width=&quot;790&quot; data-origin-height=&quot;262&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정렬처리 3가지 방법중 인덱스 정렬 방식은 스트리밍 형식의 처리방식&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나머지는 버퍼링 방식&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;902&quot; data-origin-height=&quot;360&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bvErra/btstwkDwxTG/3mVfMyGiQf2vFxn1oR1gfk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bvErra/btstwkDwxTG/3mVfMyGiQf2vFxn1oR1gfk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bvErra/btstwkDwxTG/3mVfMyGiQf2vFxn1oR1gfk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbvErra%2FbtstwkDwxTG%2F3mVfMyGiQf2vFxn1oR1gfk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;902&quot; height=&quot;360&quot; data-origin-width=&quot;902&quot; data-origin-height=&quot;360&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;889&quot; data-origin-height=&quot;341&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bpiilj/btstw3O8pF9/hHDpPO2dVAgJWIkSe7Bkt0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bpiilj/btstw3O8pF9/hHDpPO2dVAgJWIkSe7Bkt0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bpiilj/btstw3O8pF9/hHDpPO2dVAgJWIkSe7Bkt0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbpiilj%2Fbtstw3O8pF9%2FhHDpPO2dVAgJWIkSe7Bkt0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;889&quot; height=&quot;341&quot; data-origin-width=&quot;889&quot; data-origin-height=&quot;341&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어느 테이블이 먼저 드아리빙 되어 조인되는지도 중요하지만, 어떤 정렬 방식으로 처리되는지는 더 큰 성능차이를 만듦&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가능하다면 인덱스를 사용한 정렬로 유도하고, 최소한 드라이빙 테이블만 정렬해도 되는 수준으로 유도하는것도 좋은 튜닝 방법&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <author>JIN_Coder</author>
      <guid isPermaLink="true">https://jin-coder.tistory.com/230</guid>
      <comments>https://jin-coder.tistory.com/entry/%EB%94%94%EB%B9%84-%EC%8A%A4%ED%84%B0%EB%94%94-1#entry230comment</comments>
      <pubDate>Mon, 11 Sep 2023 01:35:27 +0900</pubDate>
    </item>
    <item>
      <title>디비스터디</title>
      <link>https://jin-coder.tistory.com/entry/%EB%94%94%EB%B9%84%EC%8A%A4%ED%84%B0%EB%94%94</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;트랜잭션&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여러개의 변경 작업을 수행하는 쿼리가 조합됐을 때 이상이 있을경우 원래 상태로 돌아가게 해주는 기능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;논이적인 작업 셋 자체가 100% 적용되거나(COMMIT을 실행했을 때) 아무것도 적용되지 않아야(ROLLBACK) 함을 보장해줌&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;INNODB는 쿼리 중 일부라도 오류가 발생하면 전체를 원 상태로 만든다는 트랜잭션의 원칙대로 INSERT문을 실행하기 전 상태로 그대로 복구함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MyISAM 테이블에서 발생하는 이러한 현상을 부분 업데이트라고 표현 - 부분 업데이트 현상은 테이블 데이터의 정합성을 맞추는데 상당히 어려운 문제를 만들어냄&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;트랜잭션은 어플리케이션 개발에서 고민해야할 문제를 줄여주는 아주 필수적인 DBMS의 기능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주의사항&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;트랜잭션 또한 DBMS의 커넥션과 동일하게 꼭 필요한 최소의 코드에만 적용하는것이 좋음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코드에서 트랜잭션의 범위를 최소화 하는것이 좋음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;718&quot; data-origin-height=&quot;124&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/YNlBt/btssiiMvN6j/Iwg3tq0z9M4nES6ObE0ce0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/YNlBt/btssiiMvN6j/Iwg3tq0z9M4nES6ObE0ce0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/YNlBt/btssiiMvN6j/Iwg3tq0z9M4nES6ObE0ce0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYNlBt%2FbtssiiMvN6j%2FIwg3tq0z9M4nES6ObE0ce0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;718&quot; height=&quot;124&quot; data-origin-width=&quot;718&quot; data-origin-height=&quot;124&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;739&quot; data-origin-height=&quot;280&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b0MNWB/btssgGmOMEt/WKKDqSGz8ROVk14WnPdODk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b0MNWB/btssgGmOMEt/WKKDqSGz8ROVk14WnPdODk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b0MNWB/btssgGmOMEt/WKKDqSGz8ROVk14WnPdODk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb0MNWB%2FbtssgGmOMEt%2FWKKDqSGz8ROVk14WnPdODk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;739&quot; height=&quot;280&quot; data-origin-width=&quot;739&quot; data-origin-height=&quot;280&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제 트랜잭션의 시작은 5번&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2,3,4 절차가 빨리 진행되도 트랜잭션에 포함 시킬 이유는 없음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;8번 메일전송이나 FTP 파일 전송작업, 네트워크를 통해 원격서버와 통신하는 작업은 트랜잭션에서 제외하는 것이 좋음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5,6번은 하나의 트랜잭션으로 묶고, 7번은 단순 조회 작업이므로 트랙잭션에 포함하지 않아도됨&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;712&quot; data-origin-height=&quot;431&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b8weW5/btssfy397UX/m6UnZWaqIIRpYXnM4DPF3k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b8weW5/btssfy397UX/m6UnZWaqIIRpYXnM4DPF3k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b8weW5/btssfy397UX/m6UnZWaqIIRpYXnM4DPF3k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb8weW5%2Fbtssfy397UX%2Fm6UnZWaqIIRpYXnM4DPF3k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;712&quot; height=&quot;431&quot; data-origin-width=&quot;712&quot; data-origin-height=&quot;431&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코드에서 데이터베이스 커넥션을 가지고 있는 범위와 트랜잭션이 활성화돼 있는 프로그램의 범위를 최소화 해야함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MySQL 엔진의 잠금&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스토리지 엔진 레벨 잠금&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MySQL 엔진 레벨 잠금 - 스토리지 엔지을 제외한 나머지 부분&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MySQL 엔진 레벨의 잠금은 모든 스토리지 엔진에 영향을 미치지만, 스토리지 엔진 레벨의 잠금은 상호간의 영향을 미치지 않음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;테이블 락 - 테이블 데이터 동기화&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메타데이터 락 - 테이블의 구조를 잠금&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;네임드 락 - 사용자의 필요에 맞게 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;글로벌 락&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;FLISH TABLES WITH READ LOCK 명령으로 획득&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;잠금 가운데 가장 범위가 큼&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;글로벌 락을 획득하면 다른 세션에서 SELECT를 제외한 대부분의 DDL문장이나 DML 문장을 실행하는 경우 글로벌 락이 해제 될 때까지 해당 문장이 대기상태로 남음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;영향을 미치는 범위는 MySQL 서버 전체&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;글로벌 락은 모든 테이브레 큰영향을 미치기 때문에 웹서비스용으로 사용되는 MySQL 서버에서는 가급적 사용하징 않는것이 좋음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;712&quot; data-origin-height=&quot;134&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cCtRtM/btssgF2wvFU/KbmJAYa9IYMm4RxhwuNY30/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cCtRtM/btssgF2wvFU/KbmJAYa9IYMm4RxhwuNY30/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cCtRtM/btssgF2wvFU/KbmJAYa9IYMm4RxhwuNY30/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcCtRtM%2FbtssgF2wvFU%2FKbmJAYa9IYMm4RxhwuNY30%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;712&quot; height=&quot;134&quot; data-origin-width=&quot;712&quot; data-origin-height=&quot;134&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특정 세션에서 백업 락을 획득하면 모든 세션에서 다음과 같이 테이블의 스키마나 상요자의 인증관련 정보를 변경할 수 없음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터베이스 및 테이블 등 모든 객체 생성 및 변경, 삭제&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;REPAIR TABLE과 OPTIMIZE 명령&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자 관리 및 비밀번호 변경&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;백업 락은 일반적인 테이블의 변경은 허용됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주로 백업은 레플리카 서버에서 실행됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MySQL 서버의 백업락은 정상적으로 복제는 실행되지만, 백업의 실패를 막기위해 DDL 명령이 실행되면 복제를 일시 중지하는 역할&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;테이블 락&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개별 테이블 단위로 설정되는 잠금&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LOCK TABLES table_name [READ|WRITE] 명령으로 특정 테이블의 락을 획득함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;명시적으로 획득한 잠금은 UNLOCK TABLES명령으로 잠금을 반납(해제)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;명시적인 테이블 락도 특별한 상황이 아니면 어플리케이션에서 사용할 일은 없음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;묵시적인 테이블 락은 MySQL, MEMORY 테이블에 데이터를 변경하는 쿼리를 실행하면 발생함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MySQL 서버가 데이터가 변경되는 테이블에 잠금을 설정하고 데이털르 변경한 후, 즉시 잠금을 해제하는 형태로 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;묵시적인 테이블 락은 쿼리가 실행되는 동안 자동으로 획득했다가 쿼리가완료된 후 자동 해제됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;InnoDB 테이블의 경우 스토리지 엔진 차원에서 레코드 기반의 잠금을 제공하기 때문에 단순데이터 변경 쿼리로 인해 묵시적인 테이블 락이 성정되지는 않음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;테이블락이 성정되지만, 대부분의 데이터 변경(DML) 워리에서는 무시되고 스키마를 변경하는 뭐리의 경우에만 영향을 미침&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;네임드 락&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GET_LOCK() 함수를 이용해 임의의 문자열에 대해 잠금을 설정 할 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;잠금의 특징은 대상이 테이블이나 레코드 또는 AUTO_INCREMENT와 같은 데이버베이스 객체가 아님&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자주 사용은 안됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메타데이터 락&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메타데이터 락은 데이터베이스 객체(테이블이나 뷰)의 이름이나 구조를 변경하는 경우에 획득하는 잠금&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RENAME TABLES tb_a TO tb_b 같이 테이블의 이름을 변경하는 경우 자동으로 획득하는 잠금&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실시간으로 테이블을 바꿔야 하는 요건이 배치 프로그램에서 자주 발생&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;721&quot; data-origin-height=&quot;87&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dxPQN5/btssf1SzRMV/gOXnHyK7vcKfsnXvkgCyHk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dxPQN5/btssf1SzRMV/gOXnHyK7vcKfsnXvkgCyHk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dxPQN5/btssf1SzRMV/gOXnHyK7vcKfsnXvkgCyHk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdxPQN5%2Fbtssf1SzRMV%2FgOXnHyK7vcKfsnXvkgCyHk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;721&quot; height=&quot;87&quot; data-origin-width=&quot;721&quot; data-origin-height=&quot;87&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RENAME TABLE 명령문에 두개의 RENAME 작업을 한꺼번에 실행하면 실제 어플리케이션에서 아주 짧지만 rank테이블이 없는 순간이 존재하여 에러 발생&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;710&quot; data-origin-height=&quot;154&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bAhVSu/btssilbp5oi/3w2fxJ1CA9L5PxFrxNoUKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bAhVSu/btssilbp5oi/3w2fxJ1CA9L5PxFrxNoUKK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bAhVSu/btssilbp5oi/3w2fxJ1CA9L5PxFrxNoUKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbAhVSu%2Fbtssilbp5oi%2F3w2fxJ1CA9L5PxFrxNoUKK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;710&quot; height=&quot;154&quot; data-origin-width=&quot;710&quot; data-origin-height=&quot;154&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;에러 발생없이 변경 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메타데이터 잠금과 InnoDB의 트랜잭션을 동시에 사용하는 경우&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;704&quot; data-origin-height=&quot;207&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c4KI9F/btssdavKmy1/QaDS3Ej3YdDh6OWtYgVRwk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c4KI9F/btssdavKmy1/QaDS3Ej3YdDh6OWtYgVRwk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c4KI9F/btssdavKmy1/QaDS3Ej3YdDh6OWtYgVRwk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc4KI9F%2FbtssdavKmy1%2FQaDS3Ej3YdDh6OWtYgVRwk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;704&quot; height=&quot;207&quot; data-origin-width=&quot;704&quot; data-origin-height=&quot;207&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;704&quot; data-origin-height=&quot;347&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Qb327/btssc9jkuKY/NgkVM79tkRuUrjJ7C27ZW1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Qb327/btssc9jkuKY/NgkVM79tkRuUrjJ7C27ZW1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Qb327/btssc9jkuKY/NgkVM79tkRuUrjJ7C27ZW1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQb327%2Fbtssc9jkuKY%2FNgkVM79tkRuUrjJ7C27ZW1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;704&quot; height=&quot;347&quot; data-origin-width=&quot;704&quot; data-origin-height=&quot;347&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;724&quot; data-origin-height=&quot;125&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bwDrVG/btssim2u1hq/scg5v4fqqjrtKnKdO0H7f0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bwDrVG/btssim2u1hq/scg5v4fqqjrtKnKdO0H7f0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bwDrVG/btssim2u1hq/scg5v4fqqjrtKnKdO0H7f0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbwDrVG%2Fbtssim2u1hq%2Fscg5v4fqqjrtKnKdO0H7f0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;724&quot; height=&quot;125&quot; data-origin-width=&quot;724&quot; data-origin-height=&quot;125&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;729&quot; data-origin-height=&quot;464&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nMoqO/btssfEi1jia/0w8nxnw6bj677V52QuSR4k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nMoqO/btssfEi1jia/0w8nxnw6bj677V52QuSR4k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nMoqO/btssfEi1jia/0w8nxnw6bj677V52QuSR4k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnMoqO%2FbtssfEi1jia%2F0w8nxnw6bj677V52QuSR4k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;729&quot; height=&quot;464&quot; data-origin-width=&quot;729&quot; data-origin-height=&quot;464&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;테이블의 구조를 변경해야하는 경우&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;온라인 DDL을 사용하면 단일 스레드로 작동하기 때문에 많은 시간이 소요됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;새로운 테이블을 생성하고 최근 데이터를 여러개의 스레드로 빠르게 복사하고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나머지 데이터는 트랜잭션과 테이블 잠금, RENAME 으로 프로그램 중단없이 실행&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;미리 데이터를 복사 해야 잠금시간을 최소화하여 서비스에 미치는 영향을 줄일 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <author>JIN_Coder</author>
      <guid isPermaLink="true">https://jin-coder.tistory.com/229</guid>
      <comments>https://jin-coder.tistory.com/entry/%EB%94%94%EB%B9%84%EC%8A%A4%ED%84%B0%EB%94%94#entry229comment</comments>
      <pubDate>Mon, 28 Aug 2023 00:07:54 +0900</pubDate>
    </item>
    <item>
      <title>디비 스터디</title>
      <link>https://jin-coder.tistory.com/entry/%EB%94%94%EB%B9%84-%EC%8A%A4%ED%84%B0%EB%94%94</link>
      <description>&lt;h1&gt;시진엽&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;공간 인덱스&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;R-Tree 인덱스 알고리즘을 잉요해 2차원의 데이터를 인덱싱하고 검색하는 목적의 인덱스&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;R-Tree는 인덱스를 구성하는 칼럼의 값이 2차원의 공간 개념 값&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;구조 및 특성&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;564&quot; data-origin-height=&quot;251&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/buE9L1/btsrB5OMwTP/XghlMHQ2wL6K9KWVWkkTJ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/buE9L1/btsrB5OMwTP/XghlMHQ2wL6K9KWVWkkTJ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/buE9L1/btsrB5OMwTP/XghlMHQ2wL6K9KWVWkkTJ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbuE9L1%2FbtsrB5OMwTP%2FXghlMHQ2wL6K9KWVWkkTJ1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;564&quot; height=&quot;251&quot; data-origin-width=&quot;564&quot; data-origin-height=&quot;251&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GEOMETRY 타입은 나머지 3개 타입의 슈퍼 타입으로 POINT와 LINE, POLYGON 객체를 모두 저장 가능함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MBR : 해당 도형을 감싸는 최소 크기의 사각형의 의미&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 사각형들의 포함 관계를 B-Tree형태로 구현한 인덱스가 R-Tree 인덱스&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;552&quot; data-origin-height=&quot;783&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Jih8h/btsrNByBeH6/AboCZKcOwtFsNBfQURGzSK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Jih8h/btsrNByBeH6/AboCZKcOwtFsNBfQURGzSK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Jih8h/btsrNByBeH6/AboCZKcOwtFsNBfQURGzSK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJih8h%2FbtsrNByBeH6%2FAboCZKcOwtFsNBfQURGzSK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;552&quot; height=&quot;783&quot; data-origin-width=&quot;552&quot; data-origin-height=&quot;783&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최하위 레벨의 MBR은 각 도형 데이터의 MBR을 의미&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최상위 레벨의 MBR은 중간 크기의 MBR&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최상위 MBR은 R-Tree의 루트 노드에 저장된 정보, 차상위 그룹 MBR은 R-Tree의 브랜치 노드, 마지막으로 각 도형의 객체는 리프 노드에 저장&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;778&quot; data-origin-height=&quot;550&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Lt5bd/btsrEzOUFvL/7N99tKpbLuS823IikoXrB1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Lt5bd/btsrEzOUFvL/7N99tKpbLuS823IikoXrB1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Lt5bd/btsrEzOUFvL/7N99tKpbLuS823IikoXrB1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLt5bd%2FbtsrEzOUFvL%2F7N99tKpbLuS823IikoXrB1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;778&quot; height=&quot;550&quot; data-origin-width=&quot;778&quot; data-origin-height=&quot;550&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;R-Tree 인덱스의 용도&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;R-Tree는 MBR 정보를 이용해 B-Tree형태로 인덱스를 구축, 공간인덱스&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일반적으로 GPS 기준의 위도, 경도 좌표 저장에 주로 사용됨&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;502&quot; data-origin-height=&quot;432&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/q1VN4/btsrNAzGvCc/ey7kMQguQXMxOE9QkgYQ4k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/q1VN4/btsrNAzGvCc/ey7kMQguQXMxOE9QkgYQ4k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/q1VN4/btsrNAzGvCc/ey7kMQguQXMxOE9QkgYQ4k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fq1VN4%2FbtsrNAzGvCc%2Fey7kMQguQXMxOE9QkgYQ4k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;502&quot; height=&quot;432&quot; data-origin-width=&quot;502&quot; data-origin-height=&quot;432&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;전문 검색 인덱스&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대표적으로 MySQL의 B-Tree인덱스는 실제 칼럼의 값이 1MB이더라도 1MB 전체의 값을 인덱스 키로 사용하는 것이 아니라 1000바이트 또는 3072바이트까지만 잘라서 인덱스 키로 사용함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전체 일치 또는 좌측 일부 일치와 같은 검색만 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문서의 내용 전체를 인덱스화 해서 특정 키워드가 포함된 문서를 검색하는 전문 검색에는 InnoDB나 MyISAM 스토리지 엔진에서 제공하는 일반적인 용도의 B-Tree인덱스를 사용할 수 없음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;인덱스 알고리즘&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전문 검색 인덱스는 문서의 키워드를 인덱싱하는 기법에 따라 크게 단어의 어근 분석과 n-gram분석 알고리즘으로 구분&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;불용어 처리 : 검색에서 별 가피가 없는 단어를 모두 필터링해서 제거하는 작업&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어근 분석 알고리즘 : 검색어로 선정된 단어의 뿌리인 원형을 찾는 작업&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한글이나 일본어는 어근 분석보다는 문자으이 형태소를 분석해서 명사랑 조사를 구분하는 기능이 더 중요한 편&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Mecab을 이용해 한글 분석 다만, MySQL에 적용은 쉽지만, 완성도 높히는 작업이 어려운편&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;n-gram 알고리즘&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MeCab을 위한 형태소 분석은 매우 전문적인 전문 검색 알고리즘이어서 리소스가 많이 필요함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 단점을 보완하기 위한 방법으로 n-gram 알고리즘 도입&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;형태소 분석이 문장을 이해하는 알고리즘, n-gram은 단순히 키워드를 검색해내기 위한 인덱싱 알고리즘&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;n-gram : 본문을 무조건 몇 글자씩 잘라서 인덱싱 하는 방법&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;n-gram의 n은 인덱싱 할 키워드의 최소 글자 수 의미&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일반적으로 2글자를 자르는 2-gram방식이 많이 사용&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;757&quot; data-origin-height=&quot;722&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cEhZDA/btsrBOs4jSJ/sQ3FEmJxnvnXzkPgCkK6W0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cEhZDA/btsrBOs4jSJ/sQ3FEmJxnvnXzkPgCkK6W0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cEhZDA/btsrBOs4jSJ/sQ3FEmJxnvnXzkPgCkK6W0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcEhZDA%2FbtsrBOs4jSJ%2FsQ3FEmJxnvnXzkPgCkK6W0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;757&quot; height=&quot;722&quot; data-origin-width=&quot;757&quot; data-origin-height=&quot;722&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;619&quot; data-origin-height=&quot;834&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cpi210/btsrAOtitqU/5lXnkJh5JTTDTtBKbmTuJk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cpi210/btsrAOtitqU/5lXnkJh5JTTDTtBKbmTuJk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cpi210/btsrAOtitqU/5lXnkJh5JTTDTtBKbmTuJk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcpi210%2FbtsrAOtitqU%2F5lXnkJh5JTTDTtBKbmTuJk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;619&quot; height=&quot;834&quot; data-origin-width=&quot;619&quot; data-origin-height=&quot;834&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;불용어 변경 및 삭제&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;n-gram의 토큰 파싱 및 불용어 처리예시로 at, io는 불용어로 등록돼어 있기 때문에 걸러짐&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;전문 검색 인덱스의 불용어 처리 무시&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스토리지 엔진에 관계없이 MySQL의 모든 전문 검색인덱스에 대해 불용어를 완전히 제거&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;innodb_ft_enable_stopword 시스템 변수를 off로 설정&lt;/p&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;SET GLOBAL innodb_ft_enable_stopword = OFF;
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MySQL 설정 파일(my.cnf)의 ft_stopword_file 시스템 변수에 빈 문자열을 설정&lt;/p&gt;
&lt;pre class=&quot;ini&quot;&gt;&lt;code&gt;ft_stopword_file = &quot;&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ft_stopword_file은 불용어 처리 무시도 하지만, 직접 등록도 가능함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;전문 검색 인덱스의 가용성&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전문 검색 인덱스를 사용하려면 2가지 조건 만족&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;쿼리 문장이 전문 검색을 위한 문법(MATCH &amp;hellip; AGAINST &amp;hellip;)을 사용&lt;/li&gt;
&lt;li&gt;테이블이 전문 검색 대상 칼럼에 대해서 전문 인덱스 보유&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;740&quot; data-origin-height=&quot;297&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bhRhVE/btsrDCE8e4k/er0DE3AdczF58PEdElxEWK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bhRhVE/btsrDCE8e4k/er0DE3AdczF58PEdElxEWK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bhRhVE/btsrDCE8e4k/er0DE3AdczF58PEdElxEWK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbhRhVE%2FbtsrDCE8e4k%2Fer0DE3AdczF58PEdElxEWK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;740&quot; height=&quot;297&quot; data-origin-width=&quot;740&quot; data-origin-height=&quot;297&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;함수 기반 인덱스&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일반적인 인덱스는 칼럼의 값 일부 또는 전체에 대해서만 인덱스 생성이 허용됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;칼럼의 값을 변형해서 만들어진 값에 대해서 인덱스 구축시 함수 기반 인덱스 혹은 가상 칼럼 이용한 인덱스 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가상 칼럼을 이용한 인덱스&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;함수 기반 인덱스&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;778&quot; data-origin-height=&quot;681&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Y1q5x/btsrEshWBX8/fq6RdAjhf90JGCmiqVNKeK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Y1q5x/btsrEshWBX8/fq6RdAjhf90JGCmiqVNKeK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Y1q5x/btsrEshWBX8/fq6RdAjhf90JGCmiqVNKeK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FY1q5x%2FbtsrEshWBX8%2Ffq6RdAjhf90JGCmiqVNKeK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;778&quot; height=&quot;681&quot; data-origin-width=&quot;778&quot; data-origin-height=&quot;681&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <author>JIN_Coder</author>
      <guid isPermaLink="true">https://jin-coder.tistory.com/228</guid>
      <comments>https://jin-coder.tistory.com/entry/%EB%94%94%EB%B9%84-%EC%8A%A4%ED%84%B0%EB%94%94#entry228comment</comments>
      <pubDate>Mon, 21 Aug 2023 04:10:54 +0900</pubDate>
    </item>
    <item>
      <title>디비스터디 8주차</title>
      <link>https://jin-coder.tistory.com/entry/%EB%94%94%EB%B9%84%EC%8A%A4%ED%84%B0%EB%94%94-8%EC%A3%BC%EC%B0%A8</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;디스크 읽기 방식&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터베이스의 성능 튜닝은 디스크 I/O를 줄이느냐가 관건&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하드디스크 드라이브 HDD / 솔리드 스테이트 드라이브 SSD&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SSD&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;플래시메모리 사용 -&amp;gt; 데이터를 빨리 읽고 쓸수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전원이 공급되지 않아도 데이터가 삭제되지 않음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HDD보다 랜덤 I/O 작업이 빠름&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DBMS용 스토리지에 최적화됨&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;668&quot; data-origin-height=&quot;373&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bwNXg4/btsplQNfhKU/KvrkHZSeu3VeKeLky5uMO0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bwNXg4/btsplQNfhKU/KvrkHZSeu3VeKeLky5uMO0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bwNXg4/btsplQNfhKU/KvrkHZSeu3VeKeLky5uMO0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbwNXg4%2FbtsplQNfhKU%2FKvrkHZSeu3VeKeLky5uMO0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;668&quot; height=&quot;373&quot; data-origin-width=&quot;668&quot; data-origin-height=&quot;373&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;랜덤 I/O 순차 I/O&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;순차 I/O는 3개의 페이지(3*16KB)를 디스크에 기록하기 위해 1번의 시스템 콜을 요청&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;랜덤 I/O는 3개의 페이지를 디스크에 기록하기 위해 3번 시스템 콜을 요청&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;순차 I/O는 랜덤 I/O 보다 3배 더 빠름&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;디스크의 성능은 시스템 콜을 줄이고 한번에 기록하느냐에 따라 결정 됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;램덤 I/O는 여러번 시스템 콜을 요청 하기 때문에 작업 부하가 더 큼&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사실 순차 I/O를 램덤 I/O로 변경하기는 쉽지 않기 때문에 램덤 I/O를 줄여주는 것이 쿼리 튜닝이라고 봄&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;풀테이블 스캔 : 순차 I/O&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인덱스 레인지 스캔 : 랜덤 I/O&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;702&quot; data-origin-height=&quot;682&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dC6Twc/btspg1hsCXi/Bf2bduIrmzsohTKkMEpqOK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dC6Twc/btspg1hsCXi/Bf2bduIrmzsohTKkMEpqOK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dC6Twc/btspg1hsCXi/Bf2bduIrmzsohTKkMEpqOK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdC6Twc%2Fbtspg1hsCXi%2FBf2bduIrmzsohTKkMEpqOK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;512&quot; height=&quot;497&quot; data-origin-width=&quot;702&quot; data-origin-height=&quot;682&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인덱스&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DBMS 는 칼럼 값과 해당 레코드가 저장된 주소를 키와 값의 쌍으로 삼아 인덱스를 만듦&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;칼럼값을 주어진 순서로 미리 정렬해서 보관함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SotedList ArrayList&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ArrayList는 테이터 파일과 같은 자료구조&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저장되는 순서 그대로 유지&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SotedList는 DBMS의 인덱스와 같은 자료구조&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저장되는 값을 항상 정렬된 상태로 유지&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터가 저장될 때 마다 값을 정렬해야하므로 저장하는 과정이 복잡하고 느리지만, 이미 정렬돼어 있어 읽기가 빠름&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;INSERT, UPDATE, DELETE 처리는 조금 느리지만, SELECT는 빨리 처리 가능함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인덱스는 데이터를 관리하는 방식(알고리즘)과 중복 값의 허용 여부 등에 따라 분류됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;역할별로 구분&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프라이머리 키, 보조키(세컨더리 키)로 구분&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;805&quot; data-origin-height=&quot;223&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dIOFzW/btspxrkJxLB/7XXAwxdBChk4166Zfq8FNK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dIOFzW/btspxrkJxLB/7XXAwxdBChk4166Zfq8FNK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dIOFzW/btspxrkJxLB/7XXAwxdBChk4166Zfq8FNK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdIOFzW%2FbtspxrkJxLB%2F7XXAwxdBChk4166Zfq8FNK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;805&quot; height=&quot;223&quot; data-origin-width=&quot;805&quot; data-origin-height=&quot;223&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터 저장 방식(알고리즘)으로 구분&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;B-Tree, Hash 구분&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;822&quot; data-origin-height=&quot;252&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cPHxOW/btspsFjh33J/uZ5BQa7Nrlj25DRZdwj43K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cPHxOW/btspsFjh33J/uZ5BQa7Nrlj25DRZdwj43K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cPHxOW/btspsFjh33J/uZ5BQa7Nrlj25DRZdwj43K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcPHxOW%2FbtspsFjh33J%2FuZ5BQa7Nrlj25DRZdwj43K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;822&quot; height=&quot;252&quot; data-origin-width=&quot;822&quot; data-origin-height=&quot;252&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터 중복 허용 여부 구분&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;유니크 인덱스, 유니크하지 않은 인덱스 구분&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;B-Tree 인덱스&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터 베이스의 인덱싱 알고리즘 가운데 가장 일반적으로 사용, 가장 먼저 도입된 알고리즘, 범용적인 목적으로 사용중&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DBMS는 B+-Tree, B-Tree를 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;B-Tree의 B는 Binary이진이 아닌 Balanced 임&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;B-Tree는 칼럼의 원래 값을 변형시키지 않고, 인덱스 구조체 내에서는 항상 정렬된 상태로 유지&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;B-Tree 구조 및 특성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최상위에 하나의 루트노드가 존재, 하위에 자식노드가 붙어있는 형태,&amp;nbsp;트리구조의 가장 하위에 있는 노드를 리프노드, 중간 노드를 브랜치 노드라고 함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터베이스에서 인덱스와 실제 데이터가 저장된 데이터는 따로 관리, 리프노드는 항상 실제 데이터 레코드를 찾아가기 위한 주솟값을 가지고 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인덱스의 키 값은 모두 정렬돼 있지만, 데이터 파일의 레코드는 정렬돼 있지 않고 임의의 순서로 저장되어 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;레코드가 삭제되어 빈공간이 생기면 그 다음의 INSERT 된 데이터는 빈공간을 재활용 하기 때문에 데이터가 INSERT 순으로 저장되지 않음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다만, InnoDB는 기본적으로 프라이머리 키 순서로 저장됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인덱스는 테이블의 키 칼럼만 가지고 있으므로 나머지 칼럼을 읽으려면 데이터 파일에서 해당 레코드를 찾음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리프노드는 데이터 파일에 저장된 레코드의 주소를 가짐&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;741&quot; data-origin-height=&quot;579&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ny1dX/btspsUHyylV/kbkK6gDdBHmv527PWhOQMK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ny1dX/btspsUHyylV/kbkK6gDdBHmv527PWhOQMK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ny1dX/btspsUHyylV/kbkK6gDdBHmv527PWhOQMK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fny1dX%2FbtspsUHyylV%2FkbkK6gDdBHmv527PWhOQMK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;741&quot; height=&quot;579&quot; data-origin-width=&quot;741&quot; data-origin-height=&quot;579&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;646&quot; data-origin-height=&quot;450&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dJbhjQ/btspkJODrVw/CJnzUM3WDPoaHR1FuAPrf0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dJbhjQ/btspkJODrVw/CJnzUM3WDPoaHR1FuAPrf0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dJbhjQ/btspkJODrVw/CJnzUM3WDPoaHR1FuAPrf0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdJbhjQ%2FbtspkJODrVw%2FCJnzUM3WDPoaHR1FuAPrf0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;646&quot; height=&quot;450&quot; data-origin-width=&quot;646&quot; data-origin-height=&quot;450&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;815&quot; data-origin-height=&quot;438&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cyuoDD/btspnjA749e/O0zsUjBbFUAy162kUAPlBK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cyuoDD/btspnjA749e/O0zsUjBbFUAy162kUAPlBK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cyuoDD/btspnjA749e/O0zsUjBbFUAy162kUAPlBK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcyuoDD%2FbtspnjA749e%2FO0zsUjBbFUAy162kUAPlBK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;815&quot; height=&quot;438&quot; data-origin-width=&quot;815&quot; data-origin-height=&quot;438&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;InnoDB은 프라이머리 키가 ROWID 역할을 함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프라이머리 키를 주소처럼 사용하기 때문에 논리적인 주소를 가짐&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;InnoDB는 인덱스를 통해 레코드를 읽을 때 바로 데이터 파일을 읽지 못함, 프라이머리 키에 저장된 레코드를 읽고 해당 레코드를 가지고 인덱스 키를 찾음&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;B-Tree 인덱스 키 추가 및 삭제&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;테이블의 레코드를 저장하거나 변경하는 경우 인덱스 키 추가나 삭제 작업이 발생함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인덱스 키 추가&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;새로운 값이 B-Tree에 저장될 때 테이블에 저장 될 때 즉시 인덱스에 저장될 수도, 그렇지 않을 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;B-Tree에 저장 될 때는 저장될 키 값을 이용해 B-Tree상의 적절한 위치를 검색함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저장될 위치가 결정되면 레코드의 키 값과 대상 레코드의 주소 정보를 B-Tree의 리프노드에 저장함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;B-Tree는 상대적으로 쓰기 작업에 비용이 많이 듬&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인덱스 키 삭제&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;B-Tree의 키 삭제는 간단함 해당 키 값이 저장된 B-Tree릐 리프 노드를 찾아 그냥 삭제 마크만 하면 작업 완료&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;삭제 마킹된 인덱스 키 공간은 방치하거나 재활용 할 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인덱스 키 변경&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인덱스의 키 값은 그 값에 따라 저장 될 리프 노드의 위치가 결정되므로 B-Tree의 키 값이 변경 되는 경우 먼저 키 값을 삭제 후 다시 새로운 키 값을 추가함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인덱스 키 검색&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인덱스 검색하는 작업은 B-Tree의 루트 노드부터 시작해 브랜치 노드를 거쳐 최종 리프 노드까지 이동하면서 비교 작업을 수행함 : 트리 탐색&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;B-Tree 인덱스를 이용한 검색은 100% 일치 또는 앞부분만 일치 하는경우 사용 가능, 부등호 비교 조건에서도 사용 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다만 인덱스를 구성하는 키 갚의 뒷부분은 사용 불가, 인덱스 키 값에 변형이 가해진 경우 사용 불가함(함수나 연산으로 변현된 값은 인덱스를 사용 할 수 없음)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;B-Tree 인덱스 사용에 영향을 미치는 요소&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인덱스를 구성하는 칼럼의 크기와 레코드의 건수, 유니크한 인덱스 키 값의 개수 등에 의해 검색이나 변경작업의 성능이 영향을 받음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인덱스 키 값의 크기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;디스크에 데이터를 저장하는 가장 기본 단위 : page, Block 디스크의 모든 읽기 쓰기 작업의 최소 단위&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인덱스는 페이지 단위로 관리되며, 루트, 브랜치, 리프노드를 구분한 기준이 페이지 단위임&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일반적으로 DBMS의 B-Tree는 자식 노드의 개수가 가변적인 구조&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자식 노드는 인덱스의 페이지 크기와 키 값의 크기에 다라 결정됨 기본은 16KB&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자식노드 주소는 여러가지 복합적인 정보가 담긴 영역&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;258&quot; data-origin-height=&quot;300&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WvQq6/btspkJODNAf/VSLvxaYT99l8hcv6DXqK20/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WvQq6/btspkJODNAf/VSLvxaYT99l8hcv6DXqK20/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WvQq6/btspkJODNAf/VSLvxaYT99l8hcv6DXqK20/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWvQq6%2FbtspkJODNAf%2FVSLvxaYT99l8hcv6DXqK20%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;258&quot; height=&quot;300&quot; data-origin-width=&quot;258&quot; data-origin-height=&quot;300&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하나의 인덱스 페이지(16KB)에는 16*1024/(16+12) 인 585개 저장 가능함(자식노드 585개를 가질 수 있는 B-Tree)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SELECT 쿼리가 레코드 500개를 읽는다면 인덱스 페이지 1번으로 해결 가능하지만, 1000개를 조회 한다면 2번 이상 디스크로부터 읽어야함&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인덱스를 구성하는 키의 크기가 커지만, 디스크로 부터 읽어야 할 수가 늘어나고 그만큼 느려짐&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;B-Tree의 깊이&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;B-Tree의 깊이는 MySQL에서 값을 검색할 때 몇번이나 랜덤하게 디스크를 읽어야하는지와 직결되는 문제&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인덱스 키 값의 크기가 커질 수록 하나의 인덱스 페이지에 담을 수 있는 인덱스 키 값의 개수가 적어지고, 같은 레코드 건수라도 B-Tree의 깊이가 깊어져서 디스크 읽기가 더 필요함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;B-Tree 깊이는 최대한 작을 수록 좋음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;선택도(기수성)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;선택도, 기수성 같은 의미로 사용됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인덱스 키 값 가운데 유니크한 값의 수를 의미&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex) 전체 인덱스 기 캆을 100개 인데 그중에서 유니크 키값이 10이라면 기수성은 10&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;중복된 값이 많아질수록 기수성은 낮아지고, 선택도는 떨어짐&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;선택도가 높을 수록 검색 대상이 줄어들기 때문에 그만큼 빨라짐&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;선택도가 좋지 않더라도 정렬이나 그루핑과 같은 작업을 위해 인덱스를 만드는것이 훨씬 나은 경우도 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인덱스에서 유니크한 값의 개수는 인덱스나 쿼리의 효율성에 큰 영향을 줌&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;809&quot; data-origin-height=&quot;225&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/biY6oH/btspxrrynKj/4Pqruqrhc1QGsHN2Xb2Tf0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/biY6oH/btspxrrynKj/4Pqruqrhc1QGsHN2Xb2Tf0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/biY6oH/btspxrrynKj/4Pqruqrhc1QGsHN2Xb2Tf0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbiY6oH%2FbtspxrrynKj%2F4Pqruqrhc1QGsHN2Xb2Tf0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;809&quot; height=&quot;225&quot; data-origin-width=&quot;809&quot; data-origin-height=&quot;225&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;785&quot; data-origin-height=&quot;579&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bVidov/btspg0JCWjr/YTo7C2wJumV4mWy2Yya0l1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bVidov/btspg0JCWjr/YTo7C2wJumV4mWy2Yya0l1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bVidov/btspg0JCWjr/YTo7C2wJumV4mWy2Yya0l1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbVidov%2Fbtspg0JCWjr%2FYTo7C2wJumV4mWy2Yya0l1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;785&quot; height=&quot;579&quot; data-origin-width=&quot;785&quot; data-origin-height=&quot;579&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;읽어야 하는 레코드의 건수&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인덱스를 통해 테이블의 레코드를 읽는 것은 인덱스를 거치지 않고 바로 테이블의 레코드를 읽는것보다 높은 비용이 듦&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;100만건 레코드 중 50만건을 읽을 때 전체 테이블 모두 읽고 50만건을 버릴지, 인덱스로 50만건만 읽을지 판단을 해야함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일반적인 DBMS의 옵티마이저는 인덱스를 통해 레코드 1건을 읽는 것은 직접 읽는 것보다 4~5배 비용이 듬&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인덱스를 통해 읽어야 할 레코드가 25% 이상일 경우 그냥 테이블 전체 조회를 하는것이 더 효율적임&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <author>JIN_Coder</author>
      <guid isPermaLink="true">https://jin-coder.tistory.com/227</guid>
      <comments>https://jin-coder.tistory.com/entry/%EB%94%94%EB%B9%84%EC%8A%A4%ED%84%B0%EB%94%94-8%EC%A3%BC%EC%B0%A8#entry227comment</comments>
      <pubDate>Mon, 31 Jul 2023 01:09:41 +0900</pubDate>
    </item>
    <item>
      <title>디비 스터디 7주차</title>
      <link>https://jin-coder.tistory.com/entry/%EB%94%94%EB%B9%84-%EC%8A%A4%ED%84%B0%EB%94%94-7%EC%A3%BC%EC%B0%A8</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;칼럼변경&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;테이블 구조 변경 작업은 대부분 칼럼을 추가하더나 칼럼 타입을 변경하는 작업&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ALTER TABLE 명령을 이용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;칼럼추가&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;INPLACE 알고리즘을 사용한 온라인 DDL 처리, 마지막 칼럼 추가는 INSTANT 알고리즘으로 바로 추가 가능&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;471&quot; data-origin-height=&quot;140&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qkZaL/btsoKYKrt49/1yYwg5YoKyXkQrsCPO5q61/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qkZaL/btsoKYKrt49/1yYwg5YoKyXkQrsCPO5q61/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qkZaL/btsoKYKrt49/1yYwg5YoKyXkQrsCPO5q61/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqkZaL%2FbtsoKYKrt49%2F1yYwg5YoKyXkQrsCPO5q61%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;471&quot; height=&quot;140&quot; data-origin-width=&quot;471&quot; data-origin-height=&quot;140&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;테이블이 큰 경우 칼럼을 마지막에 추가하는거시 좋음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;칼럼 삭제&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;칼럼을 삭제하는 과정은 항상 테이블 리빌드를 필요로 하기 때문에 INSTANT 알고리즘을 사용할 수 없음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;항상 INPLACE 알고리즘을 이용해 칼럼 삭제 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;칼럼 이름 및 칼럼 타입 변경&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;462&quot; data-origin-height=&quot;132&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cHxDHg/btsoGi3uDVt/MtkCkvdOYVEJYU9ifrRtSK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cHxDHg/btsoGi3uDVt/MtkCkvdOYVEJYU9ifrRtSK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cHxDHg/btsoGi3uDVt/MtkCkvdOYVEJYU9ifrRtSK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcHxDHg%2FbtsoGi3uDVt%2FMtkCkvdOYVEJYU9ifrRtSK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;546&quot; height=&quot;156&quot; data-origin-width=&quot;462&quot; data-origin-height=&quot;132&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;462&quot; data-origin-height=&quot;131&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bguc3Z/btsoxwI8tnd/lmbOF460cYSZhATJIdzUVK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bguc3Z/btsoxwI8tnd/lmbOF460cYSZhATJIdzUVK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bguc3Z/btsoxwI8tnd/lmbOF460cYSZhATJIdzUVK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbguc3Z%2FbtsoxwI8tnd%2FlmbOF460cYSZhATJIdzUVK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;529&quot; height=&quot;150&quot; data-origin-width=&quot;462&quot; data-origin-height=&quot;131&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;457&quot; data-origin-height=&quot;222&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/B4bu5/btsoEq8qtHg/kmlnlWg2s97gLHJMskyujk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/B4bu5/btsoEq8qtHg/kmlnlWg2s97gLHJMskyujk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/B4bu5/btsoEq8qtHg/kmlnlWg2s97gLHJMskyujk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FB4bu5%2FbtsoEq8qtHg%2FkmlnlWg2s97gLHJMskyujk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;576&quot; height=&quot;280&quot; data-origin-width=&quot;457&quot; data-origin-height=&quot;222&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;칼럼값의 저장용 공간은 칼럼의 값의 바이트 수가 255 이하인 경우 1바이트만 사용하고, 256 이상 사용시 2바이트를 사용함&lt;br /&gt;칼럼 최대값 변경시 1바이트 이하테이블 리빌드가 필요없지만, 1바이트에서 2바이트로 변경시 테이블 리빌드가 필요함&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인덱스 변경&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전문 검색 인덱스와 공간 검색 인덱스를 제외하면 나머지 인덱스는 모두 B-Tree 자료구조를 사용함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전문 검색 인덱스와 공간 검색 인덱스는 INPLACE 알고리즘으로 인덱스 생성이 가능하지만, SHARD잠금이 필요함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;B-Tree 자료구조를 사용하는 인덱스 추가는 잠금없이 온라인으로 인덱스 생성이 가능함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인덱스 조회&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SHOW INDEXES&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;테이블의 인덱스만 표시&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;칼럼별로 한줄씨 표시&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;450&quot; data-origin-height=&quot;209&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cvAwZF/btsoxWHvly9/AtO1kds1CYgG8kbnt1JjmK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cvAwZF/btsoxWHvly9/AtO1kds1CYgG8kbnt1JjmK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cvAwZF/btsoxWHvly9/AtO1kds1CYgG8kbnt1JjmK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcvAwZF%2FbtsoxWHvly9%2FAtO1kds1CYgG8kbnt1JjmK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;693&quot; height=&quot;322&quot; data-origin-width=&quot;450&quot; data-origin-height=&quot;209&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SHOW CREAT TABLE&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;테이블의 생성 구문을 그대로 보여줌&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인덱스 별로 한줄로 표시 하고, 인덱스에 어떤 칼럼이 어떤 순서로 있는지 파악하기 쉬움&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;462&quot; data-origin-height=&quot;199&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zVBg0/btsoyVg3TuI/kKKq0sCO7TqWeTVKHQb7Ok/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zVBg0/btsoyVg3TuI/kKKq0sCO7TqWeTVKHQb7Ok/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zVBg0/btsoyVg3TuI/kKKq0sCO7TqWeTVKHQb7Ok/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzVBg0%2FbtsoyVg3TuI%2FkKKq0sCO7TqWeTVKHQb7Ok%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;685&quot; height=&quot;295&quot; data-origin-width=&quot;462&quot; data-origin-height=&quot;199&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인덱스의 가시성 변경&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인덱스를 삭제하는 작업은 ALTER DRP INDEX 로 즉시 완료 되지만, 한번 삭제된 인덱스를 새로 생성하는 것은 매우 많은 시간이 걸릴 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인덱스를 삭제했는데 다시 적용할 수 있기 때문에 INVISBLE을 이용하여 인덱스를 ON OFF 하여 확인 후 삭제하는것도 좋은 방법&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;458&quot; data-origin-height=&quot;42&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bK0gPZ/btsoyW1jM7h/ojPnApy1XLNZUxtkQ1NpXk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bK0gPZ/btsoyW1jM7h/ojPnApy1XLNZUxtkQ1NpXk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bK0gPZ/btsoyW1jM7h/ojPnApy1XLNZUxtkQ1NpXk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbK0gPZ%2FbtsoyW1jM7h%2FojPnApy1XLNZUxtkQ1NpXk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;676&quot; height=&quot;62&quot; data-origin-width=&quot;458&quot; data-origin-height=&quot;42&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;345&quot; data-origin-height=&quot;84&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3nTdw/btsoxwWEYRH/HeINOYfnjUDzVYpcVOnvbK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3nTdw/btsoxwWEYRH/HeINOYfnjUDzVYpcVOnvbK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3nTdw/btsoxwWEYRH/HeINOYfnjUDzVYpcVOnvbK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3nTdw%2FbtsoxwWEYRH%2FHeINOYfnjUDzVYpcVOnvbK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;513&quot; height=&quot;84&quot; data-origin-width=&quot;345&quot; data-origin-height=&quot;84&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;373&quot; data-origin-height=&quot;237&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b1aRW2/btsoxV2YJvH/1yTKZtKc5Oy8lyukPVolyk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b1aRW2/btsoxV2YJvH/1yTKZtKc5Oy8lyukPVolyk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b1aRW2/btsoxV2YJvH/1yTKZtKc5Oy8lyukPVolyk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb1aRW2%2FbtsoxV2YJvH%2F1yTKZtKc5Oy8lyukPVolyk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;546&quot; height=&quot;237&quot; data-origin-width=&quot;373&quot; data-origin-height=&quot;237&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;근데 인덱스 차이로 왜 ROW 차이가 나는거임?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인덱스를 처음 생성 할 때는 INVISIBLE로 생성하고 부하가 낮은 시점에 VISIBLE로 변경해서 인덱스를 적용했다가&lt;br /&gt;서버에 부하가 생기면 다시 INVISIBLE로 변경해서 원인을 고민하는것도 좋음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인덱스 삭제&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ALTER TABLE ... DROP INDEX ... 명령으로 인덱스 삭제&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;테이블 변경 묶음 실행&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하나의 테이블에 대해 여러가지 스키마 변경을 하는 경우 개별 ALTER TABLE 명령을 치기도 하지만, 한번에 모아서 처리 할 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한번에 처리한다면 테이블의 레코드를 한번만 풀스캔하여 2개의 인덱스를 한꺼번에 생성 할 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;459&quot; data-origin-height=&quot;103&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cHHQUz/btsoEpIt1Hn/BecK2ZOkKaTB6tW6C0qRH0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cHHQUz/btsoEpIt1Hn/BecK2ZOkKaTB6tW6C0qRH0/img.png&quot; data-alt=&quot;하나씩 변경&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cHHQUz/btsoEpIt1Hn/BecK2ZOkKaTB6tW6C0qRH0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcHHQUz%2FbtsoEpIt1Hn%2FBecK2ZOkKaTB6tW6C0qRH0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;459&quot; height=&quot;103&quot; data-origin-width=&quot;459&quot; data-origin-height=&quot;103&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;하나씩 변경&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;455&quot; data-origin-height=&quot;84&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cHJY3r/btsoCGp7ImJ/TMLziKbwvYUsD2rI2zrI1k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cHJY3r/btsoCGp7ImJ/TMLziKbwvYUsD2rI2zrI1k/img.png&quot; data-alt=&quot;모아서 한번에 변경&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cHJY3r/btsoCGp7ImJ/TMLziKbwvYUsD2rI2zrI1k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcHJY3r%2FbtsoCGp7ImJ%2FTMLziKbwvYUsD2rI2zrI1k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;455&quot; height=&quot;84&quot; data-origin-width=&quot;455&quot; data-origin-height=&quot;84&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;모아서 한번에 변경&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로세스 조회 및 강제 종료&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SHOW PROCESSLIST&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버에 접속된 사용자의 목록이나 각 클라이언트 사용자가 현재 어떤 쿼리를 실행하고 있는지 알 수 있음&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;458&quot; data-origin-height=&quot;147&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c8A5cB/btsoxwvB6xn/Anr1EJuqsK2gRL3Ut7Dju0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c8A5cB/btsoxwvB6xn/Anr1EJuqsK2gRL3Ut7Dju0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c8A5cB/btsoxwvB6xn/Anr1EJuqsK2gRL3Ut7Dju0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc8A5cB%2FbtsoxwvB6xn%2FAnr1EJuqsK2gRL3Ut7Dju0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;458&quot; height=&quot;147&quot; data-origin-width=&quot;458&quot; data-origin-height=&quot;147&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대부분의 프로세스 Command 칼럼이 Sleep 상태 이겠지만, 오랜시간을 잡고 있는 쿼리가 있다면 확인할 필요가 있음&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;456&quot; data-origin-height=&quot;55&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c7Anvq/btsoGhQ5FqM/R8nGX5LRhmqRkzZiYtXvnK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c7Anvq/btsoGhQ5FqM/R8nGX5LRhmqRkzZiYtXvnK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c7Anvq/btsoGhQ5FqM/R8nGX5LRhmqRkzZiYtXvnK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc7Anvq%2FbtsoGhQ5FqM%2FR8nGX5LRhmqRkzZiYtXvnK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;456&quot; height=&quot;55&quot; data-origin-width=&quot;456&quot; data-origin-height=&quot;55&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;KILL QUERY 1 은 쿼리만 종료하고 커넥션은 남아있음&lt;br /&gt;KILL 1은 커넥션까지 종료시킴(트렌젝션이면 롤백함)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;활성 트랜젝션 조회&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;450&quot; data-origin-height=&quot;81&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0E1df/btsoyqPePcD/DaC174ZDWUkBlrleciVK30/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0E1df/btsoyqPePcD/DaC174ZDWUkBlrleciVK30/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0E1df/btsoyqPePcD/DaC174ZDWUkBlrleciVK30/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0E1df%2FbtsoyqPePcD%2FDaC174ZDWUkBlrleciVK30%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;450&quot; height=&quot;81&quot; data-origin-width=&quot;450&quot; data-origin-height=&quot;81&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;449&quot; data-origin-height=&quot;406&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wSSnb/btsoxcxplzV/Szq24kEyA5OM2oFVp0L97K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wSSnb/btsoxcxplzV/Szq24kEyA5OM2oFVp0L97K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wSSnb/btsoxcxplzV/Szq24kEyA5OM2oFVp0L97K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwSSnb%2FbtsoxcxplzV%2FSzq24kEyA5OM2oFVp0L97K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;449&quot; height=&quot;406&quot; data-origin-width=&quot;449&quot; data-origin-height=&quot;406&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;트랜젝션이 5초 이상 활성 상태로 남아있는 프로세스만 조사하는 쿼리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;170초 동안 트랜젝션이 유지 되는 중&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쿼리 성능 테스트&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쿼리 성능에 영향을 미치는 요소 -&amp;gt; 가장 큰 요소는 버퍼, 캐시&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;운영체제가 관리하는 캐시나 버퍼는 공용공간이기 때문에 MySQL 서버와 같은 프로그램이 종료된다고 해도 여전히 남을 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;캐시나 버퍼가 없는 상태에서 테스트를 하려면 운영체제의 캐시나 버퍼를 지우고 테스트를 진행해야 함&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;443&quot; data-origin-height=&quot;97&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bvUXk9/btsoxEHh0Th/ijm1OXgKuw03LkQR80GlX0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bvUXk9/btsoxEHh0Th/ijm1OXgKuw03LkQR80GlX0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bvUXk9/btsoxEHh0Th/ijm1OXgKuw03LkQR80GlX0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbvUXk9%2FbtsoxEHh0Th%2Fijm1OXgKuw03LkQR80GlX0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;443&quot; height=&quot;97&quot; data-origin-width=&quot;443&quot; data-origin-height=&quot;97&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;InnoDB 스토리지 엔진이 관리하는 캐시를 버퍼 풀이라고 하며, 인덱스 페이지, 데이터 페이지 까지 캐시하며, 쓰기 작업을 위한 버퍼링 작업까지 겸해서 처리함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MySQL 서버에 포함된 키 캐시나 버퍼 풀을 초기화 하려면 MySQL 서버를 재시작 해야함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <author>JIN_Coder</author>
      <guid isPermaLink="true">https://jin-coder.tistory.com/226</guid>
      <comments>https://jin-coder.tistory.com/entry/%EB%94%94%EB%B9%84-%EC%8A%A4%ED%84%B0%EB%94%94-7%EC%A3%BC%EC%B0%A8#entry226comment</comments>
      <pubDate>Mon, 24 Jul 2023 03:44:49 +0900</pubDate>
    </item>
    <item>
      <title>디비스터디6주차</title>
      <link>https://jin-coder.tistory.com/entry/%EB%94%94%EB%B9%84%EC%8A%A4%ED%84%B0%EB%94%946%EC%A3%BC%EC%B0%A8</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;스키마조작(DDL)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DDL(Data Definition Language) = DBMS 서버의 모든 오브젝트를 생성하거나 변경하는 쿼리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex) 스토어드 프로시저나 함수, DB, 테이블 등을 생성하거나 변경하는 대부분의 명령&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스키마를 변경하는 작업중에는 상당히 로랜시간이 걸리고 MySQL 서버에 많은 부하가 발생하기 때문에 주의 해야함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;온라인 DDL&lt;br /&gt;MySQL 5.5 이전 버전은 테이블의 구조가 변경되는 동안 커넥션 연결이 어려웠지만, 온라인 DDL 기능으로 스키마 변경을 하면서 커넥션 연결이 가능해짐&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ALGORITHM, LOCK 옵션을 통해 어떤 모드로 스키마를 변경할 지 선택 가능&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;457&quot; data-origin-height=&quot;93&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WzlQl/btsnOeHCVvV/W1SPNewFUTGc5zCbMbgTu1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WzlQl/btsnOeHCVvV/W1SPNewFUTGc5zCbMbgTu1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WzlQl/btsnOeHCVvV/W1SPNewFUTGc5zCbMbgTu1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWzlQl%2FbtsnOeHCVvV%2FW1SPNewFUTGc5zCbMbgTu1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;457&quot; height=&quot;93&quot; data-origin-width=&quot;457&quot; data-origin-height=&quot;93&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스키마 변경 알고리즘의 우선순위가 낮을수록 MySQL 서버는 스키마 변경을 위해서 더큰 잠금과 많은 작업을 필요로 하고, 부하가 발생함&lt;br /&gt;&lt;br /&gt;INSTANT : 테이블의 데이터는 전혀 변경하지 않고, 메타 데이터만 변경하고 작업을 완료함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;테이블이 가진 데이터 양과 무관하게 짧은 시간 소요&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스키마 변경 도중 읽고 쓰기는 대기(시간이 짧아서 괜찮음)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LOCK 옵션 명시 할 수 없음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;INPLACE : 임시테이블로 데이터를 복사하지 않고 스키마 변경을 수행함, 다만, 내부적으로 테이블 리빌드를 실행함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;레코드 복사 작업은 없지만, 리빌드를 해야하기 때문에 테이블의 크기에 따라 시간 소요가 달라짐&lt;br /&gt;스키마 변경 중에도 읽고 쓰기가 가능함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;COPY : 변경된 스키말르 적용한 임시테이블이 생성되고, 테이블의 레코드를 모두 임시 테이블로 복사 후 최종적으로 임시 테이블을 RENAME해서 스키마 변경을 완료함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;읽기만 가능함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;ALGORITHM, LOCK&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;옵션이 명시되지 않으면, 서버가 적정한 수준의 알고리즘과 잠금 수준을 선택함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;INPLACE,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;COPY&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;는 3가지 LOCK 옵션을 명시 함&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;462&quot; data-origin-height=&quot;94&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cG7lyE/btsnFeoUwts/qSVOicNXv5K34sjTpQKU50/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cG7lyE/btsnFeoUwts/qSVOicNXv5K34sjTpQKU50/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cG7lyE/btsnFeoUwts/qSVOicNXv5K34sjTpQKU50/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcG7lyE%2FbtsnFeoUwts%2FqSVOicNXv5K34sjTpQKU50%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;462&quot; height=&quot;94&quot; data-origin-width=&quot;462&quot; data-origin-height=&quot;94&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ALTER TABLE 문장에&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;ALGORITHM, LOCK&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;절을 명시해서 온라인 스키마 변경의 처리 알고리즘을 강제 할 수 있음&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;온라인 DDL의 실패 케이스&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;- ALTER TABLE 명령이 장시간 실행되고, 동시에 다른 커넥션에서 DML이 많이 실행되는 경우, 온라인 변경 로그의 공간이 부족한 경우&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;- ALTER TABLE 명령이 실행되는 동안 ALTER TABLE 이전의 테이블 구조에서는 문제가 없었지만, 이후 테이블 구조에서 적합하지 않은 레코드가 INSERT, UPDATE 될 경우&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;- 스키마 변경을 위해서 필요한 잠금 수준보다 낮은 잠금 옵션이 사용된 경우&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;- 온라인 스키마 변경은 LOCT=NONE으로 실행된더라도 변경 작업의 처음과 마지막 과정에서 잠금이 필요한데, 잠금을 획득하지 못하고 타임아웃이 난 경우&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;- 디스크의 임시 디렉터리를 사용 할 때 공간이 부족한 경우&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;온라인 DDL 진행상황 모니터링&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;performance_schema 를 통해 진행상황을 모니터링 가능&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;데이터베이스 변경&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MySQL에서 하나의 인스턴스는 1개 이상의 데이터베이스를 가질 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RDBMS는 스키마, 데이터베이스를 분리해서 관리&lt;br /&gt;MySQL은 스키마, 데이터베이스가 동격(굳이 스키마를 명시하지 않음)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1689525288359&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#데이터베이스 생성
CREATE DATABASE employees;

#데이터베이스 목록
SHOW DATABASE;

#데이터베이스 선택
USE employees;

#데이터베이스 삭제
DROP DATAVASE employees;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;테이블 스페이스 변경&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;MySQL 서버는 테이블 별로 전용의 테이블스페이스를 사용했음&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;InnoDB 스토리지 엔진 시스템 테이블 스페이스만 제너럴 테이블 스페이스를 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제너럴 테이블스페이스는 여러테이블의 데이터를 한꺼번에 저장하는 테이블스페이스를 의미&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;8.0부터 사용자 테이블을 제너럴 테이블스페이스로 저장하는 기능이 추가됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 제너럴 테이블스페이스를 사용하면 파일 핸들러를 최소화&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 테이블 스페이스 관리에 필요한 메모리 공간을 최소화&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제너럴 테이블스페이스는 테이블의 갯수가 많은 경우 유용함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;테이블 생성&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;449&quot; data-origin-height=&quot;273&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pst14/btsnSZDs5Pu/QFbc7UPU8lxGH1O6hVobf0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pst14/btsnSZDs5Pu/QFbc7UPU8lxGH1O6hVobf0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pst14/btsnSZDs5Pu/QFbc7UPU8lxGH1O6hVobf0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fpst14%2FbtsnSZDs5Pu%2FQFbc7UPU8lxGH1O6hVobf0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;515&quot; height=&quot;313&quot; data-origin-width=&quot;449&quot; data-origin-height=&quot;273&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;각 컬럼은 칼럼명 + 칼럼타입 + [타입별옵션] + [NULL 여부] + [기본값] 순서로 명시&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;459&quot; data-origin-height=&quot;255&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bWOV8H/btsnILMOHUS/gbImWFkKv4nQ9mwOwbGuik/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bWOV8H/btsnILMOHUS/gbImWFkKv4nQ9mwOwbGuik/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bWOV8H/btsnILMOHUS/gbImWFkKv4nQ9mwOwbGuik/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbWOV8H%2FbtsnILMOHUS%2FgbImWFkKv4nQ9mwOwbGuik%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;511&quot; height=&quot;284&quot; data-origin-width=&quot;459&quot; data-origin-height=&quot;255&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;테이블 구조 조회&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;SHOW CREATE TABLE, DESC&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SHOW CREATE TABLE 사용히 테이블의 CREATE TABLE 문장을 표시(최초 명령X, 메타데이터 읽어서 재 작성)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;칼럼의 목록과 인덱스, 외래키 정보를 동시에 보여주기 때문에 SQL을 튜닝하거나 테이블의 구조를 확인 할때 사용&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;471&quot; data-origin-height=&quot;265&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cOjDHA/btsnOr1kAu2/ffftPOMF5sslQnQ5adW731/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cOjDHA/btsnOr1kAu2/ffftPOMF5sslQnQ5adW731/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cOjDHA/btsnOr1kAu2/ffftPOMF5sslQnQ5adW731/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcOjDHA%2FbtsnOr1kAu2%2FffftPOMF5sslQnQ5adW731%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;524&quot; height=&quot;295&quot; data-origin-width=&quot;471&quot; data-origin-height=&quot;265&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DESC&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;DESCRIBE 약어 테이블의 칼럼 정보를 표의 형태로 보여줌&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;인덱스 칼럼의 순서나 외래키, 테이블 자체의 속성은 보여주지 않음&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;465&quot; data-origin-height=&quot;204&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bcl0Qi/btsnTDNRcBE/3Zx8Z7n3Myh998ATXR5pMk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bcl0Qi/btsnTDNRcBE/3Zx8Z7n3Myh998ATXR5pMk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bcl0Qi/btsnTDNRcBE/3Zx8Z7n3Myh998ATXR5pMk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbcl0Qi%2FbtsnTDNRcBE%2F3Zx8Z7n3Myh998ATXR5pMk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;536&quot; height=&quot;235&quot; data-origin-width=&quot;465&quot; data-origin-height=&quot;204&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;테이블 구조 변경&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ALTER TABLE 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;테이블 자체의 속성을 변경, 인덱스, 칼럼 추가 삭제 용도로 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;테이블 리빌드 작업은 주로 레코드의 삭제가 자주 발생하는 테이블에서 데이터가 저장되지 않는 빈공간을 제거해 디스크 사용 공간을 줄이는 작업&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;OPTIMIZE TABLE : 테이블이 사용하는 디스크 공간의 프래그멘테이션을 최소화 하고, 테이블의 구조를 최적화 함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;테이블 명 변경&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RENAME TABLE 사용&lt;br /&gt;테이블 이름 변경 뿐만 아니라, 다른 데이터베이스로 테이블을 이동할 때도 사용&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RENAME TABLE db1table1 TO db2.tabel2&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;테이블 상태 조회&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SHOW TABLE STATUS employees&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;463&quot; data-origin-height=&quot;356&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/l6EMI/btsnLuKOGUn/oKhRDTZ90rK4bZfVktJRAK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/l6EMI/btsnLuKOGUn/oKhRDTZ90rK4bZfVktJRAK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/l6EMI/btsnLuKOGUn/oKhRDTZ90rK4bZfVktJRAK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fl6EMI%2FbtsnLuKOGUn%2FoKhRDTZ90rK4bZfVktJRAK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;576&quot; height=&quot;443&quot; data-origin-width=&quot;463&quot; data-origin-height=&quot;356&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;테이블 구조 복사&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CREATE TABLE temp_employees LIKE employees&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구조가 같은 테이블 복사하여 생성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;INSERT INTO tempemployees SELECT * FROM employees&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터까지 복사&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;테이블 삭제&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DROP TABLE table&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;레코드가 적은 테이블 삭제는 서비스 도중 실행해도 괜찮음&lt;br /&gt;다만, 양이 많은 테이블 삭제시 MySQL 서버에 부하가 증가하여 다른 커넥션 쿼리 속도에 영향을 줄 수 있음(서비스 도중엔 조심히 사용)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <author>JIN_Coder</author>
      <guid isPermaLink="true">https://jin-coder.tistory.com/225</guid>
      <comments>https://jin-coder.tistory.com/entry/%EB%94%94%EB%B9%84%EC%8A%A4%ED%84%B0%EB%94%946%EC%A3%BC%EC%B0%A8#entry225comment</comments>
      <pubDate>Mon, 17 Jul 2023 01:38:45 +0900</pubDate>
    </item>
    <item>
      <title>디비 스터디 5주차</title>
      <link>https://jin-coder.tistory.com/entry/%EB%94%94%EB%B9%84-%EC%8A%A4%ED%84%B0%EB%94%94-4%EC%A3%BC%EC%B0%A8-1</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;INSERT&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;INSERT 문장이 동시에 실행되는 경우 INSERT 문장 자체보다는 테이블의 구조가 서능에 더큰 영향을 미침&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;INSERT와 SELECT의 성능을 동시에 빠르게 만들 수 있는 테이블 구조는 없음(타협해야함)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;고급옵션&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;INSERT IGNORE&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;INSERT ON DUPLICATE KEY UPDATE&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;유니크 인덱스나 프라이머리 키에 대해 중복 레코드를 어떻게 처리할지를 결정함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;INSERT IGNORE&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;유니크 인데스나 프라이머리 키가 중복으로 존재하는 경우, 레코드의 칼럼과 테이블의 칼럼이 서로 호환이 되지 않는 경우 모두 무시하고 다음 레코드를 처리 할 수 있게 해줌&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여러 레코드를 하나의 INSERT 문장으로 처리하는 경우 유용함&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1244&quot; data-origin-height=&quot;485&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LCDIo/btsmheostD7/RMR9nX2uubd53fRFEbi3A0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LCDIo/btsmheostD7/RMR9nX2uubd53fRFEbi3A0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LCDIo/btsmheostD7/RMR9nX2uubd53fRFEbi3A0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLCDIo%2FbtsmheostD7%2FRMR9nX2uubd53fRFEbi3A0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1244&quot; height=&quot;485&quot; data-origin-width=&quot;1244&quot; data-origin-height=&quot;485&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;salaries 테이블의 프라이머리 키 : emp_no, from_date&lt;br /&gt;중복 레코드가 있으면 에러 발생&lt;br /&gt;하지만, IGNORE 옵션이 있다면 에러를 경고로 바꾸고 INSERT 진행함(무시함)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;중복 데이터 뿐만아니라, 테이터 타입이 일치 하지 않을 경우 칼럼의 기본값이 들어감&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1243&quot; data-origin-height=&quot;435&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/btQ6dm/btsl2osIVSP/NEuZvhFibT37VInNC0UuF0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/btQ6dm/btsl2osIVSP/NEuZvhFibT37VInNC0UuF0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/btQ6dm/btsl2osIVSP/NEuZvhFibT37VInNC0UuF0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbtQ6dm%2Fbtsl2osIVSP%2FNEuZvhFibT37VInNC0UuF0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1243&quot; height=&quot;435&quot; data-origin-width=&quot;1243&quot; data-origin-height=&quot;435&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1227&quot; data-origin-height=&quot;280&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bnKgnD/btsl3h1hgAu/Nh7qPl4XbeDncwOrk8kgTk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bnKgnD/btsl3h1hgAu/Nh7qPl4XbeDncwOrk8kgTk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bnKgnD/btsl3h1hgAu/Nh7qPl4XbeDncwOrk8kgTk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbnKgnD%2Fbtsl3h1hgAu%2FNh7qPl4XbeDncwOrk8kgTk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1227&quot; height=&quot;280&quot; data-origin-width=&quot;1227&quot; data-origin-height=&quot;280&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;함부로 쓰다간 의도치 않은 에러도 무시하고 INSERT 하기 때문에 주의해야함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;INSERT ON DUPLICATE KEY UPDATE&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;IGNORE은 무시하고 인서트를 진행했지만, ON DUPLICATE KEY UPDATE는 중복이 발생하면 UPDATE 문장의 역할을 수행함&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1258&quot; data-origin-height=&quot;166&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eiD4sv/btsl5iMq05i/SwHdVhizlTIf5uC4Kl5aOk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eiD4sv/btsl5iMq05i/SwHdVhizlTIf5uC4Kl5aOk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eiD4sv/btsl5iMq05i/SwHdVhizlTIf5uC4Kl5aOk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeiD4sv%2Fbtsl5iMq05i%2FSwHdVhizlTIf5uC4Kl5aOk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1258&quot; height=&quot;166&quot; data-origin-width=&quot;1258&quot; data-origin-height=&quot;166&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;daily_statistic의 프라이머리 키 : target_date, stat_name&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특정 날짜의 stat_name이 최초 저장되는 경우엔 INSERT 문이 실행되고, ON DUPLICATE KEY UPDATE 이하의 절은 실행안됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이미 레코드가 존재한다면, ON DUPLICATE KEY UPDATE 이하의 절이 실행됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LOAD DATA 명령 주의 사항&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LOAD DATA&amp;nbsp;: RDBMS에서 데이터를 빠르게 적재 할 수 있는 방법&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MYSQL엔진과 스토리지 엔진의 호출횟수를 최소화 하고, 스토리지 엔진이 직접 데이터를 적재하기 때문에 일반적인 INSERT문보다 빠름&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단점&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단일 스레드로 실행 - 적재할 데이터 파일이 크다면 시간이 오래걸림&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단일 트랜잭션으로 실행 - 언두 로그가 삭제되지 못하고 유지되어야 함(레코드를 찾는데 많은 오버헤드 발생)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LOAD DATA 문장으로 데이터 파일을 하나 말고 여러개로 준비해서 실행하는것이 좋음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;테이블 복사 작업이라면, LOAD DATA보다 INSERT SELECT 를 사용해서 필요 데이터를 INSERT하는것이 좋음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;성능을 위한 테이블 구조&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;INSERT의 성능은 쿼리 문장 보다 테이블의 구조에 의해 결정됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대량 INSERT 성능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;INSERT될 레코드들을 프라이머리 키 값 기준으로 미리 정렬해서 INSERT 문장을 구성하는것이 성능에 도움이 될 수 있음&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;819&quot; data-origin-height=&quot;141&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cxCysN/btsmhf1YNIZ/wrGWRejGWm1o3qGFU4dlV1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cxCysN/btsmhf1YNIZ/wrGWRejGWm1o3qGFU4dlV1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cxCysN/btsmhf1YNIZ/wrGWRejGWm1o3qGFU4dlV1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcxCysN%2Fbtsmhf1YNIZ%2FwrGWRejGWm1o3qGFU4dlV1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;819&quot; height=&quot;141&quot; data-origin-width=&quot;819&quot; data-origin-height=&quot;141&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프라이머리 키로 정렬된 경우 시간이 반으로 줄어듦&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정렬이 안되면 랜덤 프라이머리 키 값을 B-tree 방식으로 메모리를 읽어서 INSERT 하기 때문에 오래걸림&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;테이블의 세컨더리 인덱스는 SELECT 문의 성능은 높히지만, INSERT 문의 성능은 떨어짐&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;백그라운드 작업의 부하를 유발하기 때문에&amp;nbsp;세컨더리 인덱스를 남용하면 성능상 안좋음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프라이머리 키 선정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;InnoDB 스토리지 엔진을 사용하는 테이블의 프라이머리 키는 클러스터링 키인데,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이는 세컨더리 인덱스를 이용하는 쿼리보다 프라이머리 키를 이용하는 쿼리의 성능이 훨씬 빨라지는 효과를 냄&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프라이머리 키는 INSERT, SELECT 성능에 대립되기 때문에 두가지 모두 만족하는 경우는 드물다고 함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SELECT는 거의 안하고 INSERT가 많은 테이블은 프라이머리 키를 단조증가,감소하는 패턴으로 설계함(주로 로그)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인덱스로 줄여주면 좋음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반대의 경우 인덱스를 걸어서 SELECT 잘되게 해도 큰 영향은 없음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;*소량의 테이블 구조 및 쿼리에 투자 할 시간에 대용량(메인) 테이블 구조 및 쿼리에 시간을 쓰는게 현명함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <author>JIN_Coder</author>
      <guid isPermaLink="true">https://jin-coder.tistory.com/224</guid>
      <comments>https://jin-coder.tistory.com/entry/%EB%94%94%EB%B9%84-%EC%8A%A4%ED%84%B0%EB%94%94-4%EC%A3%BC%EC%B0%A8-1#entry224comment</comments>
      <pubDate>Mon, 3 Jul 2023 02:57:51 +0900</pubDate>
    </item>
  </channel>
</rss>