<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>DBA 개미</title>
    <link>https://dbaant.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Wed, 10 Jun 2026 22:30:11 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>Ant_U</managingEditor>
    <image>
      <title>DBA 개미</title>
      <url>https://tistory1.daumcdn.net/tistory/5811492/attach/2eb98dc4b27947ee8b88a2a7b4bb0a39</url>
      <link>https://dbaant.tistory.com</link>
    </image>
    <item>
      <title>[MySQL] BETWEEN 연산자 가이드: 범위 검색의 효율성과 주의사항</title>
      <link>https://dbaant.tistory.com/275</link>
      <description>&lt;p data-path-to-node=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-path-to-node=&quot;3&quot; data-ke-size=&quot;size26&quot;&gt;도입: 범위 검색의 표준, BETWEEN 연산자&lt;/h2&gt;
&lt;p data-path-to-node=&quot;4&quot; data-ke-size=&quot;size16&quot;&gt;데이터베이스 관리 과정에서 특정 범위 내의 데이터를 추출하는 작업은 매우 빈번하게 발생합니다. 매출액이 일정 금액 사이인 주문을 찾거나, 특정 기간 동안 발생한 로그를 조회하는 것이 대표적인 예입니다. MySQL에서 이러한 작업을 수행할 때 가장 먼저 떠오르는 도구가 바로 BETWEEN 연산자입니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;5&quot; data-ke-size=&quot;size16&quot;&gt;BETWEEN 연산자는 쿼리의 가독성을 높여주지만, 동작 원리를 정확히 이해하지 못하면 예상치 못한 결과나 성능 저하를 초래할 수 있습니다. 특히 데이터 타입에 따른 처리 방식과 MySQL 버전별 최적화 차이를 아는 것은 숙련된 개발자로 성장하기 위한 필수 과정입니다. 본 포스팅에서는 BETWEEN 연산자의 기초부터 실무 적용 시 주의해야 할 깊이 있는 내용까지 다루어 보겠습니다.&lt;/p&gt;
&lt;hr data-path-to-node=&quot;6&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-path-to-node=&quot;7&quot; data-ke-size=&quot;size26&quot;&gt;1. BETWEEN의 기본 개념과 포함 관계 (Inclusivity)&lt;/h2&gt;
&lt;p data-path-to-node=&quot;8&quot; data-ke-size=&quot;size16&quot;&gt;BETWEEN 연산자는 지정된 두 값 사이에 있는 데이터를 필터링하는 데 사용됩니다. 구문론적으로는 가독성이 뛰어나며, 내부적으로는 크거나 같음(&amp;gt;=)과 작거나 같음(&amp;lt;=) 조건이 AND로 결합된 것과 동일하게 동작합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1772157517813&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT column_name FROM table_name WHERE column_name BETWEEN value1 AND value2;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-path-to-node=&quot;10&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;10&quot; data-ke-size=&quot;size16&quot;&gt;여기서 가장 중요한 사실은 BETWEEN이 양 끝의 경계값을 포함하는 폐구간(Closed Interval)이라는 점입니다. 예를 들어 BETWEEN 1 AND 10이라는 조건을 사용하면, 1과 10인 레코드도 결과에 포함됩니다. 주니어 개발자들이 흔히 하는 실수 중 하나가 경계값을 제외해야 하는 상황에서도 습관적으로 BETWEEN을 사용하는 것입니다. 만약 경계값을 제외해야 한다면 비교 연산자인 &amp;gt;와 &amp;lt;를 명시적으로 사용하는 것이 정확합니다.&lt;/p&gt;
&lt;hr data-path-to-node=&quot;11&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-path-to-node=&quot;12&quot; data-ke-size=&quot;size26&quot;&gt;2. 데이터 타입별 동작 특징과 날짜 데이터의 함정&lt;/h2&gt;
&lt;p data-path-to-node=&quot;13&quot; data-ke-size=&quot;size16&quot;&gt;BETWEEN 연산자는 숫자뿐만 아니라 문자열, 날짜 타입에도 사용할 수 있지만 각각 주의사항이 다릅니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;14&quot; data-ke-size=&quot;size16&quot;&gt;숫자형 데이터 가장 직관적으로 동작합니다. 정수나 실수 범위 내의 값을 정확히 비교하며 인덱스 효율도 매우 높습니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;15&quot; data-ke-size=&quot;size16&quot;&gt;문자형 데이터 문자열에 BETWEEN을 사용하면 해당 컬럼의 콜레이션(Collation)에 따라 사전식 순서(Lexicographical Order)로 비교됩니다. 예를 들어 'A'와 'C' 사이를 검색하면 'B'로 시작하는 문자열은 포함되지만, 대소문자 구분 여부는 데이터베이스 설정에 따라 달라질 수 있으므로 주의가 필요합니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;16&quot; data-ke-size=&quot;size16&quot;&gt;날짜 및 시간 데이터 (DATETIME) 이 부분은 시니어 개발자들도 종종 실수하는 지점입니다. DATE 타입에서는 큰 문제가 없으나, 시간 정보가 포함된 DATETIME이나 TIMESTAMP 타입을 다룰 때는 매우 신중해야 합니다. 예를 들어 BETWEEN '2026-02-01' AND '2026-02-02'라고 쿼리를 작성하면, MySQL은 두 번째 날짜를 '2026-02-02 00:00:00'으로 해석합니다. 결과적으로 2월 2일 오전 10시에 발생한 데이터는 결과에서 누락됩니다. 2월 2일의 모든 데이터를 포함하려면 '2026-02-02 23:59:59'와 같이 시간을 명시하거나, BETWEEN 대신 &amp;gt;= '2026-02-01' AND &amp;lt; '2026-02-03'과 같은 방식의 비교 연산자를 사용하는 것이 더 안전합니다.&lt;/p&gt;
&lt;hr data-path-to-node=&quot;17&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-path-to-node=&quot;18&quot; data-ke-size=&quot;size26&quot;&gt;3. 인덱스 최적화와 MySQL 버전별 변화&lt;/h2&gt;
&lt;p data-path-to-node=&quot;19&quot; data-ke-size=&quot;size16&quot;&gt;MySQL 엔진이 발전함에 따라 BETWEEN과 같은 범위 조건 쿼리를 처리하는 방식도 개선되었습니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;20&quot; data-ke-size=&quot;size16&quot;&gt;인덱스 활용과 범위 최적화 도구 (Range Optimizer) BETWEEN 조건이 걸린 컬럼에 인덱스가 있다면, MySQL의 범위 최적화 도구는 인덱스 트리 내에서 시작점과 끝점을 빠르게 찾아 스캔합니다. 이는 전체 테이블을 읽는 것보다 훨씬 효율적입니다. MySQL 8.0 이상에서는 이러한 범위 스캔 성능이 더욱 강화되었으며, 특히 다중 컬럼 인덱스(Composite Index)에서 범위 조건 뒤에 오는 컬럼들의 활용도가 이전 버전보다 개선되었습니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;21&quot; data-ke-size=&quot;size16&quot;&gt;암시적 형변환(Implicit Casting) 방지 MySQL 5.7 이전 버전이나 8.0 초기 버전에서도 공통적으로 나타나는 현상이지만, BETWEEN의 양 끝값과 컬럼의 데이터 타입이 일치하지 않으면 MySQL은 암시적으로 형변환을 시도합니다. 예를 들어 문자열 컬럼을 숫자값으로 BETWEEN 비교를 하면 인덱스를 타지 못하고 성능이 급격히 저하됩니다. 쿼리를 작성할 때는 항상 컬럼의 타입과 비교 값의 타입을 일치시키는 습관을 들여야 합니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;22&quot; data-ke-size=&quot;size16&quot;&gt;NULL 값의 처리 BETWEEN 연산에서 컬럼 값이나 경계값 중 하나라도 NULL이면 결과는 UNKNOWN이 되어 해당 행은 결과 집합에서 제외됩니다. 이는 NOT BETWEEN의 경우에도 마찬가지입니다. NULL 가능성이 있는 컬럼에 대해서는 별도의 NULL 체크 로직(IS NULL 등)을 병행해야 합니다.&lt;/p&gt;
&lt;hr data-path-to-node=&quot;23&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-path-to-node=&quot;24&quot; data-ke-size=&quot;size26&quot;&gt;결론 및 실무 적용을 위한 팁&lt;/h2&gt;
&lt;p data-path-to-node=&quot;25&quot; data-ke-size=&quot;size16&quot;&gt;BETWEEN 연산자는 단순해 보이지만 데이터의 정확성과 쿼리 성능을 좌우할 수 있는 중요한 요소입니다. 실무에서 적용할 수 있는 핵심 요약은 다음과 같습니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-path-to-node=&quot;26&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;포함 관계 확인: 시작값과 끝값이 결과에 포함되어도 무방한지 반드시 확인하십시오.&lt;/li&gt;
&lt;li&gt;날짜 시간 처리의 정석: DATETIME 컬럼에는 BETWEEN 대신 부등호(&amp;gt;=, &amp;lt;)를 사용하여 다음 날 0시를 기준으로 범위를 잡는 것이 논리적 오류를 방지하는 가장 좋은 방법입니다.&lt;/li&gt;
&lt;li&gt;타입 일치: 인덱스 효율을 극대화하기 위해 비교 대상의 데이터 타입을 컬럼 타입과 일치시키십시오.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-path-to-node=&quot;27&quot; data-ke-size=&quot;size16&quot;&gt;이러한 세부 사항들을 고려하여 쿼리를 작성한다면, 더 견고하고 빠른 데이터베이스 시스템을 구축할 수 있을 것입니다.&lt;/p&gt;
&lt;hr data-path-to-node=&quot;28&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-path-to-node=&quot;29&quot; data-ke-size=&quot;size26&quot;&gt;공식 문서 링크&lt;/h2&gt;
&lt;p data-path-to-node=&quot;30&quot; data-ke-size=&quot;size16&quot;&gt;더욱 자세한 사양과 연산자 우선순위 등은 MySQL 공식 레퍼런스 매뉴얼에서 확인하실 수 있습니다. &lt;a href=&quot;https://dev.mysql.com/doc/refman/8.0/en/comparison-operators.html#operator_between&quot;&gt;https://dev.mysql.com/doc/refman/8.0/en/comparison-operators.html#operator_between&lt;/a&gt;&lt;/p&gt;</description>
      <category>SQL/MYSQL</category>
      <category>between</category>
      <category>MySQL</category>
      <author>Ant_U</author>
      <guid isPermaLink="true">https://dbaant.tistory.com/275</guid>
      <comments>https://dbaant.tistory.com/275#entry275comment</comments>
      <pubDate>Fri, 27 Feb 2026 10:59:09 +0900</pubDate>
    </item>
    <item>
      <title>[MySQL] 쿼리 최적화의 기본: IN과 NOT IN 연산자의 동작 원리와 성능 분석</title>
      <link>https://dbaant.tistory.com/274</link>
      <description>&lt;p data-path-to-node=&quot;4,0&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;5&quot; data-ke-size=&quot;size16&quot;&gt;데이터베이스를 다루는 개발자와 DBA에게 있어 SQL 쿼리의 가독성과 성능 사이의 균형을 맞추는 것은 언제나 중요한 과제입니다. 그중에서도 IN과 NOT IN 연산자는 여러 개의 조건을 간결하게 표현할 수 있어 매우 빈번하게 사용됩니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;6&quot; data-ke-size=&quot;size16&quot;&gt;하지만 단순히 코드가 깔끔해진다는 이유만으로 이 연산자들을 무분별하게 사용하면 예기치 못한 성능 저하나 논리적 오류를 마주할 수 있습니다. 특히 MySQL 버전에 따라 해당 연산자들을 처리하는 방식(실행 계획)에 상당한 차이가 존재합니다. 이번 글에서는 MySQL 환경에서 IN과 NOT IN이 실제로 어떻게 동작하는지, 그리고 버전에 따라 어떤 변화가 있었는지 깊이 있게 살펴보겠습니다.&lt;/p&gt;
&lt;h2 data-path-to-node=&quot;7&quot; data-ke-size=&quot;size26&quot;&gt;1. IN 연산자의 기본 동작과 최적화 (IN vs OR)&lt;/h2&gt;
&lt;p data-path-to-node=&quot;8&quot; data-ke-size=&quot;size16&quot;&gt;기본적으로 IN 연산자는 괄호 안에 나열된 값들 중 하나라도 일치하면 참(True)을 반환하는 논리 연산자입니다. 논리적으로는 여러 개의 OR 조건을 나열한 것과 동일한 의미를 가집니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;9&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어, status IN ('Active', 'Pending') 조건은 status = 'Active' OR status = 'Pending'과 같습니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;10&quot; data-ke-size=&quot;size16&quot;&gt;하지만 내부 처리 방식에는 차이가 있습니다. MySQL 옵티마이저는 IN 목록에 있는 값들을 정렬하고 **이진 검색(Binary Search)**을 수행하여 일치 여부를 확인합니다. 반면 OR 연산자는 순차적으로 평가됩니다. 따라서 비교할 값의 목록이 길어질수록 OR보다 IN 연산자가 훨씬 효율적으로 동작할 가능성이 높습니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;11&quot; data-ke-size=&quot;size16&quot;&gt;또한, 인덱스가 존재하는 컬럼에 대해 IN을 사용할 경우, MySQL은 이를 범위 검색(Range Scan)으로 처리하여 빠르게 데이터를 조회할 수 있습니다.&lt;/p&gt;
&lt;h2 data-path-to-node=&quot;12&quot; data-ke-size=&quot;size26&quot;&gt;2. 대량의 IN 목록과 eq_range_index_dive_limit&lt;/h2&gt;
&lt;p data-path-to-node=&quot;13&quot; data-ke-size=&quot;size16&quot;&gt;실무에서 자주 발생하는 문제는 IN 절 안에 수천 개의 상수 값을 넣을 때 발생합니다. MySQL은 실행 계획을 수립할 때 인덱스 통계 정보를 활용하여 비용을 계산하는데, 이를 **인덱스 다이브(Index Dive)**라고 합니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;14&quot; data-ke-size=&quot;size16&quot;&gt;IN 목록의 개수가 적을 때는 인덱스 다이브가 정확한 실행 계획을 만드는 데 도움을 줍니다. 하지만 목록이 너무 많아지면 인덱스 다이브 자체에 시간이 오래 걸려 쿼리 분석 속도가 느려질 수 있습니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;15&quot; data-ke-size=&quot;size16&quot;&gt;이를 제어하기 위해 MySQL 5.6부터 eq_range_index_dive_limit 시스템 변수가 도입되었습니다. IN 목록의 개수가 이 변수 값(기본값은 버전별로 상이하나 보통 200)을 초과하면, MySQL은 인덱스 다이브를 포기하고 일반적인 인덱스 통계 정보만을 사용하여 실행 계획을 수립합니다. 이 경우 실행 계획의 정확도가 떨어질 수 있으므로, 너무 많은 상수를 IN 절에 넣는 것은 주의해야 합니다.&lt;/p&gt;
&lt;h2 data-path-to-node=&quot;16&quot; data-ke-size=&quot;size26&quot;&gt;3. NOT IN 사용 시 NULL의 함정&lt;/h2&gt;
&lt;p data-path-to-node=&quot;17&quot; data-ke-size=&quot;size16&quot;&gt;NOT IN 연산자는 초보 개발자들이 가장 흔하게 실수하는 부분 중 하나입니다. 바로 &lt;b data-index-in-node=&quot;48&quot; data-path-to-node=&quot;17&quot;&gt;NULL 값의 처리 방식&lt;/b&gt; 때문입니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;18&quot; data-ke-size=&quot;size16&quot;&gt;SQL에서 NULL은 '알 수 없는 값(Unknown)'을 의미합니다. 만약 NOT IN 리스트 안에 단 하나라도 NULL이 포함되어 있다면, 쿼리 결과는 아무것도 반환되지 않을 수 있습니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;19&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어 id NOT IN (1, 2, NULL)이라는 조건이 있다고 가정해 봅시다. 논리적으로는 id &amp;lt;&amp;gt; 1 AND id &amp;lt;&amp;gt; 2 AND id &amp;lt;&amp;gt; NULL 로 풀이됩니다. 데이터베이스에서 NULL과의 비교 연산은 언제나 Unknown(False 취급)이 되므로, 전체 조건이 거짓이 되어버려 결과 집합이 0건이 되는 현상이 발생합니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;20&quot; data-ke-size=&quot;size16&quot;&gt;반면, NOT EXISTS 연산자는 이러한 NULL 문제에서 자유롭습니다. 따라서 서브쿼리나 리스트에 NULL이 포함될 가능성이 있다면 NOT IN 대신 NOT EXISTS를 사용하거나, IS NOT NULL 조건을 명시적으로 추가하여 데이터를 정제해야 합니다.&lt;/p&gt;
&lt;h2 data-path-to-node=&quot;21&quot; data-ke-size=&quot;size26&quot;&gt;4. 서브쿼리와 버전별 최적화 변화&lt;/h2&gt;
&lt;p data-path-to-node=&quot;22&quot; data-ke-size=&quot;size16&quot;&gt;IN (SELECT ...) 형태의 서브쿼리 사용은 MySQL 버전에 따라 성능 차이가 가장 극명하게 드러나는 부분입니다.&lt;/p&gt;
&lt;h3 data-path-to-node=&quot;23&quot; data-ke-size=&quot;size23&quot;&gt;MySQL 5.5 이하 버전&lt;/h3&gt;
&lt;p data-path-to-node=&quot;24&quot; data-ke-size=&quot;size16&quot;&gt;과거 5.5 버전까지는 IN 서브쿼리의 최적화가 매우 취약했습니다. 옵티마이저가 서브쿼리를 외부 쿼리에 종속적인 형태(Dependent Subquery)로 변환하여 실행했습니다. 즉, 외부 테이블의 레코드마다 서브쿼리를 반복해서 실행하는 구조였기 때문에, 데이터가 많아질수록 성능이 급격히 저하되었습니다.&lt;/p&gt;
&lt;h3 data-path-to-node=&quot;25&quot; data-ke-size=&quot;size23&quot;&gt;MySQL 5.6 이후 (Semi-Join 최적화)&lt;/h3&gt;
&lt;p data-path-to-node=&quot;26&quot; data-ke-size=&quot;size16&quot;&gt;5.6 버전부터는 서브쿼리 최적화에 혁신적인 변화가 있었습니다. &lt;b data-index-in-node=&quot;36&quot; data-path-to-node=&quot;26&quot;&gt;세미 조인(Semi-Join)&lt;/b&gt; 최적화와 &lt;b data-index-in-node=&quot;58&quot; data-path-to-node=&quot;26&quot;&gt;구체화(Materialization)&lt;/b&gt; 전략이 도입되었습니다. 옵티마이저는 서브쿼리의 결과를 임시 테이블로 만들어 조인하는 방식으로 처리하거나, 서브쿼리를 일반 조인 형태로 재작성하여 성능을 대폭 개선했습니다.&lt;/p&gt;
&lt;h3 data-path-to-node=&quot;27&quot; data-ke-size=&quot;size23&quot;&gt;MySQL 8.0&lt;/h3&gt;
&lt;p data-path-to-node=&quot;28&quot; data-ke-size=&quot;size16&quot;&gt;8.0 버전에서는 이러한 최적화가 더욱 성숙해졌으며, 옵티마이저가 상황에 따라 더 다양한 전략(예: FirstMatch, Loosescan 등)을 유연하게 선택합니다. 따라서 최신 버전을 사용 중이라면 IN 서브쿼리에 대한 성능 우려가 과거에 비해 많이 줄어들었습니다.&lt;/p&gt;
&lt;h2 data-path-to-node=&quot;29&quot; data-ke-size=&quot;size26&quot;&gt;결론 및 실무 적용 팁&lt;/h2&gt;
&lt;p data-path-to-node=&quot;30&quot; data-ke-size=&quot;size16&quot;&gt;MySQL에서 IN과 NOT IN은 강력하고 편리한 도구이지만, 그 내부 동작을 이해하지 못하고 사용하면 성능 이슈의 원인이 됩니다. 특히 대용량 데이터를 다루거나 복잡한 서브쿼리를 작성할 때는 더욱 주의가 필요합니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;31&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;31&quot;&gt;핵심 요약 및 팁:&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-path-to-node=&quot;32&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;32,0,0&quot;&gt;단순 나열은 OR보다 IN이 유리합니다:&lt;/b&gt; 비교할 값이 여러 개라면 가독성과 이진 검색 효율을 위해 IN을 사용하는 것이 좋습니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;32,1,0&quot;&gt;NULL 처리에 주의하세요:&lt;/b&gt; NOT IN을 사용할 때 비교 대상 목록에 NULL이 포함되면 결과가 나오지 않습니다. 데이터 정합성을 위해 NULL 포함 여부를 반드시 확인하거나 NOT EXISTS로 대체하는 것을 고려하십시오.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;32,2,0&quot;&gt;MySQL 버전을 확인하세요:&lt;/b&gt; 레거시 시스템(5.5 이하)을 운영 중이라면 IN 서브쿼리 사용을 지양하고 JOIN으로 풀어쓰는 것이 필수적입니다. 5.6 이상이라면 옵티마이저를 믿되, 실행 계획(EXPLAIN)을 통해 세미 조인 최적화가 적용되는지 확인하는 습관을 들여야 합니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;32,3,0&quot;&gt;대량의 IN 목록을 주의하세요:&lt;/b&gt; 수천 개의 값을 IN 절에 넣으면 eq_range_index_dive_limit 설정에 따라 실행 계획이 부정확해질 수 있습니다. 이 경우 임시 테이블을 생성하여 조인하는 방식이 더 나을 수 있습니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-path-to-node=&quot;33&quot; data-ke-size=&quot;size16&quot;&gt;추가적인 정보는 MySQL 공식 문서를 참고하시기 바랍니다.&lt;/p&gt;
&lt;blockquote data-path-to-node=&quot;34&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-path-to-node=&quot;34,0&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;34,0&quot;&gt;MySQL 공식 문서 - Comparison Functions and Operators&lt;/b&gt; &lt;a href=&quot;https://dev.mysql.com/doc/refman/8.0/en/comparison-operators.html&quot;&gt;https://dev.mysql.com/doc/refman/8.0/en/comparison-operators.html&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;</description>
      <category>SQL/MYSQL</category>
      <category>IN</category>
      <category>MySQL</category>
      <category>notin</category>
      <category>최적화</category>
      <author>Ant_U</author>
      <guid isPermaLink="true">https://dbaant.tistory.com/274</guid>
      <comments>https://dbaant.tistory.com/274#entry274comment</comments>
      <pubDate>Mon, 9 Feb 2026 15:44:17 +0900</pubDate>
    </item>
    <item>
      <title>[MySQL] LIKE 연산자 활용법과 성능 최적화 가이드 (인덱스 활용 및 주의사항)</title>
      <link>https://dbaant.tistory.com/273</link>
      <description>&lt;p data-path-to-node=&quot;3&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-path-to-node=&quot;6&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-path-to-node=&quot;6&quot; data-ke-size=&quot;size26&quot;&gt;1. 소개&lt;/h2&gt;
&lt;p data-path-to-node=&quot;7&quot; data-ke-size=&quot;size16&quot;&gt;데이터베이스를 다루다 보면 정확하게 일치하는 데이터가 아니라 특정 패턴을 가진 데이터를 찾아야 할 때가 많습니다. 예를 들어, '김'씨 성을 가진 모든 사용자를 찾거나, 이메일 주소가 '@gmail.com'으로 끝나는 회원을 조회하는 경우입니다. 이때 가장 흔하게 사용되는 것이 바로 MySQL의 LIKE 연산자입니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;8&quot; data-ke-size=&quot;size16&quot;&gt;LIKE는 SQL 표준 연산자로, 초보 개발자에게는 직관적이고 편리한 도구이지만, 데이터 양이 많아질수록 성능에 치명적인 영향을 줄 수 있는 양날의 검이기도 합니다. 이 글에서는 LIKE의 기본적인 사용법부터 인덱스를 태우기 위한 조건, 그리고 실무에서 주의해야 할 성능 이슈까지 깊이 있게 다루어 보겠습니다.&lt;/p&gt;
&lt;h2 data-path-to-node=&quot;9&quot; data-ke-size=&quot;size26&quot;&gt;2. LIKE 연산자의 기본 문법과 와일드카드&lt;/h2&gt;
&lt;p data-path-to-node=&quot;10&quot; data-ke-size=&quot;size16&quot;&gt;LIKE 연산자는 특정 문자열이 지정된 패턴과 일치하는지를 검사합니다. 이때 패턴을 정의하기 위해 두 가지 핵심 와일드카드를 사용합니다.&lt;/p&gt;
&lt;h3 data-path-to-node=&quot;11&quot; data-ke-size=&quot;size23&quot;&gt;퍼센트(%) 기호&lt;/h3&gt;
&lt;p data-path-to-node=&quot;12&quot; data-ke-size=&quot;size16&quot;&gt;퍼센트 기호(%)는 0개 이상의 임의의 문자와 일치함을 의미합니다. 길이에 상관없이 어떤 문자열이든 올 수 있다는 뜻입니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;13&quot; data-ke-size=&quot;size16&quot;&gt;예시: SELECT * FROM users WHERE name LIKE '김%'; 위 쿼리는 '김'으로 시작하는 모든 이름을 찾습니다. '김철수', '김영희', 그리고 외자 이름인 '김'도 모두 포함됩니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;14&quot; data-ke-size=&quot;size16&quot;&gt;반대로 '%수'라고 작성하면 '철수', '영수'처럼 '수'로 끝나는 모든 이름을 찾게 됩니다. '%길동%'과 같이 양쪽에 사용하면 '홍길동', '고길동' 등 위치에 상관없이 '길동'이 포함된 모든 데이터를 조회합니다.&lt;/p&gt;
&lt;h3 data-path-to-node=&quot;15&quot; data-ke-size=&quot;size23&quot;&gt;언더스코어(_) 기호&lt;/h3&gt;
&lt;p data-path-to-node=&quot;16&quot; data-ke-size=&quot;size16&quot;&gt;언더스코어(_)는 정확히 1개의 문자와 일치함을 의미합니다. 글자 수를 지정해서 검색하고 싶을 때 유용합니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;17&quot; data-ke-size=&quot;size16&quot;&gt;예시: SELECT * FROM products WHERE code LIKE 'A_'; 이 쿼리는 'A'로 시작하고 뒤에 딱 한 글자가 더 오는 코드를 찾습니다. 'A1', 'AB'는 검색되지만, 'A12'나 'A'는 검색되지 않습니다.&lt;/p&gt;
&lt;h2 data-path-to-node=&quot;18&quot; data-ke-size=&quot;size26&quot;&gt;3. LIKE 쿼리와 성능: 인덱스는 언제 사용될까?&lt;/h2&gt;
&lt;p data-path-to-node=&quot;19&quot; data-ke-size=&quot;size16&quot;&gt;많은 개발자가 LIKE를 사용할 때 가장 고민하는 부분은 바로 성능입니다. &quot;LIKE를 쓰면 느리다&quot;라는 말을 들어보셨을 텐데, 이는 반은 맞고 반은 틀린 이야기입니다. LIKE 쿼리도 상황에 따라 인덱스를 효율적으로 사용할 수 있습니다.&lt;/p&gt;
&lt;h3 data-path-to-node=&quot;20&quot; data-ke-size=&quot;size23&quot;&gt;인덱스를 사용할 수 있는 경우 (Leftmost Prefix)&lt;/h3&gt;
&lt;p data-path-to-node=&quot;21&quot; data-ke-size=&quot;size16&quot;&gt;MySQL의 B-Tree 인덱스는 데이터를 왼쪽에서 오른쪽으로 정렬하여 저장합니다. 따라서 패턴이 상수 문자로 시작하는 경우에는 인덱스를 활용할 수 있습니다. 이를 'Leftmost Prefix(가장 왼쪽 접두사)' 규칙이라고 합니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;22&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어, LIKE 'Apple%'과 같은 검색은 인덱스 범위 스캔(Range Scan)이 가능합니다. 인덱스 트리에서 'A'로 시작하는 구간만 찾으면 되기 때문입니다. 이 경우 검색 속도가 매우 빠릅니다.&lt;/p&gt;
&lt;h3 data-path-to-node=&quot;23&quot; data-ke-size=&quot;size23&quot;&gt;인덱스를 사용할 수 없는 경우&lt;/h3&gt;
&lt;p data-path-to-node=&quot;24&quot; data-ke-size=&quot;size16&quot;&gt;반면, 와일드카드가 패턴의 가장 앞에 오는 경우(예: LIKE '%Apple')에는 인덱스를 사용할 수 없습니다. 데이터가 'A'로 시작할지 'B'로 시작할지 알 수 없기 때문에, 데이터베이스는 결국 테이블의 모든 행을 하나씩 검사하는 풀 테이블 스캔(Full Table Scan)을 수행해야 합니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;25&quot; data-ke-size=&quot;size16&quot;&gt;데이터가 수백만 건 이상일 때 '%단어%' 형태의 검색을 자주 수행하면 DB 서버의 CPU 사용량이 급증하고 응답 속도가 현저히 느려질 수 있으므로 주의해야 합니다.&lt;/p&gt;
&lt;h2 data-path-to-node=&quot;26&quot; data-ke-size=&quot;size26&quot;&gt;4. 특수 문자와 데이터 정렬(Collation) 이슈&lt;/h2&gt;
&lt;p data-path-to-node=&quot;27&quot; data-ke-size=&quot;size16&quot;&gt;실무에서는 조금 더 복잡한 상황을 마주하게 됩니다. 검색하려는 데이터 자체에 와일드카드 문자(%, _)가 포함된 경우나 대소문자 구분이 필요한 경우입니다.&lt;/p&gt;
&lt;h3 data-path-to-node=&quot;28&quot; data-ke-size=&quot;size23&quot;&gt;이스케이프(Escape) 처리&lt;/h3&gt;
&lt;p data-path-to-node=&quot;29&quot; data-ke-size=&quot;size16&quot;&gt;만약 데이터베이스에 저장된 '100%'라는 문자열을 찾고 싶다면 어떻게 해야 할까요? LIKE '100%'라고 쓰면 100으로 시작하는 모든 문자열을 찾게 됩니다. 이때는 역슬래시()를 사용하여 해당 문자가 와일드카드가 아닌 일반 문자임을 알려주어야 합니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;30&quot; data-ke-size=&quot;size16&quot;&gt;예시: WHERE content LIKE '100%' ESCAPE ''; 이렇게 작성하면 % 기호 자체를 문자로 인식하여 정확히 '100%'를 찾을 수 있습니다.&lt;/p&gt;
&lt;h3 data-path-to-node=&quot;31&quot; data-ke-size=&quot;size23&quot;&gt;대소문자 구분과 Collation&lt;/h3&gt;
&lt;p data-path-to-node=&quot;32&quot; data-ke-size=&quot;size16&quot;&gt;MySQL의 기본 설정에서 LIKE 연산은 대소문자를 구분하지 않는 경우가 많습니다. 이는 테이블의 Collation(정렬 규칙) 설정에 따르는데, 보통 utf8mb4_general_ci 또는 utf8mb4_0900_ai_ci 등으로 설정되어 있기 때문입니다. 여기서 'ci'는 Case Insensitive(대소문자 구분 안 함)를 의미합니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;33&quot; data-ke-size=&quot;size16&quot;&gt;정확하게 대소문자를 구분하여 검색해야 한다면, BINARY 연산자를 사용하거나 Collation을 _bin(Binary) 또는 _cs(Case Sensitive) 계열로 변경해야 합니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;34&quot; data-ke-size=&quot;size16&quot;&gt;예시: WHERE name LIKE BINARY 'Admin%'; 이렇게 하면 'admin'은 검색되지 않고 'Admin'만 검색됩니다. 단, BINARY 변환 시 인덱스 사용에 제약이 생길 수 있으므로 실행 계획을 확인하는 것이 좋습니다.&lt;/p&gt;
&lt;h2 data-path-to-node=&quot;35&quot; data-ke-size=&quot;size26&quot;&gt;5. MySQL 버전별 고려사항&lt;/h2&gt;
&lt;p data-path-to-node=&quot;36&quot; data-ke-size=&quot;size16&quot;&gt;MySQL 5.7에서 8.0으로 넘어오면서 기본 캐릭터 셋이 latin1에서 utf8mb4로 변경되었습니다. 또한 기본 Collation도 utf8mb4_0900_ai_ci로 바뀌었습니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;37&quot; data-ke-size=&quot;size16&quot;&gt;기능적으로 LIKE의 동작 방식이 크게 바뀐 것은 아니지만, utf8mb4는 가변 길이 문자열을 저장하므로 LIKE 검색 시 메모리 사용량이나 성능 패턴이 미세하게 다를 수 있습니다. 특히 이모지 등을 포함한 검색이 필요하다면 반드시 utf8mb4 설정을 확인해야 합니다.&lt;/p&gt;
&lt;h2 data-path-to-node=&quot;38&quot; data-ke-size=&quot;size26&quot;&gt;6. 결론 및 실무 팁&lt;/h2&gt;
&lt;p data-path-to-node=&quot;39&quot; data-ke-size=&quot;size16&quot;&gt;LIKE 연산자는 강력하고 편리하지만, 대용량 데이터 환경에서는 성능 저하의 주범이 될 수 있습니다. 쿼리를 작성할 때 다음의 사항들을 꼭 기억해 주세요.&lt;/p&gt;
&lt;h3 data-path-to-node=&quot;40&quot; data-ke-size=&quot;size23&quot;&gt;핵심 요약 및 실무 팁&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-path-to-node=&quot;41&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;접두사 검색을 지향하세요: 가능하다면 '검색어%' 형태를 사용하여 인덱스를 태우는 것이 좋습니다. 사용자가 입력한 검색어 뒤에만 와일드카드를 붙이는 방식을 고려해 보세요.&lt;/li&gt;
&lt;li&gt;풀 텍스트 검색(Full-Text Search) 고려: 만약 게시판 본문 검색처럼 앞뒤로 와일드카드가 들어가는 '%검색어%' 쿼리가 필수적이라면, LIKE 대신 MySQL의 전문 검색(Full-Text Search) 인덱스나 Elasticsearch 같은 별도의 검색 엔진 도입을 고려해야 합니다.&lt;/li&gt;
&lt;li&gt;커버링 인덱스 활용: 쿼리가 인덱스에 포함된 컬럼만 조회하도록(SELECT id FROM ... WHERE code LIKE 'A%') 설계하면, 테이블 데이터에 접근하지 않고 인덱스만 읽어서 처리할 수 있어 성능이 크게 향상됩니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-path-to-node=&quot;42&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-path-to-node=&quot;43&quot; data-ke-size=&quot;size26&quot;&gt;공식 문서&lt;/h2&gt;
&lt;p data-path-to-node=&quot;44&quot; data-ke-size=&quot;size16&quot;&gt;더 자세한 정보와 스펙은 아래 MySQL 공식 문서를 참고하시기 바랍니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;45&quot; data-ke-size=&quot;size16&quot;&gt;MySQL 8.0 Reference Manual - String Comparison Functions (LIKE) &lt;a href=&quot;https://dev.mysql.com/doc/refman/8.0/en/string-comparison-functions.html#operator_like&quot;&gt;https://dev.mysql.com/doc/refman/8.0/en/string-comparison-functions.html#operator_like&lt;/a&gt;&lt;/p&gt;</description>
      <category>SQL/MYSQL</category>
      <category>like</category>
      <category>MySQL</category>
      <author>Ant_U</author>
      <guid isPermaLink="true">https://dbaant.tistory.com/273</guid>
      <comments>https://dbaant.tistory.com/273#entry273comment</comments>
      <pubDate>Thu, 5 Feb 2026 11:08:34 +0900</pubDate>
    </item>
    <item>
      <title>[MySQL] 논리 연산자 완벽 가이드: AND, OR, NOT 제대로 사용하기</title>
      <link>https://dbaant.tistory.com/272</link>
      <description>&lt;h2 data-path-to-node=&quot;3&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;p data-path-to-node=&quot;4&quot; data-ke-size=&quot;size16&quot;&gt;MySQL의 AND, OR, NOT 연산자의 작동 원리, 우선순위 규칙, 그리고 쿼리 성능에 미치는 영향을 다룹니다. 초보자부터 전문가까지 반드시 알아야 할 데이터 필터링의 핵심을 정리했습니다.&lt;/p&gt;
&lt;hr data-path-to-node=&quot;5&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-path-to-node=&quot;6&quot; data-ke-size=&quot;size26&quot;&gt;들어가며&lt;/h2&gt;
&lt;p data-path-to-node=&quot;7&quot; data-ke-size=&quot;size16&quot;&gt;데이터베이스 관리 시스템(DBMS)에서 데이터를 저장하는 것만큼 중요한 것이 바로 원하는 데이터를 정확하게 추출하는 것입니다. 수백만 건의 데이터 중에서 비즈니스 로직에 맞는 행(Row)만을 골라내기 위해 우리는 WHERE 절을 사용하며, 이때 필터링 조건을 정교하게 결합해 주는 도구가 바로 논리 연산자(Logical Operators)입니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;8&quot; data-ke-size=&quot;size16&quot;&gt;MySQL을 사용하는 개발자라면 누구나 SELECT * FROM table WHERE condition... 형태의 쿼리를 작성해 본 경험이 있을 것입니다. 하지만 AND와 OR가 복합적으로 사용될 때의 우선순위 문제나, NOT 연산자가 인덱스 성능에 미치는 영향을 간과하여 의도치 않은 버그를 만들거나 쿼리 속도를 저하시키는 경우가 종종 발생합니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;9&quot; data-ke-size=&quot;size16&quot;&gt;이 글에서는 가장 기본적이면서도 실수하기 쉬운 AND, OR, NOT 연산자의 정확한 동작 방식과 실행 순서, 그리고 성능 최적화를 위한 팁을 정리해 드립니다.&lt;/p&gt;
&lt;hr data-path-to-node=&quot;10&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-path-to-node=&quot;11&quot; data-ke-size=&quot;size26&quot;&gt;1. 기본 개념: 교집합, 합집합, 그리고 부정&lt;/h2&gt;
&lt;p data-path-to-node=&quot;12&quot; data-ke-size=&quot;size16&quot;&gt;가장 먼저 세 가지 연산자의 기본 동작을 명확히 정의해 보겠습니다.&lt;/p&gt;
&lt;h3 data-path-to-node=&quot;13&quot; data-ke-size=&quot;size23&quot;&gt;AND 연산자 (교집합)&lt;/h3&gt;
&lt;p data-path-to-node=&quot;14&quot; data-ke-size=&quot;size16&quot;&gt;AND는 나열된 모든 조건이 참(True)이어야만 결과에 포함됩니다. 조건이 늘어날수록 결과 집합의 크기는 줄어들거나 같게 유지됩니다. 즉, 데이터를 좁혀나가는(Narrowing) 역할을 합니다. 예를 들어, 부서가 '개발팀'이면서 동시에 직급이 '과장'인 사원을 찾을 때 사용합니다.&lt;/p&gt;
&lt;h3 data-path-to-node=&quot;15&quot; data-ke-size=&quot;size23&quot;&gt;OR 연산자 (합집합)&lt;/h3&gt;
&lt;p data-path-to-node=&quot;16&quot; data-ke-size=&quot;size16&quot;&gt;OR는 나열된 조건 중 하나라도 참이면 결과에 포함됩니다. 조건이 늘어날수록 결과 집합의 크기는 늘어나거나 같게 유지됩니다. 즉, 데이터를 확장하는(Widening) 역할을 합니다. 예를 들어, 부서가 '개발팀'이거나 혹은 '디자인팀'인 모든 사원을 찾을 때 사용합니다.&lt;/p&gt;
&lt;h3 data-path-to-node=&quot;17&quot; data-ke-size=&quot;size23&quot;&gt;NOT 연산자 (부정)&lt;/h3&gt;
&lt;p data-path-to-node=&quot;18&quot; data-ke-size=&quot;size16&quot;&gt;NOT은 바로 뒤에 오는 조건의 참/거짓 결과를 뒤집습니다. 참은 거짓으로, 거짓은 참으로 변환합니다. 예를 들어, 부서가 '영업팀'이 아닌 사원들을 찾을 때 사용합니다.&lt;/p&gt;
&lt;hr data-path-to-node=&quot;19&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-path-to-node=&quot;20&quot; data-ke-size=&quot;size26&quot;&gt;2. 연산자 우선순위의 함정 (Operator Precedence)&lt;/h2&gt;
&lt;p data-path-to-node=&quot;21&quot; data-ke-size=&quot;size16&quot;&gt;SQL을 처음 접하는 주니어 개발자뿐만 아니라 숙련된 개발자도 복잡한 쿼리를 작성하다 보면 흔히 저지르는 실수가 바로 연산자 우선순위 문제입니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;22&quot; data-ke-size=&quot;size16&quot;&gt;MySQL에서 AND 연산자는 OR 연산자보다 우선순위가 높습니다. 수학에서 덧셈보다 곱셈을 먼저 계산하는 것과 같은 원리입니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;23&quot; data-ke-size=&quot;size16&quot;&gt;다음 쿼리를 예로 들어보겠습니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;24&quot; data-ke-size=&quot;size16&quot;&gt;SELECT * FROM products WHERE category = 'Electronics' OR category = 'Computers' AND price &amp;gt;= 1000;&lt;/p&gt;
&lt;p data-path-to-node=&quot;25&quot; data-ke-size=&quot;size16&quot;&gt;개발자의 의도는 &quot;카테고리가 전자제품이거나 컴퓨터인 상품 중에서, 가격이 1000 이상인 것&quot;을 찾고 싶었을 것입니다. 하지만 MySQL은 이 쿼리를 다음과 같이 해석합니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-path-to-node=&quot;26&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;category = 'Computers' AND price &amp;gt;= 1000 (이 조건을 먼저 묶어서 처리)&lt;/li&gt;
&lt;li&gt;category = 'Electronics' (그 다음 이 조건과 OR 연산)&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-path-to-node=&quot;27&quot; data-ke-size=&quot;size16&quot;&gt;결과적으로 &quot;컴퓨터 카테고리의 1000 이상인 상품&quot;과 &quot;가격 상관없이 모든 전자제품&quot;이 조회되어 버립니다. 의도와 전혀 다른 데이터가 추출되는 것입니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;28&quot; data-ke-size=&quot;size16&quot;&gt;이를 해결하는 유일하고 확실한 방법은 괄호 ()를 사용하는 것입니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;29&quot; data-ke-size=&quot;size16&quot;&gt;SELECT * FROM products WHERE (category = 'Electronics' OR category = 'Computers') AND price &amp;gt;= 1000;&lt;/p&gt;
&lt;p data-path-to-node=&quot;30&quot; data-ke-size=&quot;size16&quot;&gt;괄호는 모든 연산자보다 우선순위가 가장 높습니다. 따라서 복합 조건을 사용할 때는 괄호를 명시적으로 사용하여 가독성을 높이고 논리적 오류를 방지하는 습관을 들이는 것이 좋습니다.&lt;/p&gt;
&lt;hr data-path-to-node=&quot;31&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-path-to-node=&quot;32&quot; data-ke-size=&quot;size26&quot;&gt;3. NULL 처리와 3-valued Logic (3치 논리)&lt;/h2&gt;
&lt;p data-path-to-node=&quot;33&quot; data-ke-size=&quot;size16&quot;&gt;프로그래밍 언어의 불리언(Boolean)은 참과 거짓 두 가지만 존재하지만, 데이터베이스에는 NULL이라는 제3의 상태가 존재합니다. NULL은 &quot;값이 없음&quot; 또는 &quot;알 수 없음(Unknown)&quot;을 의미합니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;34&quot; data-ke-size=&quot;size16&quot;&gt;이로 인해 논리 연산 결과가 예상과 다를 수 있습니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;35&quot; data-ke-size=&quot;size16&quot;&gt;AND 연산: 1 AND NULL의 결과는 NULL(알 수 없음)입니다. 조건 중 하나가 거짓(0)이면 결과는 0이지만, 하나가 참이고 나머지가 NULL이면 전체 결과는 확정할 수 없기 때문입니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;36&quot; data-ke-size=&quot;size16&quot;&gt;OR 연산: 1 OR NULL의 결과는 1(참)입니다. 조건 중 하나만 참이면 나머지가 무엇이든 참이기 때문입니다. 하지만 0 OR NULL은 NULL이 됩니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;37&quot; data-ke-size=&quot;size16&quot;&gt;NOT 연산: NOT NULL의 결과는 여전히 NULL입니다. 알 수 없는 값을 부정해도 여전히 알 수 없기 때문입니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;38&quot; data-ke-size=&quot;size16&quot;&gt;따라서 데이터 필터링 시 컬럼에 NULL이 포함될 가능성이 있다면, IS NULL 또는 IS NOT NULL 조건을 명시적으로 함께 처리해야 의도한 데이터를 정확히 가져올 수 있습니다.&lt;/p&gt;
&lt;hr data-path-to-node=&quot;39&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-path-to-node=&quot;40&quot; data-ke-size=&quot;size26&quot;&gt;4. 성능과 인덱스 활용 (Performance Considerations)&lt;/h2&gt;
&lt;p data-path-to-node=&quot;41&quot; data-ke-size=&quot;size16&quot;&gt;쿼리의 정확성만큼이나 중요한 것이 성능입니다. 대용량 데이터베이스에서 논리 연산자를 어떻게 사용하느냐에 따라 쿼리 속도가 천차만별로 달라질 수 있습니다.&lt;/p&gt;
&lt;h3 data-path-to-node=&quot;42&quot; data-ke-size=&quot;size23&quot;&gt;OR 연산자와 인덱스 풀 스캔&lt;/h3&gt;
&lt;p data-path-to-node=&quot;43&quot; data-ke-size=&quot;size16&quot;&gt;일반적으로 AND 조건은 인덱스를 타고 데이터를 빠르게 좁혀나가는 데 유리합니다. 반면 OR 조건은 주의가 필요합니다. 만약 조건 컬럼 중 하나라도 인덱스가 걸려있지 않다면, MySQL은 데이터를 찾기 위해 테이블 전체를 스캔(Full Table Scan)해야 할 수도 있습니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;44&quot; data-ke-size=&quot;size16&quot;&gt;MySQL 5.0 이상부터는 index merge 최적화 기능이 도입되어, OR 조건으로 연결된 서로 다른 컬럼들이 각각 인덱스를 가지고 있다면 이를 병합하여 처리할 수 있습니다. 하지만 여전히 단일 인덱스나 복합 인덱스를 사용하는 AND 조건보다는 성능이 떨어질 수 있습니다.&lt;/p&gt;
&lt;h3 data-path-to-node=&quot;45&quot; data-ke-size=&quot;size23&quot;&gt;NOT 연산자와 인덱스&lt;/h3&gt;
&lt;p data-path-to-node=&quot;46&quot; data-ke-size=&quot;size16&quot;&gt;부정 연산자(!=, &amp;lt;&amp;gt;, NOT IN 등)는 일반적으로 인덱스를 효율적으로 사용하기 어렵습니다. &quot;특정 값이 아닌 것&quot;을 찾는 작업은 B-Tree 인덱스 구조상 데이터의 대부분을 읽어야 하는 경우가 많기 때문입니다. 따라서 대용량 테이블에서 NOT 조건을 사용할 때는 쿼리 실행 계획(EXPLAIN)을 확인하여 비효율적인 스캔이 발생하는지 점검해야 합니다.&lt;/p&gt;
&lt;hr data-path-to-node=&quot;47&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-path-to-node=&quot;48&quot; data-ke-size=&quot;size26&quot;&gt;결론 및 실무 팁&lt;/h2&gt;
&lt;p data-path-to-node=&quot;49&quot; data-ke-size=&quot;size16&quot;&gt;MySQL의 AND, OR, NOT은 단순해 보이지만, 데이터 무결성과 쿼리 성능을 결정짓는 중요한 요소입니다. 오늘 다룬 내용을 요약하며 실무에서 바로 적용할 수 있는 팁을 정리합니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;50&quot; data-ke-size=&quot;size16&quot;&gt;핵심 요약 및 실무 팁&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-path-to-node=&quot;51&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;괄호 사용을 생활화하세요: AND와 OR가 섞여 있다면, 우선순위를 기억하려 애쓰기보다 괄호로 명확하게 묶어주는 것이 가독성과 정확성 면에서 훨씬 좋습니다.&lt;/li&gt;
&lt;li&gt;NULL의 함정을 피하세요: 컬럼이 NOT NULL 제약조건이 없다면, NULL 값에 대한 논리 연산 결과(Unknown)를 항상 염두에 두어야 합니다.&lt;/li&gt;
&lt;li&gt;OR 대신 UNION을 고려하세요: 복잡한 OR 조건으로 인해 인덱스를 제대로 타지 못해 쿼리가 느려진다면, 쿼리를 두 개로 나누어 UNION ALL로 결합하는 것이 성능상 유리할 때가 많습니다.&lt;/li&gt;
&lt;li&gt;숏서킷(Short-Circuit) 평가 활용: AND 조건에서는 가장 걸러지는 데이터가 많은(False가 될 확률이 높은) 조건을, OR 조건에서는 참이 될 확률이 높은 조건을 앞쪽에 배치하면 미세하지만 성능 이점을 얻을 수도 있습니다. (단, MySQL 옵티마이저가 자동으로 순서를 재배치할 수 있으므로 절대적인 규칙은 아닙니다.)&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-path-to-node=&quot;52&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-path-to-node=&quot;53&quot; data-ke-size=&quot;size26&quot;&gt;공식 문서 링크&lt;/h2&gt;
&lt;p data-path-to-node=&quot;54&quot; data-ke-size=&quot;size16&quot;&gt;더 깊이 있는 내용과 버전에 따른 상세한 동작 방식은 아래 공식 문서를 참고하시기 바랍니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;55&quot; data-ke-size=&quot;size16&quot;&gt;MySQL 8.0 Reference Manual - Logical Operators &lt;a href=&quot;https://dev.mysql.com/doc/refman/8.0/en/logical-operators.html&quot;&gt;https://dev.mysql.com/doc/refman/8.0/en/logical-operators.html&lt;/a&gt;&lt;/p&gt;</description>
      <category>SQL/MYSQL</category>
      <category>And</category>
      <category>MySQL</category>
      <category>not</category>
      <category>Or</category>
      <author>Ant_U</author>
      <guid isPermaLink="true">https://dbaant.tistory.com/272</guid>
      <comments>https://dbaant.tistory.com/272#entry272comment</comments>
      <pubDate>Tue, 3 Feb 2026 11:08:34 +0900</pubDate>
    </item>
    <item>
      <title>[MySQL] WHERE 절 완전 정복: 기본 문법부터 8.0 최적화 팁까지</title>
      <link>https://dbaant.tistory.com/271</link>
      <description>&lt;p data-path-to-node=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;3&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-path-to-node=&quot;5&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-path-to-node=&quot;5&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;5&quot;&gt;들어가며: 왜 WHERE 절에 집착해야 할까요?&lt;/b&gt;&lt;/h3&gt;
&lt;p data-path-to-node=&quot;6&quot; data-ke-size=&quot;size16&quot;&gt;데이터베이스를 다루는 개발자에게 SELECT * FROM table만큼 위험하고 게으른 쿼리는 없습니다. 데이터베이스 성능 문제의 80% 이상은 필요한 데이터만 똑똑하게 골라내지 못하는 비효율적인 필터링에서 발생합니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;7&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7&quot;&gt;WHERE 절&lt;/b&gt;은 단순히 데이터를 걸러내는 '거름망' 역할을 넘어, 데이터베이스가 인덱스(Index)라는 고속도로를 탈지, 아니면 비포장도로(Full Table Scan)를 달릴지를 결정짓는 &lt;b data-index-in-node=&quot;110&quot; data-path-to-node=&quot;7&quot;&gt;핸들&lt;/b&gt;과 같습니다. 이 글에서는 WHERE 절의 기초부터 시니어 개발자가 알아야 할 MySQL 버전별 동작 차이와 최적화 기법까지 깊이 있게 다룹니다.&lt;/p&gt;
&lt;hr data-path-to-node=&quot;8&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-path-to-node=&quot;9&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9&quot;&gt;1. 기본기 다지기: 정확한 데이터 필터링&lt;/b&gt;&lt;/h3&gt;
&lt;p data-path-to-node=&quot;10&quot; data-ke-size=&quot;size16&quot;&gt;가장 기본적인 사용법이지만, 의외로 실수가 잦은 부분들을 짚어보겠습니다.&lt;/p&gt;
&lt;h4 data-path-to-node=&quot;11&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;11&quot;&gt;연산자 활용과 NULL의 함정&lt;/b&gt;&lt;/h4&gt;
&lt;p data-path-to-node=&quot;12&quot; data-ke-size=&quot;size16&quot;&gt;WHERE 절은 다양한 연산자를 지원합니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;13&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;13,0,0&quot;&gt;비교 연산자:&lt;/b&gt; =, &amp;lt;&amp;gt;, &amp;lt;, &amp;lt;=, &amp;gt;, &amp;gt;=&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;13,1,0&quot;&gt;논리 연산자:&lt;/b&gt; AND, OR, NOT&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;13,2,0&quot;&gt;범위 및 패턴:&lt;/b&gt; BETWEEN, IN, LIKE&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-path-to-node=&quot;14&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;14&quot;&gt;⚠️ 주니어 개발자를 위한 주의사항 (NULL 처리)&lt;/b&gt; SQL에서 NULL은 '값이 없음'을 의미하는 특수한 상태입니다. 따라서 = NULL이나 != NULL로는 절대 데이터를 찾을 수 없습니다.&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwjEl6CAkbKSAxUAAAAAHQAAAAAQmAQ&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;-- 잘못된 예 (결과 없음)
SELECT * FROM users WHERE phone_number = NULL;

-- 올바른 예
SELECT * FROM users WHERE phone_number IS NULL;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h4 data-path-to-node=&quot;16&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;16&quot;&gt;데이터 타입 불일치 (Implicit Conversion)&lt;/b&gt;&lt;/h4&gt;
&lt;p data-path-to-node=&quot;17&quot; data-ke-size=&quot;size16&quot;&gt;컬럼의 타입과 비교하는 값의 타입이 다르면, MySQL은 내부적으로 &lt;b data-index-in-node=&quot;38&quot; data-path-to-node=&quot;17&quot;&gt;형변환&lt;/b&gt;을 시도합니다. 이 과정에서 인덱스를 사용하지 못하게 되어 성능이 급격히 저하될 수 있습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;18&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;문자열 컬럼에는 반드시 따옴표를 사용하세요 (WHERE varchar_col = '123' O, WHERE varchar_col = 123 X).&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-path-to-node=&quot;19&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-path-to-node=&quot;20&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;20&quot;&gt;2. 성능의 핵심: 인덱스를 태우는 'SARGable' 쿼리&lt;/b&gt;&lt;/h3&gt;
&lt;p data-path-to-node=&quot;21&quot; data-ke-size=&quot;size16&quot;&gt;경력직 개발자라면 &lt;b data-index-in-node=&quot;10&quot; data-path-to-node=&quot;21&quot;&gt;SARGable&lt;/b&gt; (Search ARGument ABLE)이라는 용어를 기억해야 합니다. 쉽게 말해 &quot;인덱스를 사용할 수 있는 형태의 쿼리&quot;를 뜻합니다.&lt;/p&gt;
&lt;h4 data-path-to-node=&quot;22&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;22&quot;&gt;좌변을 가공하지 마세요&lt;/b&gt;&lt;/h4&gt;
&lt;p data-path-to-node=&quot;23&quot; data-ke-size=&quot;size16&quot;&gt;가장 흔한 실수는 WHERE 절의 &lt;b data-index-in-node=&quot;19&quot; data-path-to-node=&quot;23&quot;&gt;컬럼(좌변)에 함수를 적용&lt;/b&gt;하는 것입니다. 컬럼을 가공하면 MySQL은 인덱스 트리를 탈 수 없어 모든 데이터를 다 뒤져야 합니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;24&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;24,0,0&quot;&gt;나쁜 예 (인덱스 미사용)&lt;/b&gt;&lt;span&gt;&lt;/span&gt;
&lt;div&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;-- 데이터를 가공해서 비교 (Full Scan 발생)
SELECT * FROM orders WHERE YEAR(order_date) = 2023;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;24,1,0&quot;&gt;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;24,1,0&quot;&gt;좋은 예 (인덱스 사용):&lt;/b&gt;&lt;span&gt;&lt;/span&gt;
&lt;div&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;-- 비교할 범위를 가공해서 컬럼 원형 유지 (Range Scan)
SELECT * FROM orders WHERE order_date &amp;gt;= '2023-01-01' AND order_date &amp;lt; '2024-01-01';
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-path-to-node=&quot;25&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;25&quot;&gt;와일드카드 위치&lt;/b&gt;&lt;/h4&gt;
&lt;p data-path-to-node=&quot;26&quot; data-ke-size=&quot;size16&quot;&gt;LIKE 연산자 사용 시 %가 앞에 오면 인덱스를 탈 수 없습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;27&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;LIKE '%apple' (느림, 인덱스 X)&lt;/li&gt;
&lt;li&gt;LIKE 'apple%' (빠름, 인덱스 O - Prefix 검색)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-path-to-node=&quot;28&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-path-to-node=&quot;29&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;29&quot;&gt;3. MySQL 5.7 vs 8.0: 무엇이 달라졌나?&lt;/b&gt;&lt;/h3&gt;
&lt;p data-path-to-node=&quot;30&quot; data-ke-size=&quot;size16&quot;&gt;MySQL이 8.0으로 버전업되면서 WHERE 절 최적화에도 중요한 변화가 생겼습니다.&lt;/p&gt;
&lt;h4 data-path-to-node=&quot;31&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;31&quot;&gt;1) 함수 기반 인덱스 (Functional Indexes) - 8.0 신기능&lt;/b&gt;&lt;/h4&gt;
&lt;p data-path-to-node=&quot;32&quot; data-ke-size=&quot;size16&quot;&gt;앞서 &quot;좌변을 가공하지 말라&quot;고 했지만, 비즈니스 로직상 어쩔 수 없는 경우가 있습니다. MySQL 8.0부터는 &lt;b data-index-in-node=&quot;63&quot; data-path-to-node=&quot;32&quot;&gt;가공된 값 자체를 인덱싱&lt;/b&gt;할 수 있는 기능이 추가되었습니다.&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwjEl6CAkbKSAxUAAAAAHQAAAAAQmwQ&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;-- MySQL 8.0: 함수 결과값에 인덱스 생성 가능
ALTER TABLE orders ADD INDEX idx_order_year ((YEAR(order_date)));

-- 이제 아래 쿼리도 인덱스를 탑니다!
SELECT * FROM orders WHERE YEAR(order_date) = 2023;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-path-to-node=&quot;34&quot; data-ke-size=&quot;size16&quot;&gt;이 기능 덕분에 쿼리를 복잡하게 수정하지 않고도 성능을 획기적으로 개선할 수 있습니다.&lt;/p&gt;
&lt;h4 data-path-to-node=&quot;35&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;35&quot;&gt;2) 옵티마이저의 똑똑한 조건 재배치&lt;/b&gt;&lt;/h4&gt;
&lt;p data-path-to-node=&quot;36&quot; data-ke-size=&quot;size16&quot;&gt;과거에는 WHERE A AND B에서 A와 B의 순서가 성능에 미묘한 영향을 주기도 했으나, 최신 MySQL 옵티마이저는 조건의 순서와 상관없이 가장 효율적인 인덱스를 찾아 실행 계획을 수립합니다. 개발자는 가독성이 좋은 순서대로 조건을 작성하면 됩니다.&lt;/p&gt;
&lt;h4 data-path-to-node=&quot;37&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;37&quot;&gt;3) 내림차순 인덱스 (Descending Indexes)&lt;/b&gt;&lt;/h4&gt;
&lt;p data-path-to-node=&quot;38&quot; data-ke-size=&quot;size16&quot;&gt;5.7까지는 문법적으로만 존재했던 내림차순 인덱스가 8.0에서 실제로 구현되었습니다. ORDER BY col DESC와 결합된 WHERE 조건에서 더 나은 성능을 보여줍니다.&lt;/p&gt;
&lt;hr data-path-to-node=&quot;39&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-path-to-node=&quot;40&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;40&quot;&gt;마무리 및 실전 요약&lt;/b&gt;&lt;/h3&gt;
&lt;p data-path-to-node=&quot;41&quot; data-ke-size=&quot;size16&quot;&gt;WHERE 절은 단순한 조건문이 아니라, DB 성능을 좌우하는 &lt;b data-index-in-node=&quot;35&quot; data-path-to-node=&quot;41&quot;&gt;전략적 도구&lt;/b&gt;입니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;42&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;42&quot;&gt;✅ 실전 개발자를 위한 3가지 Tip:&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-path-to-node=&quot;43&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;43,0,0&quot;&gt;컬럼은 건드리지 않는다:&lt;/b&gt; WHERE col * 2 = 10 대신 WHERE col = 10 / 2로 작성하여 인덱스를 보호하세요.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;43,1,0&quot;&gt;EXPLAIN을 습관화하자:&lt;/b&gt; 쿼리 앞에 EXPLAIN을 붙여 type이 ALL(Full Scan)인지 ref/range(Index Scan)인지 확인하는 습관을 들이세요.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;43,2,0&quot;&gt;8.0을 쓴다면 함수 인덱스를 고려하자:&lt;/b&gt; 레거시 쿼리 튜닝 시, 쿼리 수정이 어렵다면 Functional Index가 구세주가 될 수 있습니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-path-to-node=&quot;44&quot; data-ke-size=&quot;size16&quot;&gt;더 깊은 내용은 아래 공식 문서를 참고해 보세요. 올바른 WHERE 절 사용으로 여러분의 퇴근 시간이 빨라지길 바랍니다!&lt;/p&gt;
&lt;hr data-path-to-node=&quot;45&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-path-to-node=&quot;46&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;46&quot;&gt;  공식 문서 (Reference):&lt;/b&gt; &lt;a href=&quot;https://dev.mysql.com/doc/refman/8.0/en/where-optimization.html&quot; data-ved=&quot;0CAAQ_4QMahgKEwjEl6CAkbKSAxUAAAAAHQAAAAAQnAQ&quot; data-hveid=&quot;0&quot;&gt;MySQL 8.0 Reference Manual - Optimization (WHERE Clause Optimization)&lt;/a&gt;&lt;/p&gt;</description>
      <category>SQL/MYSQL</category>
      <category>MySQL</category>
      <category>where</category>
      <author>Ant_U</author>
      <guid isPermaLink="true">https://dbaant.tistory.com/271</guid>
      <comments>https://dbaant.tistory.com/271#entry271comment</comments>
      <pubDate>Fri, 30 Jan 2026 11:02:46 +0900</pubDate>
    </item>
    <item>
      <title>[MySQL] DISTINCT: 중복된 데이터를 세련되게 처리하는 기술 (기초부터 성능 최적화까지)</title>
      <link>https://dbaant.tistory.com/270</link>
      <description>&lt;p data-path-to-node=&quot;1&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;3&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;3&quot; data-ke-size=&quot;size16&quot;&gt;데이터베이스를 다루다 보면 가장 흔하게 마주치는 문제 중 하나가 바로 **'중복 데이터'**입니다. 단순히 &quot;서울에 사는 고객 명단을 뽑아줘&quot;라는 요청을 받았을 때, 동일한 고객이 여러 번 구매했다고 해서 명단에 같은 이름이 수십 번 등장한다면 곤란하겠죠?&lt;/p&gt;
&lt;p data-path-to-node=&quot;4&quot; data-ke-size=&quot;size16&quot;&gt;이때 등장하는 구세주가 바로 MySQL의 DISTINCT입니다. 오늘은 주니어 개발자에게는 확실한 기초를, 시니어 개발자에게는 성능 최적화와 버전별 동작 차이에 대한 인사이트를 제공하는 &lt;b data-index-in-node=&quot;104&quot; data-path-to-node=&quot;4&quot;&gt;MySQL DISTINCT 완전 정복 가이드&lt;/b&gt;를 준비했습니다.&lt;/p&gt;
&lt;hr data-path-to-node=&quot;5&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-path-to-node=&quot;6&quot; data-ke-size=&quot;size26&quot;&gt;1. DISTINCT의 기본: &quot;중복은 거절한다&quot;&lt;/h2&gt;
&lt;p data-path-to-node=&quot;7&quot; data-ke-size=&quot;size16&quot;&gt;가장 직관적인 사용법부터 알아보겠습니다. DISTINCT는 SELECT 문 바로 뒤에 위치하여, 조회 결과에서 중복된 행(Row)을 제거하고 유니크한 값만 남깁니다.&lt;/p&gt;
&lt;h3 data-path-to-node=&quot;8&quot; data-ke-size=&quot;size23&quot;&gt;기본 문법과 예제&lt;/h3&gt;
&lt;p data-path-to-node=&quot;9&quot; data-ke-size=&quot;size16&quot;&gt;상상해봅시다. orders 테이블에 고객들이 주문한 내역이 쌓여 있습니다.&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwiS9trj5q2SAxUAAAAAHQAAAAAQ9wY&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;SELECT city FROM orders;
-- 결과: 서울, 부산, 서울, 대구, 부산, 서울 ... (중복 발생)
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-path-to-node=&quot;11&quot; data-ke-size=&quot;size16&quot;&gt;이때 DISTINCT를 사용하면 깔끔하게 정리됩니다.&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-path-to-node=&quot;11&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwiS9trj5q2SAxUAAAAAHQAAAAAQ-AY&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;SELECT DISTINCT city FROM orders;
-- 결과: 서울, 부산, 대구 (중복 제거됨)
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;blockquote data-path-to-node=&quot;13&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-path-to-node=&quot;13,0&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;13,0&quot;&gt;초보자를 위한 팁:&lt;/b&gt; DISTINCT는 특정 컬럼 하나에만 적용되는 함수가 아닙니다. SELECT DISTINCT city, country처럼 여러 컬럼을 나열하면, &lt;b data-index-in-node=&quot;92&quot; data-path-to-node=&quot;13,0&quot;&gt;나열된 모든 컬럼의 조합&lt;/b&gt;이 중복되는 경우를 제거합니다. (즉, city와 country가 '모두' 같아야 중복으로 간주합니다.)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-path-to-node=&quot;14&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-path-to-node=&quot;15&quot; data-ke-size=&quot;size26&quot;&gt;2. DISTINCT와 GROUP BY: 영원한 라이벌?&lt;/h2&gt;
&lt;p data-path-to-node=&quot;16&quot; data-ke-size=&quot;size16&quot;&gt;많은 개발자분들이 면접 질문이나 실무에서 헷갈려 하는 부분입니다. &lt;i data-index-in-node=&quot;37&quot; data-path-to-node=&quot;16&quot;&gt;&quot;중복을 제거할 때 GROUP BY를 써도 되는데, 왜 DISTINCT가 따로 있나요?&quot;&lt;/i&gt;&lt;/p&gt;
&lt;p data-path-to-node=&quot;17&quot; data-ke-size=&quot;size16&quot;&gt;결론부터 말씀드리면, &lt;b data-index-in-node=&quot;12&quot; data-path-to-node=&quot;17&quot;&gt;&quot;단순 중복 제거&quot;가 목적이라면 DISTINCT가, &quot;집계(Sum, Avg 등)&quot;가 목적이라면 GROUP BY가 적합합니다.&lt;/b&gt; 하지만 내부 동작에는 미묘한 차이가 있습니다.&lt;/p&gt;
&lt;h3 data-path-to-node=&quot;18&quot; data-ke-size=&quot;size23&quot;&gt;동작 원리의 차이와 버전별 변화 (MySQL 5.7 vs 8.0)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;19&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;19,0,0&quot;&gt;MySQL 5.7 및 이전 버전:&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;19,0,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;GROUP BY를 사용하면 그룹핑과 동시에 **암묵적인 정렬(Sorting)**이 발생했습니다. 따라서 정렬이 필요 없는 단순 중복 제거에 GROUP BY를 쓰면 불필요한 정렬 오버헤드가 발생할 수 있었습니다.&lt;/li&gt;
&lt;li&gt;반면 DISTINCT는 정렬을 보장하지 않으며 중복만 제거합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;19,1,0&quot;&gt;MySQL 8.0 이후:&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;19,1,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;19,1,1,0,0&quot;&gt;중요한 변화:&lt;/b&gt; MySQL 8.0부터는 GROUP BY의 암묵적 정렬 기능이 제거되었습니다. 이제 GROUP BY도 정렬을 하려면 반드시 ORDER BY를 명시해야 합니다.&lt;/li&gt;
&lt;li&gt;따라서 최신 버전에서는 두 구문의 성능 차이가 줄어들었지만, &lt;b data-index-in-node=&quot;34&quot; data-path-to-node=&quot;19,1,1,1,0&quot;&gt;코드의 가독성(의도 표현)&lt;/b&gt; 측면에서 단순 중복 제거에는 여전히 DISTINCT를 사용하는 것이 권장됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-path-to-node=&quot;20&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-path-to-node=&quot;21&quot; data-ke-size=&quot;size26&quot;&gt;3. 성능 최적화: 인덱스(Index)라는 날개를 달자&lt;/h2&gt;
&lt;p data-path-to-node=&quot;22&quot; data-ke-size=&quot;size16&quot;&gt;DISTINCT는 공짜가 아닙니다. 데이터베이스는 중복을 찾아내기 위해 내부적으로 **임시 테이블(Temporary Table)**을 생성하거나 데이터를 정렬하는 비싼 작업을 수행합니다. 데이터가 수백만 건이라면 쿼리 속도가 현저히 느려질 수 있습니다.&lt;/p&gt;
&lt;h3 data-path-to-node=&quot;23&quot; data-ke-size=&quot;size23&quot;&gt;커버링 인덱스 (Covering Index) 활용&lt;/h3&gt;
&lt;p data-path-to-node=&quot;24&quot; data-ke-size=&quot;size16&quot;&gt;가장 강력한 최적화 방법은 **인덱스만으로 쿼리를 처리하는 것(커버링 인덱스)**입니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;25&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어 orders 테이블의 city 컬럼에 인덱스가 걸려 있다고 가정해 봅시다.&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwiS9trj5q2SAxUAAAAAHQAAAAAQ-QY&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;ada&quot;&gt;&lt;code&gt;-- 인덱스가 없는 경우:
-- 1. 테이블의 모든 데이터를 읽음 (Full Table Scan)
-- 2. 임시 테이블을 만들어 중복 제거 수행
-- -&amp;gt; 느림!

-- 인덱스가 있는 경우 (idx_city):
-- 1. 정렬된 인덱스 트리만 스캔하며 중복을 건너뜀 (Loose Index Scan 등)
-- -&amp;gt; 매우 빠름!
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-path-to-node=&quot;27&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;blockquote data-path-to-node=&quot;28&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-path-to-node=&quot;28,0&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;28,0&quot;&gt;고급 팁:&lt;/b&gt; COUNT(DISTINCT column)을 사용할 때도 인덱스의 유무는 성능에 결정적인 영향을 미칩니다. 가능한 한 DISTINCT 대상 컬럼은 인덱스를 태우는 것이 좋습니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-path-to-node=&quot;29&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-path-to-node=&quot;30&quot; data-ke-size=&quot;size26&quot;&gt;4. 주의사항: NULL의 함정&lt;/h2&gt;
&lt;p data-path-to-node=&quot;31&quot; data-ke-size=&quot;size16&quot;&gt;DISTINCT를 사용할 때 자주 실수하는 부분이 바로 NULL 값의 처리입니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;32&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;32,0,0&quot;&gt;원칙:&lt;/b&gt; DISTINCT는 &lt;b data-index-in-node=&quot;14&quot; data-path-to-node=&quot;32,0,0&quot;&gt;NULL도 하나의 값으로 취급&lt;/b&gt;하여 중복을 제거합니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;32,1,0&quot;&gt;결과:&lt;/b&gt; 만약 데이터에 NULL이 여러 개 있다면, DISTINCT 결과에는 &lt;b data-index-in-node=&quot;42&quot; data-path-to-node=&quot;32,1,0&quot;&gt;단 하나의 NULL&lt;/b&gt;만 포함됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-path-to-node=&quot;33&quot; data-ke-size=&quot;size16&quot;&gt;반면, COUNT(DISTINCT col)을 사용할 때는 NULL인 행은 &lt;b data-index-in-node=&quot;41&quot; data-path-to-node=&quot;33&quot;&gt;카운트에서 제외&lt;/b&gt;된다는 점을 기억해야 합니다. 이 미묘한 차이가 통계 데이터의 오차를 만들 수 있습니다.&lt;/p&gt;
&lt;hr data-path-to-node=&quot;34&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-path-to-node=&quot;35&quot; data-ke-size=&quot;size26&quot;&gt;결론 및 실무 팁&lt;/h2&gt;
&lt;p data-path-to-node=&quot;36&quot; data-ke-size=&quot;size16&quot;&gt;DISTINCT는 간단해 보이지만, 대용량 데이터 환경에서는 성능 병목의 원인이 되기도 합니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;37&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;37&quot;&gt;핵심 요약:&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-path-to-node=&quot;38&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;38,0,0&quot;&gt;단순 중복 제거&lt;/b&gt;는 DISTINCT, &lt;b data-index-in-node=&quot;20&quot; data-path-to-node=&quot;38,0,0&quot;&gt;집계가 필요하면&lt;/b&gt; GROUP BY를 사용하세요.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;38,1,0&quot;&gt;인덱스 활용은 필수&lt;/b&gt;입니다. DISTINCT 대상 컬럼에 인덱스를 추가하면 임시 테이블 생성을 막고 성능을 비약적으로 높일 수 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;38,2,0&quot;&gt;NULL 처리&lt;/b&gt;에 주의하세요. COUNT(DISTINCT)는 NULL을 세지 않습니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-path-to-node=&quot;39&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;39&quot;&gt;Next Step for You:&lt;/b&gt; 지금 운영 중인 쿼리에서 DISTINCT가 포함된 슬로우 쿼리가 있나요? 해당 컬럼에 인덱스가 적용되어 있는지 EXPLAIN 명령어로 실행 계획을 한 번 확인해 보세요. 작은 인덱스 하나가 극적인 성능 향상을 가져올 수 있습니다.&lt;/p&gt;
&lt;hr data-path-to-node=&quot;40&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-path-to-node=&quot;41&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;41&quot;&gt;관련 공식 문서:&lt;/b&gt; 더 깊이 있는 내용을 원하신다면 MySQL 공식 문서를 참고하세요. &lt;a href=&quot;https://dev.mysql.com/doc/refman/8.0/en/distinct-optimization.html&quot; data-ved=&quot;0CAAQ_4QMahgKEwiS9trj5q2SAxUAAAAAHQAAAAAQ-gY&quot; data-hveid=&quot;0&quot;&gt;MySQL 8.0 Reference Manual - DISTINCT Optimization&lt;/a&gt;&lt;/p&gt;</description>
      <category>SQL/MYSQL</category>
      <category>DISTINCT</category>
      <category>MySQL</category>
      <author>Ant_U</author>
      <guid isPermaLink="true">https://dbaant.tistory.com/270</guid>
      <comments>https://dbaant.tistory.com/270#entry270comment</comments>
      <pubDate>Thu, 29 Jan 2026 09:51:59 +0900</pubDate>
    </item>
    <item>
      <title>[MySQL] 백틱(`)의 역할과 올바른 사용법: 언제 써야 하고, 언제 피해야 할까?</title>
      <link>https://dbaant.tistory.com/269</link>
      <description>&lt;h2 data-path-to-node=&quot;0&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;p data-path-to-node=&quot;1&quot; data-ke-size=&quot;size16&quot;&gt;MySQL 쿼리를 작성하다 보면 테이블 이름이나 컬럼명을 **백틱(Backtick, `)**으로 감싸는 경우를 자주 보게 됩니다. 단순한 습관처럼 사용하는 분들도 있고, 어떤 경우에는 필수적으로 사용해야만 쿼리가 작동하기도 합니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;2&quot; data-ke-size=&quot;size16&quot;&gt;오늘은 MySQL의 식별자 구분 기호인 백틱의 정확한 개념과 버전별 차이, 그리고 실무에서 권장되는 사용 패턴을 정리해 보겠습니다.&lt;/p&gt;
&lt;hr data-path-to-node=&quot;3&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-path-to-node=&quot;4&quot; data-ke-size=&quot;size26&quot;&gt;1. 백틱(`)이란 무엇인가?&lt;/h2&gt;
&lt;p data-path-to-node=&quot;5&quot; data-ke-size=&quot;size16&quot;&gt;MySQL에서 백틱은 **식별자(Identifier)**를 감싸는 특수 기호입니다. 여기서 식별자란 데이터베이스명, 테이블명, 컬럼명, 인덱스명 등을 의미합니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;6&quot; data-ke-size=&quot;size16&quot;&gt;백틱의 핵심 역할은 **&quot;이 단어는 SQL 명령어가 아니라 내가 지정한 이름이다&quot;**라고 MySQL 엔진에게 알려주는 것입니다.&lt;/p&gt;
&lt;h3 data-path-to-node=&quot;7&quot; data-ke-size=&quot;size23&quot;&gt;왜 백틱이 필요한가요?&lt;/h3&gt;
&lt;p data-path-to-node=&quot;8&quot; data-ke-size=&quot;size16&quot;&gt;주로 다음과 같은 세 가지 상황에서 백틱이 필수적으로 사용됩니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;9&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,0,0&quot;&gt;예약어(Reserved Words) 사용 시:&lt;/b&gt; SELECT, ORDER, GROUP, TABLE 등 MySQL이 미리 정의한 키워드를 컬럼명으로 쓸 때 필요합니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,1,0&quot;&gt;특수 문자 및 공백 포함 시:&lt;/b&gt; 식별자에 공백이나 하이픈(-) 같은 특수 문자가 포함된 경우입니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;9,2,0&quot;&gt;숫자로 시작하는 식별자:&lt;/b&gt; 식별자 이름이 숫자로만 이루어졌거나 숫자로 시작할 때 혼동을 방지합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-path-to-node=&quot;10&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-path-to-node=&quot;11&quot; data-ke-size=&quot;size26&quot;&gt;2. 실무 사례로 보는 백틱의 활용&lt;/h2&gt;
&lt;h3 data-path-to-node=&quot;12&quot; data-ke-size=&quot;size23&quot;&gt;예약어와 충돌하는 경우 (주니어 개발자 주의)&lt;/h3&gt;
&lt;p data-path-to-node=&quot;13&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어, 주문 정보를 담는 테이블에서 '순서'를 나타내기 위해 ORDER라는 컬럼을 만들었다고 가정해 봅시다.&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwjU8ubA5a2SAxUAAAAAHQAAAAAQjgE&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;-- 에러 발생: ORDER는 예약어이기 때문입니다.
SELECT order FROM orders; 

-- 정상 작동: 백틱으로 식별자임을 명시합니다.
SELECT `order` FROM orders;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h3 data-path-to-node=&quot;15&quot; data-ke-size=&quot;size23&quot;&gt;공백이나 하이픈이 들어간 경우&lt;/h3&gt;
&lt;p data-path-to-node=&quot;16&quot; data-ke-size=&quot;size16&quot;&gt;가급적 권장되지 않지만, 만약 컬럼명에 공백이 있다면 백틱 없이는 쿼리 실행이 불가능합니다.&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwjU8ubA5a2SAxUAAAAAHQAAAAAQjwE&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;-- 에러 발생
SELECT user name FROM users;

-- 정상 작동
SELECT `user name` FROM users;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-path-to-node=&quot;18&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-path-to-node=&quot;19&quot; data-ke-size=&quot;size26&quot;&gt;3. MySQL 버전 변화와 백틱의 관계&lt;/h2&gt;
&lt;p data-path-to-node=&quot;20&quot; data-ke-size=&quot;size16&quot;&gt;시니어 개발자나 DBA라면 MySQL 버전에 따른 &lt;b data-index-in-node=&quot;28&quot; data-path-to-node=&quot;20&quot;&gt;예약어의 추가&lt;/b&gt;를 주의 깊게 살펴야 합니다.&lt;/p&gt;
&lt;h3 data-path-to-node=&quot;21&quot; data-ke-size=&quot;size23&quot;&gt;새로운 예약어의 등장&lt;/h3&gt;
&lt;p data-path-to-node=&quot;22&quot; data-ke-size=&quot;size16&quot;&gt;MySQL이 업데이트되면서 이전 버전에서는 예약어가 아니었던 단어가 예약어로 지정되는 경우가 있습니다. 대표적인 예가 &lt;b data-index-in-node=&quot;66&quot; data-path-to-node=&quot;22&quot;&gt;MySQL 8.0&lt;/b&gt;에서 추가된 WINDOW입니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;23&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;23,0,0&quot;&gt;MySQL 5.7:&lt;/b&gt; SELECT window FROM my_table; (정상 작동)&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;23,1,0&quot;&gt;MySQL 8.0:&lt;/b&gt; SELECT window FROM my_table; (&lt;b data-index-in-node=&quot;41&quot; data-path-to-node=&quot;23,1,0&quot;&gt;구문 에러 발생&lt;/b&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-path-to-node=&quot;24&quot; data-ke-size=&quot;size16&quot;&gt;8.0 버전부터 윈도우 함수(Window Functions)가 도입되면서 WINDOW가 예약어가 되었기 때문입니다. 이처럼 버전을 업그레이드할 때 기존 코드가 깨지는 것을 방지하기 위해, ORM(Hibernate, Sequelize 등) 도구들은 모든 식별자를 백틱으로 자동 매핑하는 전략을 취하곤 합니다.&lt;/p&gt;
&lt;h3 data-path-to-node=&quot;25&quot; data-ke-size=&quot;size23&quot;&gt;ANSI_QUOTES 모드&lt;/h3&gt;
&lt;p data-path-to-node=&quot;26&quot; data-ke-size=&quot;size16&quot;&gt;MySQL은 기본적으로 백틱을 쓰지만, 설정(sql_mode)에 따라 표준 SQL처럼 쌍따옴표(&quot;)를 식별자 구분 기호로 쓸 수도 있습니다.&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwjU8ubA5a2SAxUAAAAAHQAAAAAQkAE&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;-- ANSI_QUOTES 모드가 활성화된 경우
SET sql_mode = 'ANSI_QUOTES';
SELECT &quot;column_name&quot; FROM table_name;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-path-to-node=&quot;28&quot; data-ke-size=&quot;size16&quot;&gt;타 데이터베이스(PostgreSQL, Oracle)와 호환성을 유지해야 하는 프로젝트라면 이 설정을 고려하기도 합니다.&lt;/p&gt;
&lt;hr data-path-to-node=&quot;29&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-path-to-node=&quot;30&quot; data-ke-size=&quot;size26&quot;&gt;4. 결론 및 실무 권장 사항&lt;/h2&gt;
&lt;p data-path-to-node=&quot;31&quot; data-ke-size=&quot;size16&quot;&gt;백틱은 예기치 못한 에러를 막아주는 안전장치이지만, 남용하면 쿼리의 가독성을 떨어뜨릴 수 있습니다.&lt;/p&gt;
&lt;h3 data-path-to-node=&quot;32&quot; data-ke-size=&quot;size23&quot;&gt;  실무를 위한 3가지 팁&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-path-to-node=&quot;33&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;33,0,0&quot;&gt;예약어 사용 지양:&lt;/b&gt; 가급적 order, group, select와 같은 단어를 컬럼명으로 쓰지 마세요. order_count, group_name 처럼 의미를 구체화하면 백틱 없이도 안전합니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;33,1,0&quot;&gt;명명 규칙 준수:&lt;/b&gt; 식별자에는 영문 소문자, 숫자, 언더바(_)만 사용하는 관습을 들이세요. 공백이나 하이픈을 피하면 백틱 의존도를 낮출 수 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;33,2,0&quot;&gt;동적 쿼리/마이그레이션 시 필수 사용:&lt;/b&gt; 프로그램 코드에서 동적으로 테이블이나 컬럼을 생성해야 한다면, 미래의 MySQL 버전에서 어떤 예약어가 추가될지 모르므로 반드시 백틱으로 감싸는 것이 안전합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-path-to-node=&quot;34&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-path-to-node=&quot;35&quot; data-ke-size=&quot;size26&quot;&gt;공식 문서 링크&lt;/h2&gt;
&lt;p data-path-to-node=&quot;36&quot; data-ke-size=&quot;size16&quot;&gt;MySQL 식별자 및 백틱에 대한 자세한 기술적 사양은 아래 공식 문서에서 확인하실 수 있습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;37&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://www.google.com/search?q=https://dev.mysql.com/doc/refman/8.0/en/identifiers.html&quot; data-ved=&quot;0CAAQ_4QMahgKEwjU8ubA5a2SAxUAAAAAHQAAAAAQkQE&quot; data-hveid=&quot;0&quot;&gt;MySQL 8.0 Reference Manual - Schema Object Names&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>SQL/MYSQL</category>
      <category>backtick</category>
      <category>MySQL</category>
      <author>Ant_U</author>
      <guid isPermaLink="true">https://dbaant.tistory.com/269</guid>
      <comments>https://dbaant.tistory.com/269#entry269comment</comments>
      <pubDate>Wed, 28 Jan 2026 17:19:01 +0900</pubDate>
    </item>
    <item>
      <title>[MySQL] 습관적으로 쓴 SELECT * 가 당신의 DB를 느리게 만드는 이유 (feat. 실행 계획 분석)</title>
      <link>https://dbaant.tistory.com/268</link>
      <description>&lt;p data-path-to-node=&quot;0&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-path-to-node=&quot;2&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;p data-path-to-node=&quot;3&quot; data-ke-size=&quot;size16&quot;&gt;&quot;그냥 다 가져와서 애플리케이션에서 필요한 것만 쓰면 편하지 않나요?&quot;&lt;/p&gt;
&lt;p data-path-to-node=&quot;4&quot; data-ke-size=&quot;size16&quot;&gt;개발 초기 단계에서 흔히 하는 생각입니다. 기능 구현이 급할 때 SELECT *는 마법의 키워드처럼 느껴지죠. 컬럼이 추가되거나 이름이 바뀌어도 쿼리를 고칠 필요가 없으니까요. 하지만 서비스가 커지고 데이터가 쌓이기 시작하면, 이 편리함은 &lt;b data-index-in-node=&quot;134&quot; data-path-to-node=&quot;4&quot;&gt;데이터베이스의 가장 큰 병목&lt;/b&gt;으로 돌아옵니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;5&quot; data-ke-size=&quot;size16&quot;&gt;오늘은 왜 SELECT *가 DB 성능의 '조용한 살인자'가 되는지, 그리고 MySQL 실행 계획(EXPLAIN)을 통해 이를 어떻게 눈으로 확인할 수 있는지 알아보겠습니다.&lt;/p&gt;
&lt;hr data-path-to-node=&quot;6&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-path-to-node=&quot;7&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;7&quot;&gt;1. 커버링 인덱스(Covering Index)를 무용지물로 만든다&lt;/b&gt;&lt;/h3&gt;
&lt;p data-path-to-node=&quot;8&quot; data-ke-size=&quot;size16&quot;&gt;SELECT *가 성능에 악영향을 미치는 가장 결정적인 이유는 &lt;b data-index-in-node=&quot;35&quot; data-path-to-node=&quot;8&quot;&gt;인덱스 활용도&lt;/b&gt;를 떨어뜨리기 때문입니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;9&quot; data-ke-size=&quot;size16&quot;&gt;MySQL의 최적화 기법 중 &lt;b data-index-in-node=&quot;16&quot; data-path-to-node=&quot;9&quot;&gt;커버링 인덱스&lt;/b&gt;라는 개념이 있습니다. 쿼리가 필요한 모든 데이터를 인덱스(Index)에서만 찾을 수 있다면, 실제 데이터 파일(Table Data)을 열어보지 않고 인덱스 트리기만 타고 처리를 끝내는 방식입니다. 이는 책의 '목차'만 보고 답을 찾는 것과 같아서 속도가 비약적으로 빠릅니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;10&quot; data-ke-size=&quot;size16&quot;&gt;하지만 SELECT *를 쓰면 인덱스에 포함되지 않은 컬럼까지 모두 가져와야 하므로, MySQL은 어쩔 수 없이 실제 데이터 행을 찾아가는 &lt;b data-index-in-node=&quot;78&quot; data-path-to-node=&quot;10&quot;&gt;랜덤 I/O(Random I/O)&lt;/b&gt; 작업을 수행하게 됩니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;11&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;11,0,0&quot;&gt;SELECT col1 FROM table (인덱스 있음):&lt;/b&gt; 인덱스만 읽고 끝. (빠름, 메모리 효율적)&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;11,1,0&quot;&gt;SELECT * FROM table:&lt;/b&gt; 인덱스를 탔더라도, 나머지 컬럼을 가지러 디스크의 데이터 블록을 다시 읽어야 함. (느림, 디스크 I/O 발생)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-path-to-node=&quot;12&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;12&quot;&gt;2. 네트워크와 메모리 리소스의 낭비&lt;/b&gt;&lt;/h3&gt;
&lt;p data-path-to-node=&quot;13&quot; data-ke-size=&quot;size16&quot;&gt;불필요한 컬럼, 특히 TEXT나 LONGBLOB 같은 대용량 데이터 타입이 포함되어 있다면 문제는 더 심각해집니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;14&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;14,0,0&quot;&gt;네트워크 부하:&lt;/b&gt; DB 서버에서 애플리케이션 서버로 전송되는 데이터 양(Packet Size)이 불필요하게 커집니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;14,1,0&quot;&gt;메모리 낭비:&lt;/b&gt; MySQL 내부의 임시 테이블이나 애플리케이션의 메모리 버퍼가 더 많은 공간을 차지하게 되어, 동시 접속자가 많을 경우 OOM(Out of Memory)의 원인이 될 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-path-to-node=&quot;15&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;p data-path-to-node=&quot;15,0&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;15,0&quot;&gt;주니어 개발자를 위한 비유:&lt;/b&gt;&lt;/p&gt;
&lt;p data-path-to-node=&quot;15,0&quot; data-ke-size=&quot;size16&quot;&gt;편의점에서 &quot;물 한 병&quot;만 사면 되는데, SELECT *는 편의점 진열대의 &lt;b data-index-in-node=&quot;58&quot; data-path-to-node=&quot;15,0&quot;&gt;모든 물건을 장바구니에 담아서&lt;/b&gt; 계산대로 가져온 뒤, 계산 직전에 &quot;아, 물 빼고 나머지는 다 반품할게요&quot;라고 하는 것과 같습니다. 계산대(CPU)와 점원(I/O) 모두 불필요한 고생을 하게 되죠.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-path-to-node=&quot;16&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-path-to-node=&quot;17&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;17&quot;&gt;3. 실행 계획(EXPLAIN)으로 범인 색출하기&lt;/b&gt;&lt;/h3&gt;
&lt;p data-path-to-node=&quot;18&quot; data-ke-size=&quot;size16&quot;&gt;실제로 내 쿼리가 인덱스를 잘 타고 있는지 확인하려면 EXPLAIN 명령어를 사용해야 합니다.&lt;/p&gt;
&lt;h4 data-path-to-node=&quot;19&quot; data-ke-size=&quot;size20&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;19&quot;&gt;MySQL 5.7 vs 8.0 확인 방법&lt;/b&gt;&lt;/h4&gt;
&lt;p data-path-to-node=&quot;20&quot; data-ke-size=&quot;size16&quot;&gt;쿼리 앞에 EXPLAIN을 붙여서 실행해 보세요.&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwjMlqbhzaiSAxUAAAAAHQAAAAAQsgk&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;EXPLAIN SELECT * FROM users WHERE status = 'active';
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-path-to-node=&quot;22&quot; data-ke-size=&quot;size16&quot;&gt;여기서 가장 눈여겨봐야 할 항목은 &lt;b data-index-in-node=&quot;19&quot; data-path-to-node=&quot;22&quot;&gt;Extra&lt;/b&gt; 컬럼입니다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-path-to-node=&quot;23&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Extra 컬럼 값&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;의미&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;상태&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;23,1,0,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;23,1,0,0&quot;&gt;Using index&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;23,1,1,0&quot;&gt;실제 데이터 접근 없이 &lt;b data-index-in-node=&quot;13&quot; data-path-to-node=&quot;23,1,1,0&quot;&gt;커버링 인덱스&lt;/b&gt;만으로 처리됨&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;23,1,2,0&quot;&gt;✅ &lt;b data-index-in-node=&quot;2&quot; data-path-to-node=&quot;23,1,2,0&quot;&gt;최고 (Best)&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;23,2,0,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;23,2,0,0&quot;&gt;Using where&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;23,2,1,0&quot;&gt;인덱스를 통해 검색했지만, 데이터를 가져오기 위해 테이블 접근 발생&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;23,2,2,0&quot;&gt;⚠️ &lt;b data-index-in-node=&quot;3&quot; data-path-to-node=&quot;23,2,2,0&quot;&gt;주의 (Normal)&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;23,3,0,0&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;23,3,0,0&quot;&gt;Using filesort&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;23,3,1,0&quot;&gt;인덱스를 타지 못해 별도의 정렬 작업 발생 (SELECT *가 원인일 수 있음)&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;23,3,2,0&quot;&gt;❌ &lt;b data-index-in-node=&quot;2&quot; data-path-to-node=&quot;23,3,2,0&quot;&gt;나쁨 (Bad)&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-path-to-node=&quot;24&quot; data-ke-size=&quot;size16&quot;&gt;만약 필요한 컬럼만 명시한 쿼리(SELECT id, name ...)에서는 Using index가 나오는데, SELECT *로 바꿨을 때 이 문구가 사라진다면, &lt;b data-index-in-node=&quot;90&quot; data-path-to-node=&quot;24&quot;&gt;불필요한 디스크 읽기&lt;/b&gt;가 발생하고 있다는 확실한 증거입니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;25&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;25&quot;&gt;&amp;nbsp; Tip: MySQL 8.0 사용자라면?&lt;/b&gt;&lt;/p&gt;
&lt;p data-path-to-node=&quot;25&quot; data-ke-size=&quot;size16&quot;&gt;MySQL 8.0부터는 EXPLAIN ANALYZE를 사용할 수 있습니다. 예측값이 아닌 &lt;b data-index-in-node=&quot;75&quot; data-path-to-node=&quot;25&quot;&gt;실제 실행 시간&lt;/b&gt;과 &lt;b data-index-in-node=&quot;85&quot; data-path-to-node=&quot;25&quot;&gt;스캔한 행의 수&lt;/b&gt;를 보여주므로 훨씬 정확한 분석이 가능합니다.&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwjMlqbhzaiSAxUAAAAAHQAAAAAQtgk&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;EXPLAIN ANALYZE SELECT * FROM users WHERE status = 'active';
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-path-to-node=&quot;27&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-path-to-node=&quot;28&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;28&quot;&gt;마무리 및 실전 팁&lt;/b&gt;&lt;/h3&gt;
&lt;p data-path-to-node=&quot;29&quot; data-ke-size=&quot;size16&quot;&gt;SELECT *는 개발 편의성을 주지만, 운영 환경에서는 성능 저하의 시한폭탄이 될 수 있습니다. 특히 트래픽이 몰리는 서비스라면 사소한 I/O 차이가 장애로 이어질 수 있음을 명심해야 합니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;30&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;30&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;30&quot;&gt;&amp;nbsp;실전 적용 3가지 원칙&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-path-to-node=&quot;31&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;31,0,0&quot;&gt;필요한 컬럼만 명시하라:&lt;/b&gt; 귀찮더라도 SELECT id, email, created_at 처럼 필요한 컬럼을 나열하는 습관을 들이세요.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;31,1,0&quot;&gt;커버링 인덱스를 노려라:&lt;/b&gt; 자주 조회되는 컬럼 조합은 인덱스로 묶어두면 SELECT 성능을 극대화할 수 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;31,2,0&quot;&gt;애플리케이션 코드 리뷰:&lt;/b&gt; ORM(JPA, Hibernate 등)을 쓸 때 의도치 않게 전체 컬럼을 조회하고 있지 않은지 로그를 통해 점검하세요.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-path-to-node=&quot;32&quot; data-ke-size=&quot;size16&quot;&gt;더 자세한 실행 계획 분석 방법이 궁금하다면 MySQL 공식 문서를 참고해 보시길 바랍니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;33&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;33&quot;&gt;[공식 문서] MySQL EXPLAIN Output Format&lt;/b&gt;&lt;/p&gt;
&lt;p data-path-to-node=&quot;33&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://dev.mysql.com/doc/refman/8.0/en/explain-output.html&quot;&gt;https://dev.mysql.com/doc/refman/8.0/en/explain-output.html&lt;/a&gt;&lt;/p&gt;</description>
      <category>SQL/MYSQL</category>
      <category>explain</category>
      <category>MySQL</category>
      <category>select</category>
      <author>Ant_U</author>
      <guid isPermaLink="true">https://dbaant.tistory.com/268</guid>
      <comments>https://dbaant.tistory.com/268#entry268comment</comments>
      <pubDate>Tue, 27 Jan 2026 12:26:06 +0900</pubDate>
    </item>
    <item>
      <title>[MySQL] 에러 핸들링의 숨은 조력자: SHOW ERRORS 문 완벽 가이드</title>
      <link>https://dbaant.tistory.com/266</link>
      <description>&lt;p data-path-to-node=&quot;1&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-path-to-node=&quot;3&quot; data-ke-size=&quot;size23&quot;&gt;에러 메시지, 그 너머를 보다&lt;/h3&gt;
&lt;p data-path-to-node=&quot;4&quot; data-ke-size=&quot;size16&quot;&gt;데이터베이스를 다루다 보면 에러는 피할 수 없는 일상입니다. 쿼리를 실행했을 때 붉은색 텍스트로 나타나는 &quot;Syntax error&quot;나 &quot;Table doesn't exist&quot; 같은 메시지는 개발자에게 신호를 보냅니다. 하지만 복잡한 트랜잭션이나 여러 단계의 쿼리를 수행하는 과정에서 단순히 &quot;에러가 났다&quot;는 사실만으로는 부족할 때가 있습니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;5&quot; data-ke-size=&quot;size16&quot;&gt;MySQL의 SHOW ERRORS 문은 바로 이 지점에서 빛을 발합니다. 이 명령은 가장 최근에 실행된 문장에서 발생한 오류들에 대한 상세한 진단 정보를 제공합니다. 단순히 화면에 출력되고 사라지는 에러 메시지를 넘어, 서버가 내부적으로 기억하고 있는 에러 버퍼의 내용을 조회하여 정확한 디버깅을 돕습니다. 주니어 개발자에게는 낯설 수 있지만, 숙련된 DBA에게는 문제 해결의 속도를 높여주는 필수적인 도구입니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;6&quot; data-ke-size=&quot;size16&quot;&gt;이 글에서는 SHOW ERRORS의 기본 개념부터 실무적인 활용법, 그리고 MySQL 버전에 따른 문맥까지 깊이 있게 다뤄보겠습니다.&lt;/p&gt;
&lt;hr data-path-to-node=&quot;7&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-path-to-node=&quot;8&quot; data-ke-size=&quot;size23&quot;&gt;1. SHOW ERRORS란 무엇인가?&lt;/h3&gt;
&lt;p data-path-to-node=&quot;9&quot; data-ke-size=&quot;size16&quot;&gt;기본적으로 MySQL 클라이언트(워크벤치나 터미널 등)는 쿼리 실패 시 첫 번째 에러 메시지를 자동으로 보여줍니다. 하지만 하나의 쿼리 실행으로 인해 여러 개의 에러가 발생했다면 어떻게 될까요? 혹은 저장 프로시저 내부에서 발생한 에러를 구체적으로 확인하고 싶다면요?&lt;/p&gt;
&lt;p data-path-to-node=&quot;10&quot; data-ke-size=&quot;size16&quot;&gt;SHOW ERRORS는 현재 세션의 에러 버퍼에 저장된 오류 정보를 표 형태로 보여주는 진단 명령입니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;11&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;11&quot;&gt;기본 문법:&lt;/b&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwib6sLr756SAxUAAAAAHQAAAAAQ-gM&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;SHOW ERRORS [LIMIT [offset,] row_count]
SHOW COUNT(*) ERRORS
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-path-to-node=&quot;13&quot; data-ke-size=&quot;size16&quot;&gt;이 명령은 Code, Message, Type 등의 정보를 반환합니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;14&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;14,0,0&quot;&gt;Level:&lt;/b&gt; Error, Warning, Note 등의 수준을 나타냅니다 (SHOW ERRORS는 주로 Error를 다루지만 메커니즘은 SHOW WARNINGS와 공유됩니다).&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;14,1,0&quot;&gt;Code:&lt;/b&gt; MySQL 에러 코드 (숫자)입니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;14,2,0&quot;&gt;Message:&lt;/b&gt; 사람이 읽을 수 있는 상세 에러 설명입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-path-to-node=&quot;15&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어, 존재하지 않는 테이블을 조회하려 했을 때:&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwib6sLr756SAxUAAAAAHQAAAAAQ-wM&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;SELECT * FROM non_existent_table;
-- ERROR 1146 (42S02): Table 'test.non_existent_table' doesn't exist

SHOW ERRORS;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-path-to-node=&quot;17&quot; data-ke-size=&quot;size16&quot;&gt;위와 같이 실행하면 방금 발생한 에러에 대한 구조화된 정보를 다시 확인할 수 있습니다.&lt;/p&gt;
&lt;hr data-path-to-node=&quot;18&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-path-to-node=&quot;19&quot; data-ke-size=&quot;size23&quot;&gt;2. SHOW ERRORS vs SHOW WARNINGS&lt;/h3&gt;
&lt;p data-path-to-node=&quot;20&quot; data-ke-size=&quot;size16&quot;&gt;MySQL을 처음 접하는 분들이 가장 헷갈려 하는 부분이 바로 SHOW ERRORS와 SHOW WARNINGS의 차이입니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;21&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;21,0,0&quot;&gt;SHOW ERRORS:&lt;/b&gt; 오직 **오류(Errors)**만 보여줍니다. 쿼리 실행을 중단시킨 심각한 문제들입니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;21,1,0&quot;&gt;SHOW WARNINGS:&lt;/b&gt; 오류뿐만 아니라 **경고(Warnings)**와 **참고(Notes)**까지 모두 포함하여 보여줍니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-path-to-node=&quot;22&quot; data-ke-size=&quot;size16&quot;&gt;실무적으로는 SHOW WARNINGS가 상위 호환에 가깝기 때문에 더 자주 사용되곤 합니다. 하지만, 수많은 경고 메시지(예: 데이터 잘림, 비표준 문법 사용 등) 속에서 **&quot;진짜 실행을 막은 원인&quot;**만 빠르게 필터링하고 싶다면 SHOW ERRORS가 훨씬 명확합니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;23&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;23&quot;&gt;실무 팁:&lt;/b&gt; 대량의 데이터 삽입 작업(LOAD DATA INFILE 등)을 수행할 때, 수천 건의 경고 속에 치명적인 에러가 섞여 있을 수 있습니다. 이때 SHOW ERRORS를 사용하면 노이즈를 제거하고 핵심 문제에만 집중할 수 있습니다.&lt;/p&gt;
&lt;hr data-path-to-node=&quot;24&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-path-to-node=&quot;25&quot; data-ke-size=&quot;size23&quot;&gt;3. MySQL 버전 흐름과 GET DIAGNOSTICS&lt;/h3&gt;
&lt;p data-path-to-node=&quot;26&quot; data-ke-size=&quot;size16&quot;&gt;SHOW ERRORS는 MySQL 4.1부터 지원된 매우 오래되고 안정적인 기능입니다. 하지만 현대적인 MySQL 개발, 특히 &lt;b data-index-in-node=&quot;71&quot; data-path-to-node=&quot;26&quot;&gt;MySQL 5.6 이상&lt;/b&gt;을 사용하고 있다면 중요한 변화를 인지해야 합니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;27&quot; data-ke-size=&quot;size16&quot;&gt;바로 SQL 표준 방식인 &lt;b data-index-in-node=&quot;14&quot; data-path-to-node=&quot;27&quot;&gt;GET DIAGNOSTICS&lt;/b&gt;의 도입입니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;28&quot; data-ke-size=&quot;size16&quot;&gt;SHOW ERRORS는 MySQL만의 비표준 확장 문법입니다. 따라서 애플리케이션 코드나 저장 프로시저(Stored Procedure) 내부에서 에러를 핸들링하고 변수에 할당하여 로직을 분기처리하기에는 적합하지 않습니다. SHOW 명령의 결과는 결과셋(Result Set)으로 반환되기 때문에 프로시저 내에서 SELECT ... INTO 처럼 변수에 담기 어렵기 때문입니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;29&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;29&quot;&gt;MySQL 5.6 이후의 권장 패턴:&lt;/b&gt; 저장 프로시저 내부에서 에러를 정교하게 처리해야 한다면 GET DIAGNOSTICS를 사용하는 것이 좋습니다.&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwib6sLr756SAxUAAAAAHQAAAAAQ_AM&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;-- MySQL 5.6+ 저장 프로시저 내부 예시
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
  GET DIAGNOSTICS CONDITION 1
    @p1 = RETURNED_SQLSTATE, @p2 = MESSAGE_TEXT;
  SELECT @p1 as SQLState, @p2 as ErrorMessage;
END;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-path-to-node=&quot;31&quot; data-ke-size=&quot;size16&quot;&gt;하지만 대화형 세션(터미널, 클라이언트 툴)에서 즉각적인 디버깅을 할 때는 여전히 SHOW ERRORS가 훨씬 간편하고 직관적입니다.&lt;/p&gt;
&lt;hr data-path-to-node=&quot;32&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-path-to-node=&quot;33&quot; data-ke-size=&quot;size23&quot;&gt;4. max_error_count 시스템 변수 활용하기&lt;/h3&gt;
&lt;p data-path-to-node=&quot;34&quot; data-ke-size=&quot;size16&quot;&gt;SHOW ERRORS가 보여줄 수 있는 에러의 개수는 무한하지 않습니다. 이는 시스템 변수 max_error_count에 의해 제어됩니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;35&quot; data-ke-size=&quot;size16&quot;&gt;기본값은 보통 64입니다. 즉, 서버는 최근 발생한 에러, 경고, 노트 등을 최대 64개까지만 기억합니다. 만약 대량의 배치 작업 중 수백 개의 에러가 발생했다면, 앞선 에러들은 버퍼에서 밀려나 SHOW ERRORS로 확인할 수 없게 됩니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;36&quot; data-ke-size=&quot;size16&quot;&gt;만약 더 많은 에러 로그를 확인해야 하는 상황이라면, 작업을 수행하기 전에 세션 레벨에서 이 값을 늘려주어야 합니다.&lt;/p&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwib6sLr756SAxUAAAAAHQAAAAAQ_QM&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;SET SESSION max_error_count = 1024;
-- 이후 쿼리 실행
SHOW ERRORS;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;hr data-path-to-node=&quot;38&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-path-to-node=&quot;39&quot; data-ke-size=&quot;size23&quot;&gt;결론 및 실무 활용 팁&lt;/h3&gt;
&lt;p data-path-to-node=&quot;40&quot; data-ke-size=&quot;size16&quot;&gt;SHOW ERRORS는 단순해 보이지만, 복잡한 문제 상황에서 개발자에게 명확한 시야를 제공하는 중요한 도구입니다. 특히 SHOW WARNINGS와 구분하여 치명적인 오류만 빠르게 솎아내고 싶을 때 유용합니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;41&quot; data-ke-size=&quot;size16&quot;&gt;마지막으로 실무에서 바로 적용할 수 있는 핵심 포인트를 정리해 드립니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;42&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;42&quot;&gt;Practical Takeaways:&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-path-to-node=&quot;43&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;43,0,0&quot;&gt;즉시 확인 습관:&lt;/b&gt; SHOW ERRORS는 가장 최근 실행된 문장(statement)의 정보만 담고 있습니다. 다른 쿼리를 실행하면 버퍼가 초기화되므로, 에러 발생 직후에 실행해야 합니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;43,1,0&quot;&gt;프로시저 vs 터미널:&lt;/b&gt; 터미널에서 직접 디버깅할 때는 SHOW ERRORS가 빠르고 편하지만, 저장 프로시저를 개발할 때는 표준 문법인 GET DIAGNOSTICS를 사용하는 것이 유지보수와 호환성 측면에서 유리합니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;43,2,0&quot;&gt;버퍼 크기 조절:&lt;/b&gt; 대량의 데이터 마이그레이션이나 배치 작업을 디버깅할 때는 max_error_count 값을 미리 늘려두어 중요한 에러 로그가 유실되지 않도록 하십시오.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-path-to-node=&quot;44&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-path-to-node=&quot;45&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;45&quot;&gt;관련 공식 문서:&lt;/b&gt; 더 깊이 있는 정보와 최신 스펙을 확인하려면 아래 링크를 참조하세요. &lt;a href=&quot;https://dev.mysql.com/doc/refman/8.0/en/show-errors.html&quot; data-ved=&quot;0CAAQ_4QMahgKEwib6sLr756SAxUAAAAAHQAAAAAQ_gM&quot; data-hveid=&quot;0&quot;&gt;MySQL 8.0 Reference Manual - SHOW ERRORS Statement&lt;/a&gt;&lt;/p&gt;</description>
      <category>SQL/MYSQL</category>
      <category>MySQL</category>
      <category>SHOW ERRORS</category>
      <author>Ant_U</author>
      <guid isPermaLink="true">https://dbaant.tistory.com/266</guid>
      <comments>https://dbaant.tistory.com/266#entry266comment</comments>
      <pubDate>Mon, 26 Jan 2026 10:56:30 +0900</pubDate>
    </item>
    <item>
      <title>[MySQL] 스토리지 엔진 확인의 첫걸음: SHOW ENGINES 문법 완벽 가이드</title>
      <link>https://dbaant.tistory.com/265</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-path-to-node=&quot;3&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-path-to-node=&quot;3&quot; data-ke-size=&quot;size23&quot;&gt;들어가며: 왜 스토리지 엔진을 확인해야 하는가?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-path-to-node=&quot;4&quot; data-ke-size=&quot;size16&quot;&gt;MySQL은 다른 관계형 데이터베이스 관리 시스템(RDBMS)과 구별되는 독특한 특징이 있습니다. 바로 &lt;b data-index-in-node=&quot;58&quot; data-path-to-node=&quot;4&quot;&gt;플러그인 방식의 스토리지 엔진(Pluggable Storage Engine) 아키텍처&lt;/b&gt;입니다. 이는 마치 자동차의 엔진을 교체하듯이, 필요에 따라 InnoDB, MyISAM, MEMORY 등 다양한 엔진을 선택하여 사용할 수 있다는 뜻입니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;5&quot; data-ke-size=&quot;size16&quot;&gt;데이터 무결성이 중요한 트랜잭션 처리가 필요할 때는 InnoDB를, 빠른 읽기 속도나 전문 검색(Full-text Search)이 과거에 중요했던 시점에는 MyISAM을 선택하는 식입니다. 하지만 내가 운영 중인 서버가 어떤 엔진을 지원하는지, 그리고 현재 &lt;b data-index-in-node=&quot;144&quot; data-path-to-node=&quot;5&quot;&gt;기본(Default)&lt;/b&gt; 엔진이 무엇인지 정확히 알지 못한다면 최적의 성능을 낼 수 없습니다. 이때 가장 기본이 되면서도 필수적인 명령어가 바로 SHOW ENGINES입니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;6&quot; data-ke-size=&quot;size16&quot;&gt;이번 포스팅에서는 주니어 개발자부터 숙련된 DBA까지 모두가 알아두어야 할 SHOW ENGINES 명령어의 활용법과 해석 방법을 알아보겠습니다.&lt;/p&gt;
&lt;hr data-path-to-node=&quot;7&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-path-to-node=&quot;8&quot; data-ke-size=&quot;size23&quot;&gt;1. SHOW ENGINES 명령어의 기본 이해&lt;/h3&gt;
&lt;p data-path-to-node=&quot;9&quot; data-ke-size=&quot;size16&quot;&gt;SHOW ENGINES는 현재 MySQL 서버 인스턴스가 지원하는 스토리지 엔진의 목록을 조회하는 명령어입니다. 이 명령어를 실행하면 서버에 로드된 엔진의 활성화 여부와 트랜잭션 지원 여부 등을 한눈에 파악할 수 있습니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;10&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;10&quot;&gt;기본 사용법&lt;/b&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;div data-ved=&quot;0CAAQhtANahgKEwiSqaGI-J2SAxUAAAAAHQAAAAAQzAM&quot; data-hveid=&quot;0&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;SHOW ENGINES;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-path-to-node=&quot;12&quot; data-ke-size=&quot;size16&quot;&gt;이 간단한 쿼리를 실행하면 다음과 같은 형태의 결과셋을 얻게 됩니다. (결과는 버전 및 설정에 따라 다를 수 있습니다.)&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-path-to-node=&quot;13&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;Engine&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;Support&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;Comment&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;Transactions&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;XA&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;Savepoints&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;13,1,0,0&quot;&gt;InnoDB&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;13,1,1,0&quot;&gt;DEFAULT&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;13,1,2,0&quot;&gt;Supports transactions, row-level locking, and foreign keys&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;13,1,3,0&quot;&gt;YES&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;13,1,4,0&quot;&gt;YES&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;13,1,5,0&quot;&gt;YES&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;13,2,0,0&quot;&gt;MRG_MYISAM&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;13,2,1,0&quot;&gt;YES&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;13,2,2,0&quot;&gt;Collection of identical MyISAM tables&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;13,2,3,0&quot;&gt;NO&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;13,2,4,0&quot;&gt;NO&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;13,2,5,0&quot;&gt;NO&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;13,3,0,0&quot;&gt;MEMORY&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;13,3,1,0&quot;&gt;YES&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;13,3,2,0&quot;&gt;Hash based, stored in memory, useful for temporary tables&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;13,3,3,0&quot;&gt;NO&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;13,3,4,0&quot;&gt;NO&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;13,3,5,0&quot;&gt;NO&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;13,4,0,0&quot;&gt;BLACKHOLE&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;13,4,1,0&quot;&gt;YES&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;13,4,2,0&quot;&gt;/dev/null storage engine (anything you write to it disappears)&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;13,4,3,0&quot;&gt;NO&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;13,4,4,0&quot;&gt;NO&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;13,4,5,0&quot;&gt;NO&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;13,5,0,0&quot;&gt;MyISAM&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;13,5,1,0&quot;&gt;YES&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;13,5,2,0&quot;&gt;MyISAM storage engine&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;13,5,3,0&quot;&gt;NO&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;13,5,4,0&quot;&gt;NO&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;13,5,5,0&quot;&gt;NO&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;13,6,0,0&quot;&gt;CSV&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;13,6,1,0&quot;&gt;YES&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;13,6,2,0&quot;&gt;CSV storage engine&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;13,6,3,0&quot;&gt;NO&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;13,6,4,0&quot;&gt;NO&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;13,6,5,0&quot;&gt;NO&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;13,7,0,0&quot;&gt;ARCHIVE&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;13,7,1,0&quot;&gt;YES&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;13,7,2,0&quot;&gt;Archive storage engine&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;13,7,3,0&quot;&gt;NO&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;13,7,4,0&quot;&gt;NO&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;13,7,5,0&quot;&gt;NO&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;13,8,0,0&quot;&gt;PERFORMANCE_SCHEMA&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;13,8,1,0&quot;&gt;YES&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;13,8,2,0&quot;&gt;Performance Schema&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;13,8,3,0&quot;&gt;NO&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;13,8,4,0&quot;&gt;NO&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;13,8,5,0&quot;&gt;NO&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;13,9,0,0&quot;&gt;FEDERATED&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;13,9,1,0&quot;&gt;NO&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;13,9,2,0&quot;&gt;Federated MySQL stora&lt;span&gt;ge engine1&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;13,9,3,0&quot;&gt;&lt;span&gt;null2&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;13,9,4,0&quot;&gt;&lt;span&gt;null3&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span data-path-to-node=&quot;13,9,5,0&quot;&gt;&lt;span&gt;null4&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-path-to-node=&quot;14&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;이 표가 의미하는 바를 정확히 해석하는 것이 중요합니다. 각 컬럼의 의미를 살펴보겠습니다.5&lt;/span&gt;&lt;/p&gt;
&lt;hr data-path-to-node=&quot;15&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-path-to-node=&quot;16&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;2. 출력 결과 상세 분석6&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Engine7&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스토리지 엔진의 이름입니다. 우리가 흔히 아는 InnoDB, MyISAM, MEMORY 등이 여기에 표시됩니다.8&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Support (가장 중요한 컬럼)9&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 엔진을 현재 서버에서 사용할 수 있는지를 나타냅니다.101112&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;19&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;19,0,0&quot;&gt;&lt;span&gt;YES&lt;/span&gt;&lt;/b&gt;&lt;span&gt;: 엔진이 활성화되어 있으며 사용 가능합니다.13&lt;/span&gt;&lt;span&gt;14&lt;/span&gt;&lt;span&gt;15&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;19,1,0&quot;&gt;&lt;span&gt;DEFAULT&lt;/span&gt;&lt;/b&gt;&lt;span&gt;: 엔진이 활성화되어 있으며, 테이블 생성 시 엔진을 명시하지 않으면 16&lt;/span&gt;&lt;span&gt;이 엔진이 자동으로 선택됩니다. (매우 중요)17&lt;/span&gt;&lt;span&gt;18&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;19,2,0&quot;&gt;&lt;span&gt;NO&lt;/span&gt;&lt;/b&gt;&lt;span&gt;: 엔진이 컴파&lt;/span&gt;&lt;span&gt;일되지 않았거나, 비활성화된 상태입니다.19&lt;/span&gt;&lt;span&gt;20&lt;/span&gt;&lt;span&gt;21&lt;/span&gt;&lt;span&gt;22&lt;/span&gt;&lt;span&gt;23&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;19,3,0&quot;&gt;&lt;span&gt;DISABLED&lt;/span&gt;&lt;/b&gt;&lt;span&gt;: 엔진이 존재하지만 설정에 의해 꺼져 있는 상태입니다.24&lt;/span&gt;&lt;span&gt;25&lt;/span&gt;&lt;span&gt;26&lt;/span&gt;&lt;span&gt;27&lt;/span&gt;&lt;span&gt;28&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Transactions2930313233&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 엔진이 데34이터베이스 트랜잭션을 지원하는지 여부입니다. 데이터 정합성이 중요35한 서비스라면 반드시 YES인 엔진(주로 InnoDB)을 사용해야 합니다.363738&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;XA394041&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;분산 트랜잭션(XA 트랜잭션)을 지원하는지 여부입니다.424344&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Savepoints454647&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;트랜잭션 내에서 롤백할 수 있는 지점인 세이브포인트(Savep48oints) 기능을 지원하는지 여부입니다.4950&lt;/p&gt;
&lt;hr data-path-to-node=&quot;23&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-path-to-node=&quot;24&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;3. MySQL 버전별 변화와 DEFAULT 엔진의 중요성51&lt;/span&gt;&lt;span&gt;52&lt;/span&gt;&lt;/h3&gt;
&lt;p data-path-to-node=&quot;25&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;SHOW ENGINES&lt;/span&gt;&lt;span&gt;를 실행했53&lt;/span&gt;&lt;span&gt;을 때 가장 눈여겨봐야 할 것은 어느54&lt;/span&gt; 엔진이 &lt;b data-index-in-node=&quot;42&quot; data-path-to-node=&quot;25&quot;&gt;DEFAULT&lt;/b&gt;로 설정되어 있느냐입니다. MySQL의 역사 속에서 기본 엔진은 큰 변화를 겪었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MySQL 5.5 이전 (과거)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;과거 버전에서는 MyISAM이 기본 스토리지 엔진이었습니다. MyISAM은 구조가 단순하고 읽기 속도가 빠르다는 장점이 있었지만, 트랜잭션을 지원하지 않고 테이블 단위 잠금(Table-level Locking)을 사용하여 동시성 처리에 취약했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MySQL 5.5 이후 및 8.0 (현재)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MySQL 5.5 버전부터는 InnoDB가 기본 스토리지 엔진으로 변경되었습니다. InnoDB는 트랜잭션(ACID) 지원, 레코드 단위 잠금(Row-level Locking), 외래 키(Foreign Key) 지원 등 엔터프라이즈급 기능을 제공합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실무에서의 주의점&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오래된 레거시 시스템을 마이그레이션하거나, 설정 파일(my.cnf 또는 my.ini)을 그대로 복사해서 새 서버를 구축하는 경우, 의도치 않게 기본 엔진 설정이 꼬일 수 있습니다. SHOW ENGINES를 통해 InnoDB가 DEFAULT로 되어 있는지 확인하는 습관은 데이터 무결성 사고를 미연에 방지하는 첫 단추입니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;29&quot; data-ke-size=&quot;size16&quot;&gt;또한, FEDERATED 엔진이나 BLACKHOLE 엔진 같은 특수 목적 엔진들은 기본적으로 비활성화(NO) 되어 있는 경우가 많습니다. 이러한 엔진을 사용해야 한다면 플러그인을 설치하거나 설정을 변경한 후 SHOW ENGINES로 상태가 YES로 변했는지 검증해야 합니다.&lt;/p&gt;
&lt;hr data-path-to-node=&quot;30&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-path-to-node=&quot;31&quot; data-ke-size=&quot;size23&quot;&gt;결론 및 실무 팁&lt;/h3&gt;
&lt;p data-path-to-node=&quot;32&quot; data-ke-size=&quot;size16&quot;&gt;SHOW ENGINES는 단순한 조회 명령어가 아닙니다. 이는 현재 데이터베이스 서버가 어떤 capabilities(능력)를 가지고 있는지 보여주는 명세서와 같습니다.&lt;/p&gt;
&lt;p data-path-to-node=&quot;33&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;33&quot;&gt;요약 및 실무 적용 팁:&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-path-to-node=&quot;34&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;34,0,0&quot;&gt;서버 구축 직후 확인&lt;/b&gt;: MySQL 설치 또는 업데이트 후 반드시 SHOW ENGINES를 실행하여 InnoDB가 DEFAULT인지 확인하십시오.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;34,1,0&quot;&gt;레거시 시스템 점검&lt;/b&gt;: 오래된 시스템을 인수받았다면, 혹시 MyISAM이 기본 엔진으로 잡혀 있지 않은지 점검하십시오. 현대적인 웹 애플리케이션의 99%는 InnoDB를 필요로 합니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;34,2,0&quot;&gt;특수 엔진 활성화 확인&lt;/b&gt;: 로그 수집을 위한 ARCHIVE 엔진이나 분산 처리를 위한 FEDERATED 엔진 등을 사용하기 전, 해당 기능이 서버 레벨에서 켜져 있는지 이 명령어로 1차 검증을 수행하십시오.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-path-to-node=&quot;35&quot; data-ke-size=&quot;size16&quot;&gt;데이터베이스 관리의 핵심은 '가시성'입니다. 내 서버가 무엇을 지원하는지 아는 것에서부터 안정적인 서비스 운영이 시작됩니다.&lt;/p&gt;
&lt;hr data-path-to-node=&quot;36&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-path-to-node=&quot;37&quot; data-ke-size=&quot;size23&quot;&gt;공식 문서&lt;/h3&gt;
&lt;p data-path-to-node=&quot;38&quot; data-ke-size=&quot;size16&quot;&gt;더 자세한 내용과 옵션은 아래 MySQL 공식 문서를 참고하시기 바랍니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;39&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;MySQL 8.0 Reference Manual - SHOW ENGINES Statement:&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://dev.mysql.com/doc/refman/8.0/en/show-engines.html&quot;&gt;https://dev.mysql.com/doc/refman/8.0/en/show-engines.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>SQL/MYSQL</category>
      <category>MySQL</category>
      <category>SHOW ENGINES Statement</category>
      <author>Ant_U</author>
      <guid isPermaLink="true">https://dbaant.tistory.com/265</guid>
      <comments>https://dbaant.tistory.com/265#entry265comment</comments>
      <pubDate>Thu, 22 Jan 2026 15:19:37 +0900</pubDate>
    </item>
    <item>
      <title>[MySQL] SHOW ENGINE 문법 정복: SHOW ENGINE INNODB STATUS로 잠금&amp;middot;데드락&amp;middot;버퍼 이슈 읽어내기</title>
      <link>https://dbaant.tistory.com/264</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1&gt;소개&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;애플리케이션이 평소보다 느리거나 데드락이 잦아질 때, 가장 빠르게 내부 상태를 엿볼 수 있는 도구가 SHOW ENGINE INNODB STATUS입니다. 이 명령은 InnoDB의 트랜잭션&amp;middot;잠금&amp;middot;버퍼 풀&amp;middot;I/O&amp;middot;백그라운드 스레드 정보 등 &amp;ldquo;그 시점의 스냅샷&amp;rdquo;을 텍스트로 덤프합니다. 스키마 변경이나 추가 설치가 필요 없고, 프로덕션에서도 저비용으로 실행할 수 있어 MySQL 사용자라면 반드시 익혀둘 가치가 있습니다.&lt;/p&gt;
&lt;h1&gt;본문&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1) SHOW ENGINE 개요와 기본 사용법&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MySQL의 SHOW ENGINE은 저장 엔진 별 내부 상태를 출력하는 진단 명령입니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;기본 형식:&lt;/li&gt;
&lt;li&gt;SHOW ENGINE &amp;lt;engine_name&amp;gt; STATUS;&lt;/li&gt;
&lt;li&gt;가장 자주 쓰는 대상은 InnoDB:\G를 붙이면 긴 텍스트가 세로 방향으로 보기 좋게 출력됩니다.&lt;/li&gt;
&lt;li&gt;SHOW ENGINE INNODB STATUS\G&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다른 엔진(예: PERFORMANCE_SCHEMA, MyISAM)은 서버/버전 상태에 따라 정보가 제한적일 수 있습니다. 실무에서는 사실상 InnoDB 전용 툴이라 생각하면 편합니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2) SHOW ENGINE INNODB STATUS 결과 읽는 법(핵심 섹션별 가이드)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결과는 여러 블록으로 나뉘며, 다음 순서로 보는 것을 추천합니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;LATEST DETECTED DEADLOCK&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;가장 최근 데드락의 관련 트랜잭션&amp;middot;쿼리&amp;middot;잠금 타입이 기록됩니다.&lt;/li&gt;
&lt;li&gt;&amp;ldquo;WE ROLL BACK TRANSACTION&amp;rdquo; 부분에서 어떤 트랜잭션이 희생됐는지 확인하세요.&lt;/li&gt;
&lt;li&gt;개선 팁: 인덱스 적중률, 잠금 순서 일관성(테이블 접근 순서 통일), 트랜잭션 단위 축소.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;TRANSACTIONS&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;활성 트랜잭션 목록, 각 트랜잭션의 ACTIVE 시간(초), 격리 수준, 잠금 대기 정보가 나옵니다.&lt;/li&gt;
&lt;li&gt;LOCK WAIT가 보이면 어떤 객체(레코드/인덱스)에서 대기 중인지 확인합니다.&lt;/li&gt;
&lt;li&gt;개선 팁: 오래 열린 트랜잭션(특히 autocommit=0인 세션) 종료, 비필요한 대기 줄이기.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;SEMAPHORES&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;래치/뮤텍스 경합을 보여줍니다.&lt;/li&gt;
&lt;li&gt;waits 값이 많으면 내부 동시성 경합이 심한 상태일 수 있습니다.&lt;/li&gt;
&lt;li&gt;개선 팁: 너무 큰 동시 처리(커넥션 폭증) 조절, 핫스팟 테이블/인덱스 분산.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;FILE I/O / BUFFER POOL AND MEMORY&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;디스크 I/O 큐, 읽기/쓰기 요청, 버퍼 풀 크기&amp;middot;적중률(hit rate), 플러시 상황이 나타납니다.&lt;/li&gt;
&lt;li&gt;Buffer pool hit rate가 낮고 I/O가 많다면 버퍼 풀 크기 확대를 고려합니다.&lt;/li&gt;
&lt;li&gt;개선 팁: innodb_buffer_pool_size 튜닝, 페이지 청크 크기/인스턴스 수(innodb_buffer_pool_instances) 점검.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;ROW OPERATIONS&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;레코드 수준 작업 통계(삽입/갱신/삭제)와 purge 진행 상황이 보입니다.&lt;/li&gt;
&lt;li&gt;history list length가 길면 purge가 밀리는 신호로, 장기 트랜잭션이 원인인 경우가 많습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3) 실전 예시로 이해하기&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;증상:&lt;/b&gt; 특정 업데이트 트랜잭션이 길게 대기&lt;/li&gt;
&lt;li&gt;&lt;b&gt;관찰:&lt;/b&gt; TRANSACTIONS에서 A 트랜잭션이 LOCK WAIT 상태, B 트랜잭션은 300초 이상 ACTIVE&lt;/li&gt;
&lt;li&gt;&lt;b&gt;추론:&lt;/b&gt; B가 같은 레코드/인덱스를 오래 잡고 있어 A가 대기&lt;/li&gt;
&lt;li&gt;&lt;b&gt;대응:&lt;/b&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;B 트랜잭션이 실행 중인 쿼리 및 코드 경로 점검, 트랜잭션 범위 축소&lt;/li&gt;
&lt;li&gt;필요한 인덱스 보강으로 레코드 범위를 좁혀 잠금 충돌 감소&lt;/li&gt;
&lt;li&gt;재현 가능하면 트랜잭션 접근 순서 정렬(예: 항상 고객&amp;rarr;주문 순)&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이처럼 상태 덤프에서 &amp;ldquo;누가 누구를 막는지&amp;rdquo; 연결고리를 찾아내면 원인 파악이 빨라집니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4) MySQL 5.7과 8.0의 변화와 주의점&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;InnoDB 잠금/트랜잭션 출력 형식 변경:&lt;/b&gt; 8.0에서는 내부 구현이 발전하면서 보고서 포맷과 일부 라벨이 달라질 수 있습니다. 스크립트로 파싱한다면 버전별 차이를 감안하세요.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Purge/Undo 관련 동작:&lt;/b&gt; 8.0은 Redo/Undo, 데이터 딕셔너리(공간 관리) 등이 개선되어 history list length 상승 원인과 회복 속도가 5.7과 다르게 관찰될 수 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;데드락 로깅:&lt;/b&gt; 8.0에선 에러 로그(진단 로그)와 PERFORMANCE_SCHEMA를 병행하면 더 풍부한 정보를 얻습니다. SHOW ENGINE만으로 부족할 때 performance_schema의 events_transactions_*, data_locks, data_lock_waits 뷰를 함께 보세요.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;유니코드/정렬 규칙:&lt;/b&gt; 8.0에서 기본 정렬 규칙/문자셋(예: utf8mb4_0900_ai_ci) 변화로 인덱스 선택과 잠금 패턴이 달라질 수 있습니다. 같은 쿼리여도 실행 계획과 경합 양상이 달라질 수 있음을 염두에 두세요.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Global Transaction IDs/복제 환경:&lt;/b&gt; 8.0에서 그룹 리플리케이션/GTID와 병행할 때 트랜잭션 체류 시간이 지연될 수 있으므로, SHOW ENGINE 관찰값과 레플리케이션 지표(Replica_* 상태)도 함께 확인해야 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5) SHOW ENGINE과 보완 도구를 함께 쓰기&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;잠금 상세:&lt;/b&gt;실제로 어떤 레코드/인덱스 키가 충돌하는지 구조화된 형태로 파악할 수 있습니다.&lt;/li&gt;
&lt;li&gt;SELECT * FROM performance_schema.data_locks\G SELECT * FROM performance_schema.data_lock_waits\G&lt;/li&gt;
&lt;li&gt;&lt;b&gt;슬로우 쿼리 상관 분석:&lt;/b&gt; SHOW ENGINE의 대기/경합 지표와 슬로우 로그를 맞춰 보면, 문제 구간과 쿼리를 연결하기 쉽습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;상시 모니터링:&lt;/b&gt; 주기적으로 SHOW ENGINE INNODB STATUS를 캡처해 보관하면, 장애 시점과 평상시의 차이를 비교 분석할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;결론 및 실무 팁&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;정리:&lt;/b&gt; SHOW ENGINE INNODB STATUS는 프로덕션에서 가볍게 실행 가능한 강력한 1차 진단 도구입니다. 데드락, 잠금 대기, 버퍼 풀/I/O 병목, purge 지연 등 핵심 신호를 한 번에 제공합니다. 5.7과 8.0은 출력 포맷과 내부 동작이 달라 관찰 결과가 다를 수 있으니 버전별 특성을 인지하고 해석하세요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;실무 팁:&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;출력 자동 수집:&lt;/b&gt; 장애 징후(응답 지연, 커넥션 급증) 감지 시 SHOW ENGINE INNODB STATUS\G를 즉시 덤프해서 파일로 남기도록 스크립팅하세요. 사건 전후 비교가 큰 힘이 됩니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;장기 트랜잭션 사냥:&lt;/b&gt; TRANSACTIONS 섹션에서 ACTIVE 시간이 긴 세션을 우선 종료&amp;middot;최적화하세요. 장기 트랜잭션은 purge 지연과 잠금 폭증의 단골 원인입니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;버퍼 풀 지표 체크리스트:&lt;/b&gt; Buffer pool hit rate, 플러시 큐 길이, I/O 대기 시간이 나쁘면 innodb_buffer_pool_size와 체크포인트/플러시 파라미터(예: innodb_flush_neighbors, innodb_io_capacity)를 점검하세요.&lt;/li&gt;
&lt;/ol&gt;
&lt;h1&gt;공식 문서&lt;/h1&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;MySQL Reference Manual &amp;ndash; SHOW ENGINE 및 InnoDB 상태:&lt;br /&gt;&lt;a href=&quot;https://dev.mysql.com/doc/refman/8.0/en/show-engine.html&quot;&gt;https://dev.mysql.com/doc/refman/8.0/en/show-engine.html&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://dev.mysql.com/doc/refman/8.0/en/innodb-monitors.html&quot;&gt;https://dev.mysql.com/doc/refman/8.0/en/innodb-monitors.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(5.7을 사용 중이라면 5.7 문서를 참고하세요: &lt;a href=&quot;https://dev.mysql.com/doc/refman/5.7/en/show-engine.html&quot;&gt;https://dev.mysql.com/doc/refman/5.7/en/show-engine.html&lt;/a&gt;)&lt;/p&gt;</description>
      <category>SQL/MYSQL</category>
      <category>MySQL</category>
      <category>SHOW ENGINE INNODB STATUS</category>
      <author>Ant_U</author>
      <guid isPermaLink="true">https://dbaant.tistory.com/264</guid>
      <comments>https://dbaant.tistory.com/264#entry264comment</comments>
      <pubDate>Tue, 20 Jan 2026 16:50:12 +0900</pubDate>
    </item>
    <item>
      <title>[MySQL] SHOW DATABASES 사용법과 실무 활용 가이드</title>
      <link>https://dbaant.tistory.com/263</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;MySQL에서 SHOW DATABASES를 알아야 하는 이유&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MySQL을 사용하다 보면 서버에 어떤 데이터베이스가 존재하는지 확인해야 할 일이 많습니다.&lt;br /&gt;특히 운영 환경에서는 여러 DB가 공존하기 때문에 실수로 잘못된 DB에서 작업하지 않도록 항상 데이터베이스 목록을 점검하는 것이 중요하죠.&lt;br /&gt;SHOW DATABASES 문은 이럴 때 가장 기본적이고 간단한 방법으로, 현재 MySQL 서버에 존재하는 모든 데이터베이스 이름을 확인할 수 있습니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;SHOW DATABASES 기본 사용법&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SHOW DATABASES는 현재 사용자가 접근 권한을 가진 모든 데이터베이스를 리스트로 반환합니다.&lt;br /&gt;기본 문법은 매우 간단합니다.&lt;/p&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;SHOW DATABASES;
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실행하면 information_schema, mysql, performance_schema 같은 시스템 DB와 사용자가 만든 일반 DB가 함께 출력됩니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;실무에서 자주 쓰이는 옵션과 활용 시나리오&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. LIKE 패턴으로 특정 DB만 찾기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터베이스 이름이 많을 때는 LIKE를 사용해 원하는 DB만 필터링할 수 있습니다.&lt;/p&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;SHOW DATABASES LIKE 'dev%';
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 예시는 dev로 시작하는 모든 데이터베이스 이름을 보여줍니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. WHERE 절로 필터링하기 (MySQL 5.0.2 이상)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;WHERE 절을 사용하면 information_schema.SCHEMATA 테이블의 컬럼 조건으로 더 복잡한 필터링이 가능합니다.&lt;/p&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;SHOW DATABASES WHERE `SCHEMA_NAME` != 'mysql';
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이는 mysql DB를 제외한 나머지 데이터베이스만 보여주는 예시입니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. 권한 관련 유의사항&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SHOW DATABASES는 기본적으로 사용자가 SHOW DATABASES 권한을 가지고 있거나, 각 데이터베이스에 대한 최소한의 접근 권한이 있을 때만 해당 DB가 목록에 표시됩니다.&lt;br /&gt;즉, 접근 권한이 없는 DB는 목록에 보이지 않기 때문에 관리자는 사용자 권한 설정 시 이 점을 반드시 고려해야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어, 운영 DB가 노출되면 안 되는 개발자 계정에는 접근 권한을 제거해 SHOW DATABASES 결과에서도 보이지 않도록 설정할 수 있습니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;MySQL 버전별 특징과 주의사항&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;MySQL 5.0.2 이상&lt;/b&gt;: SHOW DATABASES에서 WHERE 절이 지원됩니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;MySQL 5.7 이상&lt;/b&gt;: performance_schema가 기본으로 포함되므로 시스템 DB 목록이 예전보다 늘어날 수 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;MySQL 8.0&lt;/b&gt;: information_schema와 mysql 등 시스템 스키마 외에도 sys DB가 포함됩니다.&lt;br /&gt;또한 caching_sha2_password 인증이 기본이라 사용자 권한이 없으면 일부 DB가 보이지 않을 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;결론과 실무 팁&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SHOW DATABASES 문은 가장 기본적이지만 실수 방지와 서버 관리에 꼭 필요한 명령어입니다.&lt;br /&gt;핵심 포인트를 다시 정리하면 다음과 같습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;현재 사용자에게 권한이 있는 데이터베이스만 출력된다.&lt;/li&gt;
&lt;li&gt;LIKE와 WHERE 절을 활용하면 원하는 DB만 쉽게 찾을 수 있다.&lt;/li&gt;
&lt;li&gt;시스템 DB와 사용자 DB가 혼재하므로 작업 전 대상 DB가 맞는지 반드시 확인한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실무에서는 스크립트 자동화 시에도 SHOW DATABASES를 활용해 존재 여부를 확인한 뒤 조건부로 DB를 생성하거나 삭제하도록 하면 안전성을 높일 수 있습니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;공식 문서 바로가기&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://dev.mysql.com/doc/refman/8.0/en/show-databases.html&quot;&gt;MySQL 8.0 Reference Manual - SHOW DATABASES&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>SQL/MYSQL</category>
      <category>MySQL</category>
      <category>show databases</category>
      <author>Ant_U</author>
      <guid isPermaLink="true">https://dbaant.tistory.com/263</guid>
      <comments>https://dbaant.tistory.com/263#entry263comment</comments>
      <pubDate>Sun, 6 Jul 2025 00:33:55 +0900</pubDate>
    </item>
    <item>
      <title>[MySQL] SHOW CREATE VIEW 사용법 완벽 가이드: 뷰(View) 정의 쉽게 확인하기</title>
      <link>https://dbaant.tistory.com/262</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;MySQL에서 SHOW CREATE VIEW를 알아야 하는 이유&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MySQL에서 **뷰(View)**는 복잡한 쿼리를 재사용하고 데이터 접근을 단순화할 때 자주 사용됩니다.&lt;br /&gt;하지만 뷰를 만들고 시간이 흐르면 원래 어떤 SELECT 문으로 정의되었는지 기억하기 어려운 경우가 많습니다.&lt;br /&gt;이럴 때 SHOW CREATE VIEW 문을 사용하면 &lt;b&gt;뷰의 정의 SQL문&lt;/b&gt;을 그대로 확인할 수 있어 유지보수나 다른 서버로 이전할 때 매우 유용합니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;SHOW CREATE VIEW 기본 사용법&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SHOW CREATE VIEW 문은 &lt;b&gt;특정 뷰를 생성한 원본 SELECT 구문&lt;/b&gt;을 반환합니다.&lt;br /&gt;기본 문법은 아래와 같습니다.&lt;/p&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;SHOW CREATE VIEW 뷰_이름;
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어, active_users_view라는 뷰의 정의를 확인하고 싶다면 다음과 같이 실행합니다.&lt;/p&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;SHOW CREATE VIEW active_users_view;
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실행 결과는 다음과 같이 출력됩니다.&lt;/p&gt;
&lt;pre class=&quot;n1ql&quot;&gt;&lt;code&gt;CREATE ALGORITHM=UNDEFINED DEFINER=`admin`@`%` SQL SECURITY DEFINER VIEW `active_users_view` AS SELECT `id`, `name` FROM `users` WHERE `status` = 'active'
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;출력 결과에는 다음 정보가 포함됩니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;ALGORITHM&lt;/b&gt;: 뷰의 처리 알고리즘 (UNDEFINED, MERGE, TEMPTABLE 등)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;DEFINER&lt;/b&gt;: 뷰를 생성한 사용자 및 호스트&lt;/li&gt;
&lt;li&gt;&lt;b&gt;SQL SECURITY&lt;/b&gt;: 뷰 실행 권한이 DEFINER 또는 INVOKER 기준인지&lt;/li&gt;
&lt;li&gt;실제 &lt;b&gt;SELECT 문&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;실무에서 자주 쓰이는 활용 시나리오&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. 뷰 마이그레이션 및 백업&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버를 새로 구축하거나 테스트 환경으로 이전할 때, 뷰는 테이블과 달리 mysqldump 옵션이 적절하지 않으면 누락될 수 있습니다.&lt;br /&gt;SHOW CREATE VIEW로 정확한 SQL을 확인하고 다른 서버에 그대로 실행하면 동일한 뷰를 쉽게 재생성할 수 있습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. 뷰 수정 시 원본 쿼리 확인&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;복잡한 뷰를 유지보수할 때 기존에 어떤 컬럼과 조건으로 만들어졌는지 기억이 나지 않을 수 있습니다.&lt;br /&gt;SHOW CREATE VIEW로 원본 SELECT 문을 확인하고 필요한 부분만 수정해 CREATE OR REPLACE VIEW로 다시 작성하면 됩니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. DEFINER 보안 점검&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;뷰를 이전하거나 다른 환경에 배포할 때 DEFINER 계정이 존재하지 않으면 오류가 발생할 수 있습니다.&lt;br /&gt;출력된 DEFINER 값을 보고 필요한 경우 DEFINER=CURRENT_USER로 바꿔서 배포하는 방법을 검토해야 합니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;MySQL 버전별 특징과 주의사항&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;MySQL 5.1 이상&lt;/b&gt;부터 SHOW CREATE VIEW는 뷰 정의를 더 풍부하게 보여줍니다.&lt;/li&gt;
&lt;li&gt;MySQL 8.0에서는 SQL SECURITY, ALGORITHM 등 보안과 처리 방식 관련 옵션이 추가로 출력됩니다.&lt;/li&gt;
&lt;li&gt;버전에 따라 DEFINER가 엄격하게 적용되므로, 사용자 계정이 다른 환경에 존재하지 않으면 권한 오류가 날 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 MySQL 8.0에서는 WITH CHECK OPTION과 같은 뷰 옵션도 함께 출력되므로 데이터 무결성 조건까지 다시 확인할 수 있습니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;결론과 실무 팁&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SHOW CREATE VIEW는 복잡한 뷰를 안정적으로 관리할 수 있게 도와주는 기본 도구입니다.&lt;br /&gt;핵심 포인트를 다시 정리하면 다음과 같습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;뷰 정의를 정확히 확인하고 동일한 형태로 재생성할 수 있다.&lt;/li&gt;
&lt;li&gt;DEFINER, ALGORITHM 같은 옵션을 꼭 확인해 배포 환경과 맞춰야 한다.&lt;/li&gt;
&lt;li&gt;mysqldump로 뷰를 백업할 때 누락되는 경우가 있으니 SHOW CREATE VIEW를 활용한 이중 점검이 좋다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실무에서는 뷰를 생성할 때와 동일하게 SHOW CREATE VIEW로 주기적으로 정의를 덤프해두면 유지보수와 이전 작업이 훨씬 수월해집니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;공식 문서 바로가기&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://dev.mysql.com/doc/refman/8.0/en/show-create-view.html&quot;&gt;MySQL 8.0 Reference Manual - SHOW CREATE VIEW&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>SQL/MYSQL</category>
      <category>MySQL</category>
      <category>show create view</category>
      <author>Ant_U</author>
      <guid isPermaLink="true">https://dbaant.tistory.com/262</guid>
      <comments>https://dbaant.tistory.com/262#entry262comment</comments>
      <pubDate>Sat, 5 Jul 2025 00:32:53 +0900</pubDate>
    </item>
    <item>
      <title>[MySQL] SHOW CREATE USER 사용법 완벽 가이드: 사용자 계정 관리 쉽게 하기</title>
      <link>https://dbaant.tistory.com/261</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;MySQL에서 SHOW CREATE USER를 알아야 하는 이유&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MySQL에서는 사용자 계정과 권한 관리를 통해 데이터베이스 보안을 유지합니다. 하지만 사용자를 만들고 나면 계정 정보와 권한 설정이 어떻게 되어 있는지 정확히 확인해야 할 일이 종종 생기죠.&lt;br /&gt;이때 SHOW CREATE USER 문을 사용하면 &lt;b&gt;해당 사용자를 생성할 때 필요한 SQL문&lt;/b&gt;을 그대로 확인할 수 있어 계정 마이그레이션이나 보안 점검에 큰 도움이 됩니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;SHOW CREATE USER 기본 사용법&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SHOW CREATE USER 문은 &lt;b&gt;특정 사용자 계정의 생성 구문&lt;/b&gt;을 반환합니다.&lt;br /&gt;기본 문법은 다음과 같습니다.&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;SHOW CREATE USER '사용자이름'@'호스트';
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어, app_user라는 사용자가 localhost에서 접속한다면 다음과 같이 실행하면 됩니다.&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;SHOW CREATE USER 'app_user'@'localhost';
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실행 결과는 다음과 같은 형태로 출력됩니다.&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;CREATE USER 'app_user'@'localhost' IDENTIFIED WITH 'mysql_native_password' AS '*HASHEDPASSWORD' REQUIRE NONE PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK;
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기에는 암호화된 비밀번호 해시, 인증 플러그인, SSL 요구사항, 비밀번호 만료 정책 등 계정 생성 시의 핵심 정보가 포함되어 있습니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;실무에서 자주 쓰이는 활용 시나리오&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. 사용자 계정 마이그레이션&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버를 이전하거나 다른 환경으로 계정을 복제해야 할 때, SHOW CREATE USER로 계정 생성 SQL을 추출해 새로운 서버에서 그대로 실행하면 됩니다.&lt;br /&gt;다만 GRANT 구문은 포함되지 않기 때문에, 권한 정보는 SHOW GRANTS FOR 문으로 따로 확인해야 합니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. 계정 보안 점검&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보안 감사 시 사용자 계정이 어떤 인증 플러그인을 사용하는지, 비밀번호 정책은 어떻게 설정되어 있는지 확인할 수 있습니다.&lt;br /&gt;특히 MySQL 8.0부터는 caching_sha2_password가 기본 플러그인으로 바뀌었기 때문에, 기존 mysql_native_password를 쓰고 있다면 업그레이드 여부를 검토하는 것이 좋습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. 권한 관리 실수 방지&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;계정을 재생성할 때 기존에 설정된 세부 옵션을 놓치기 쉽습니다.&lt;br /&gt;SHOW CREATE USER를 통해 원본 스크립트를 보고 누락 없이 적용할 수 있어 권한 관리 오류를 줄일 수 있습니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;MySQL 버전별 참고사항&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;MySQL 5.7 이하 버전&lt;/b&gt;에서는 일부 계정 정보가 SHOW CREATE USER에 포함되지 않을 수 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;MySQL 8.0 이상&lt;/b&gt;에서는 인증 플러그인, SSL/TLS 요구사항, 계정 잠금/만료 정책 등 더 많은 계정 속성을 정확히 보여줍니다.&lt;/li&gt;
&lt;li&gt;SHOW CREATE USER는 MySQL 5.7 이상에서 안정적으로 사용 가능합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 SHOW CREATE USER를 사용하려면 해당 계정에 대한 SELECT 권한과 mysql.user 테이블에 접근할 수 있는 권한이 있어야 합니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;결론과 실무 팁&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SHOW CREATE USER 문은 계정 관리와 마이그레이션 시 반드시 알아야 할 도구입니다.&lt;br /&gt;핵심 포인트를 다시 정리해 보면 다음과 같습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;사용자 계정을 정확히 복제하거나 이전할 때 유용하다.&lt;/li&gt;
&lt;li&gt;권한 정보는 포함되지 않으므로 SHOW GRANTS FOR를 함께 사용해야 한다.&lt;/li&gt;
&lt;li&gt;인증 플러그인과 보안 정책이 버전에 따라 다를 수 있으므로 주의해야 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실무에서는 정기적으로 SHOW CREATE USER와 SHOW GRANTS FOR를 함께 덤프해두면, 계정 문제 발생 시 빠르게 복구할 수 있습니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;공식 문서 바로가기&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://dev.mysql.com/doc/refman/8.0/en/show-create-user.html&quot;&gt;MySQL 8.0 Reference Manual - SHOW CREATE USER&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>SQL/MYSQL</category>
      <category>MySQL</category>
      <category>show create user</category>
      <author>Ant_U</author>
      <guid isPermaLink="true">https://dbaant.tistory.com/261</guid>
      <comments>https://dbaant.tistory.com/261#entry261comment</comments>
      <pubDate>Fri, 4 Jul 2025 00:31:35 +0900</pubDate>
    </item>
    <item>
      <title>[MySQL] SHOW CREATE TRIGGER 사용법과 실무 활용 가이드</title>
      <link>https://dbaant.tistory.com/260</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;MySQL에서 SHOW CREATE TRIGGER를 알아야 하는 이유&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MySQL을 사용하다 보면 데이터 무결성을 위해 **트리거(Trigger)**를 작성할 일이 자주 생깁니다. 그런데 트리거를 만들고 나면 나중에 구조를 다시 확인하거나 백업, 마이그레이션할 때 &lt;b&gt;정확한 생성 SQL문을 확인하는 방법&lt;/b&gt;이 필요하죠. 이때 SHOW CREATE TRIGGER 문이 큰 도움이 됩니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;SHOW CREATE TRIGGER 기본 사용법&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SHOW CREATE TRIGGER 문은 &lt;b&gt;특정 트리거의 생성 스크립트&lt;/b&gt;를 그대로 보여줍니다.&lt;br /&gt;기본 문법은 아래와 같습니다.&lt;/p&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;SHOW CREATE TRIGGER [트리거_이름];
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어, user_insert_trigger라는 트리거의 생성 SQL을 보고 싶다면 다음과 같이 실행하면 됩니다.&lt;/p&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;SHOW CREATE TRIGGER user_insert_trigger;
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실행 결과에는 트리거 이름, 이벤트(BEFORE INSERT 등), 테이블, 실행 시점, 그리고 실제 BEGIN ... END 블록 등 작성 당시의 구문이 그대로 출력됩니다.&lt;br /&gt;이 결과는 트리거를 다른 데이터베이스로 이관하거나 재생성할 때 유용하게 쓰입니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;실무에서 자주 쓰이는 활용 시나리오&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. 트리거 백업 및 마이그레이션&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버를 이전하거나 테스트 환경으로 복제할 때, 트리거는 mysqldump로 덤프할 수도 있지만, 수동으로 재생성해야 할 때가 있습니다.&lt;br /&gt;이때 SHOW CREATE TRIGGER로 스크립트를 확인한 뒤 CREATE TRIGGER 구문 그대로 실행하면 됩니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. 트리거 디버깅&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예상치 못한 데이터 변경이 발생했을 때, 어떤 트리거가 실행되었는지 확인하려면 information_schema.TRIGGERS 테이블로 목록을 확인하고&lt;br /&gt;SHOW CREATE TRIGGER로 상세 내용을 살펴보는 것이 좋습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. 권한 관련 주의사항&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SHOW CREATE TRIGGER를 사용하려면 &lt;b&gt;해당 데이터베이스에 대한 TRIGGER 권한&lt;/b&gt;이 필요합니다.&lt;br /&gt;권한이 없으면 오류가 발생하므로 아래처럼 권한을 부여해야 합니다.&lt;/p&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;GRANT TRIGGER ON database.* TO 'user'@'host';
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;MySQL 버전별 동작 차이&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MySQL 5.1부터는 트리거가 information_schema에 저장되어 관리가 쉬워졌고,&lt;br /&gt;SHOW CREATE TRIGGER도 동일한 정보를 더 읽기 좋게 출력해줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 MySQL 8.0에서는 &lt;b&gt;트리거의 DEFINER 정보&lt;/b&gt;와 캐릭터셋 정보가 추가로 출력됩니다.&lt;br /&gt;이는 보안이나 사용자 권한 관리 측면에서 중요할 수 있으니, 트리거를 다른 환경으로 옮길 때 DEFINER를 그대로 쓸지 변경할지 꼭 검토해야 합니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;결론과 실무 팁&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SHOW CREATE TRIGGER 문은 복잡한 트리거를 관리할 때 꼭 알아두면 좋은 기본 도구입니다.&lt;br /&gt;핵심 포인트를 다시 정리하면 다음과 같습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;정확한 트리거 생성 스크립트를 쉽게 확인하고 재사용할 수 있다.&lt;/li&gt;
&lt;li&gt;TRIGGER 권한이 없으면 실행할 수 없으므로 권한 설정을 체크해야 한다.&lt;/li&gt;
&lt;li&gt;MySQL 버전에 따라 DEFINER와 캐릭터셋 정보 등 추가 요소를 주의해야 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실무에서는 주기적으로 트리거를 SHOW CREATE TRIGGER로 덤프해두면 문제가 발생했을 때 신속히 복구할 수 있습니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;공식 문서 바로가기&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://dev.mysql.com/doc/refman/8.0/en/show-create-trigger.html&quot;&gt;MySQL 8.0 Reference Manual - SHOW CREATE TRIGGER&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>SQL/MYSQL</category>
      <category>MySQL</category>
      <category>show create trigger</category>
      <author>Ant_U</author>
      <guid isPermaLink="true">https://dbaant.tistory.com/260</guid>
      <comments>https://dbaant.tistory.com/260#entry260comment</comments>
      <pubDate>Thu, 3 Jul 2025 15:28:49 +0900</pubDate>
    </item>
    <item>
      <title>[MySQL] SHOW CREATE TABLE 문 완벽 가이드: 테이블 구조 확인과 백업에 필수</title>
      <link>https://dbaant.tistory.com/259</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;소개&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MySQL에서 테이블을 생성한 후, 테이블의 구조나 정의를 다시 확인하고 싶은 경우가 있습니다. 이때 유용하게 사용할 수 있는 명령어가 바로 SHOW CREATE TABLE입니다. 이 명령어를 사용하면, 특정 테이블을 생성할 때 사용했던 SQL 문을 확인할 수 있습니다. 이를 통해 테이블의 정확한 구조를 파악하고, 복원하거나 다른 데이터베이스로 테이블을 이전하는 등의 작업을 할 때 유용하게 활용할 수 있습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;SHOW CREATE TABLE 사용법&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SHOW CREATE TABLE 명령어는 특정 테이블의 생성 구문을 반환합니다. 사용 방법은 매우 간단합니다. 다음과 같이 테이블 이름을 지정하여 실행합니다:&lt;/p&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;SHOW CREATE TABLE 테이블이름;
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어, employees라는 테이블에 대한 생성 구문을 확인하고 싶다면, 다음과 같이 명령어를 입력합니다:&lt;/p&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;SHOW CREATE TABLE employees;
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 명령어를 실행하면, 해당 테이블을 생성한 SQL 문을 포함한 결과가 출력됩니다. 예시 출력은 다음과 같습니다:&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;+------------------+------------------------------------------------------------+
| Table            | Create Table                                              |
+------------------+------------------------------------------------------------+
| employees        | CREATE TABLE `employees` (
  `id` int NOT NULL AUTO_INCREMENT,
  `first_name` varchar(50) DEFAULT NULL,
  `last_name` varchar(50) DEFAULT NULL,
  `hire_date` date DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 |
+------------------+------------------------------------------------------------+
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 Create Table 컬럼에는 실제 테이블을 생성할 때 사용된 SQL 구문이 포함되어 있습니다. 이 구문을 그대로 사용하여 다른 데이터베이스에서 동일한 테이블을 생성할 수 있습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;SHOW CREATE TABLE의 활용 예시&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;테이블 복사 및 이전&lt;/b&gt;&lt;br /&gt;SHOW CREATE TABLE을 사용하여 다른 서버나 데이터베이스에 테이블을 복사할 때 유용합니다. 예를 들어, 한 데이터베이스에서 다른 데이터베이스로 테이블을 복사하려면, 먼저 SHOW CREATE TABLE을 실행하고, 그 결과를 사용해 새로운 데이터베이스에서 동일한 테이블을 만들 수 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;테이블 구조 변경 확인&lt;/b&gt;&lt;br /&gt;테이블에 새로운 컬럼을 추가하거나 인덱스를 추가하는 등의 변경을 했을 때, SHOW CREATE TABLE을 실행하여 현재 테이블의 구조를 확인할 수 있습니다. 이를 통해 어떤 변경이 이루어졌는지 추적하는 데 도움을 받을 수 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;백업 및 복원&lt;/b&gt;&lt;br /&gt;테이블 구조를 백업하려면, SHOW CREATE TABLE을 통해 얻은 SQL 구문을 백업 파일에 저장할 수 있습니다. 이후, 복원할 때는 해당 SQL 구문을 실행하여 원래 테이블 구조를 재구성할 수 있습니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;MySQL 버전 변화에 따른 SHOW CREATE TABLE 동작 차이&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MySQL 버전이 다를 때 SHOW CREATE TABLE 명령어의 출력에 약간의 차이가 있을 수 있습니다. 예를 들어, MySQL 5.7부터는 기본적으로 utf8 대신 utf8mb4 문자 집합을 사용하도록 권장하고 있으며, SHOW CREATE TABLE 명령어의 출력에서도 이를 확인할 수 있습니다. MySQL 8.0 이상에서는 다양한 새로운 기능들이 추가되어, 테이블의 CREATE TABLE 구문에 새로운 옵션이나 설정이 포함될 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서, 다른 버전의 MySQL에서 SHOW CREATE TABLE을 실행했을 때 생성 구문에 약간의 차이가 있을 수 있으므로, 이를 고려하여 작업을 진행하는 것이 좋습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;결론&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SHOW CREATE TABLE 명령어는 MySQL에서 테이블의 구조를 확인하는 데 매우 유용한 도구입니다. 이를 통해 테이블을 생성할 때 사용했던 SQL 구문을 확인하거나, 테이블을 다른 서버로 이전할 때 활용할 수 있습니다. 또한, MySQL 버전 간의 차이점을 이해하고, 테이블 구조를 정확하게 추적하는 데 도움이 됩니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;실용적인 팁:&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;테이블 구조 백업:&lt;/b&gt; 테이블 생성 SQL을 백업하여 복원할 때 유용하게 활용하세요.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;버전 차이 체크:&lt;/b&gt; MySQL의 다른 버전에서 SHOW CREATE TABLE을 실행할 때 출력이 다를 수 있으므로, 버전에 맞는 구문을 확인하세요.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;기존 테이블 변경:&lt;/b&gt; 테이블에 대한 변경사항을 확인하고 관리할 때 이 명령어를 자주 사용하세요.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;공식 문서 링크:&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://dev.mysql.com/doc/refman/8.0/en/show-create-table.html&quot;&gt;MySQL 공식 문서: SHOW CREATE TABLE&lt;/a&gt;&lt;/p&gt;</description>
      <category>SQL/MYSQL</category>
      <category>MySQL</category>
      <category>show create table</category>
      <author>Ant_U</author>
      <guid isPermaLink="true">https://dbaant.tistory.com/259</guid>
      <comments>https://dbaant.tistory.com/259#entry259comment</comments>
      <pubDate>Wed, 2 Jul 2025 18:30:52 +0900</pubDate>
    </item>
    <item>
      <title>[MySQL] SHOW CREATE PROCEDURE 사용법: 저장 프로시저 정의 쉽게 확인하기</title>
      <link>https://dbaant.tistory.com/258</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;저장 프로시저, 어떻게 확인할까?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MySQL에서 저장 프로시저(Stored Procedure)는 반복되는 데이터베이스 작업을 자동화할 수 있어 많은 개발자와 DBA가 자주 사용합니다. 하지만 작성한 프로시저의 정의문을 다시 보고 싶을 때는 어떻게 해야 할까요? 바로 SHOW CREATE PROCEDURE 문을 사용하면 됩니다. 이 문은 프로시저의 원본 생성 SQL을 그대로 보여주기 때문에 유지보수나 배포 시 매우 유용합니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;SHOW CREATE PROCEDURE 문법과 사용 예시&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SHOW CREATE PROCEDURE 문은 기본적으로 다음과 같은 형태로 사용됩니다.&lt;/p&gt;
&lt;pre class=&quot;oxygene&quot;&gt;&lt;code&gt;SHOW CREATE PROCEDURE 프로시저이름;
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 get_user라는 프로시저를 확인하고 싶다면 다음과 같습니다.&lt;/p&gt;
&lt;pre class=&quot;oxygene&quot;&gt;&lt;code&gt;SHOW CREATE PROCEDURE get_user\G
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;\G 옵션을 사용하면 결과가 가로가 아닌 세로로 출력되어 가독성이 좋습니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;출력 결과 살펴보기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 문을 실행하면 다음과 같은 정보가 출력됩니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Procedure: 프로시저 이름&lt;/li&gt;
&lt;li&gt;sql_mode: 프로시저 작성 시 사용된 SQL 모드&lt;/li&gt;
&lt;li&gt;Create Procedure: 실제 생성 SQL&lt;/li&gt;
&lt;li&gt;character_set_client, collation_connection 등 문자셋 정보&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 출력은 프로시저를 다른 데이터베이스로 이관하거나 버전을 관리할 때 유용합니다. 특히 Create Procedure 컬럼에 프로시저 생성문이 그대로 출력되므로 백업 스크립트를 작성하기 좋습니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;버전별 유의사항&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MySQL 5.0 이상부터 저장 프로시저 기능이 도입되었으며, SHOW CREATE PROCEDURE 문도 함께 제공됩니다.&lt;br /&gt;하지만 MySQL 8.0부터는 DEFINER 권한이 엄격하게 적용되므로 다른 사용자가 만든 프로시저를 확인하려면 SHOW ROUTINE 권한이 필요할 수 있습니다.&lt;br /&gt;또한 INFORMATION_SCHEMA.ROUTINES 테이블과 함께 사용하면 보다 상세한 메타데이터를 얻을 수 있습니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;실전에서 유용한 팁&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;저장 프로시저 버전을 관리할 때 SHOW CREATE PROCEDURE로 생성 SQL을 자주 백업해두면 좋습니다.&lt;/li&gt;
&lt;li&gt;mysqldump에서도 --routines 옵션을 사용하면 프로시저까지 함께 덤프할 수 있지만, 간단한 확인용으로는 SHOW CREATE PROCEDURE가 더 빠릅니다.&lt;/li&gt;
&lt;li&gt;프로시저 수정은 ALTER가 없고 DROP 후 CREATE가 기본이므로, 원본 SQL을 미리 확보해두면 실수를 줄일 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;마무리 및 참고 링크&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SHOW CREATE PROCEDURE 문은 저장 프로시저를 효율적으로 관리하고 버전을 안전하게 유지하는 데 필수적인 도구입니다. 꼭 주기적으로 확인하고 백업하세요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;참고 문서:&lt;/b&gt;&lt;br /&gt;&lt;a href=&quot;https://dev.mysql.com/doc/refman/8.0/en/show-create-procedure.html&quot;&gt;MySQL 공식 SHOW CREATE PROCEDURE 문서&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>SQL/MYSQL</category>
      <category>MySQL</category>
      <category>show create procedure</category>
      <author>Ant_U</author>
      <guid isPermaLink="true">https://dbaant.tistory.com/258</guid>
      <comments>https://dbaant.tistory.com/258#entry258comment</comments>
      <pubDate>Mon, 30 Jun 2025 18:41:16 +0900</pubDate>
    </item>
    <item>
      <title>[MySQL] SHOW CREATE FUNCTION 문 설명: 함수 정의 SQL 확인하기</title>
      <link>https://dbaant.tistory.com/257</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;SHOW CREATE FUNCTION이란?&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;MySQL의 &lt;/span&gt;&lt;span&gt;SHOW CREATE FUNCTION&lt;/span&gt;&lt;span&gt; 문은 특정 사용자 정의 함수(User-Defined Function, UDF)의 생성 SQL을 확인할 수 있는 명령어입니다. 함수 로직, 반환 타입, 보안 속성 등 중요한 정보를 포함하고 있어 함수 백업 및 복제 시 유용하게 활용됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;이 명령어는 저장 함수(stored function)의 재정의, 비교, 복사 작업에 매우 실용적입니다.&lt;/span&gt;&lt;/p&gt;
&lt;div&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;기본 문법과 예제&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;기본 문법:&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;SHOW CREATE FUNCTION 함수명;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;예제:&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;SHOW CREATE FUNCTION calculate_tax;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;출력에는 다음과 같은 정보가 포함됩니다:&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;함수 이름&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;SQL 정의문 (&lt;/span&gt;&lt;span&gt;CREATE FUNCTION&lt;/span&gt;&lt;span&gt; 구문)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;반환 타입&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;파라미터&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;함수 본문 (BEGIN ... END)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;보안 속성 (&lt;/span&gt;&lt;span&gt;DETERMINISTIC&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;SQL SECURITY DEFINER&lt;/span&gt;&lt;span&gt; 등)&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;예시 출력:&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;CREATE DEFINER=`admin`@`%` FUNCTION `calculate_tax`(price DECIMAL(10,2)) RETURNS DECIMAL(10,2)
DETERMINISTIC
BEGIN
  RETURN price * 0.1;
END&lt;/code&gt;&lt;/pre&gt;
&lt;div&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;MySQL 버전별 참고사항&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;MySQL 5.0부터&lt;/b&gt;&lt;/span&gt;&lt;span&gt; 저장 함수가 도입되었으며, &lt;/span&gt;&lt;span&gt;SHOW CREATE FUNCTION&lt;/span&gt;&lt;span&gt;도 함께 사용 가능합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;MySQL 8.0 이상&lt;/b&gt;&lt;/span&gt;&lt;span&gt;에서는 함수의 보안 속성 및 SQL 모드 등에 대한 정보가 더 명확하게 표현됩니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;함수 정의에는 &lt;/span&gt;&lt;span&gt;DEFINER&lt;/span&gt;&lt;span&gt;(함수를 생성한 사용자) 정보도 포함되므로, 보안 설정에 민감한 환경에서는 주의가 필요합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;결론 및 실무 팁&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;SHOW CREATE FUNCTION&lt;/span&gt;&lt;span&gt;은 저장 함수의 정의를 정확하게 파악하고 재현하는 데 필수적인 명령어입니다. 함수 기반 로직이 많은 시스템에서 특히 중요합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;실무 팁:&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span&gt;함수를 다른 서버로 이관하거나 백업할 때, &lt;/span&gt;&lt;span&gt;SHOW CREATE FUNCTION&lt;/span&gt;&lt;span&gt; 결과를 활용해 재생성할 수 있습니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;DEFINER&lt;/span&gt;&lt;span&gt; 설정에 따라 권한 문제가 생길 수 있으므로 이관 시 사용자 계정 설정을 확인하세요.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;함수가 &lt;/span&gt;&lt;span&gt;DETERMINISTIC&lt;/span&gt;&lt;span&gt;인지 아닌지는 성능 최적화와도 관련 있으므로 용도에 따라 적절히 설정하세요.&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;공식 문서 링크:&lt;/b&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;a href=&quot;https://dev.mysql.com/doc/refman/8.0/en/show-create-function.html&quot;&gt;&lt;span&gt;MySQL SHOW CREATE FUNCTION - 공식 문서&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;</description>
      <category>SQL/MYSQL</category>
      <category>MySQL</category>
      <category>show create function</category>
      <author>Ant_U</author>
      <guid isPermaLink="true">https://dbaant.tistory.com/257</guid>
      <comments>https://dbaant.tistory.com/257#entry257comment</comments>
      <pubDate>Sun, 29 Jun 2025 00:40:32 +0900</pubDate>
    </item>
    <item>
      <title>[MySQL] SHOW CREATE EVENT 문 설명: 이벤트 정의 SQL 보기</title>
      <link>https://dbaant.tistory.com/256</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;SHOW CREATE EVENT이란?&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;MySQL의 &lt;/span&gt;&lt;span&gt;SHOW CREATE EVENT&lt;/span&gt;&lt;span&gt; 문은 특정 이벤트(event scheduler object)의 생성 SQL을 출력해주는 명령어입니다. 이벤트는 MySQL에서 주기적으로 실행할 수 있는 스케줄러 기능으로, 백업 작업, 데이터 정리, 통계 수집 등에 활용됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;이 명령어를 사용하면 해당 이벤트가 어떻게 정의되어 있는지 확인할 수 있으며, 백업이나 환경 이관 시 유용하게 활용됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;div&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;기본 문법과 예제&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;기본 문법:&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;SHOW CREATE EVENT [데이터베이스명.]이벤트명;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;예제:&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;SHOW CREATE EVENT cleanup_logs;
SHOW CREATE EVENT mydb.daily_summary;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;출력에는 다음과 같은 정보가 포함됩니다:&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;이벤트 이름&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;SQL 정의문 (&lt;/span&gt;&lt;span&gt;CREATE EVENT&lt;/span&gt;&lt;span&gt; 구문)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;스케줄 (&lt;/span&gt;&lt;span&gt;EVERY&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;AT&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;STARTS&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;ENDS&lt;/span&gt;&lt;span&gt;) 정보&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;이벤트 상태 (&lt;/span&gt;&lt;span&gt;ENABLED&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;DISABLED&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;이벤트가 실행할 SQL 명령&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;출력 예시:&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;CREATE EVENT `cleanup_logs`
ON SCHEDULE EVERY 1 DAY STARTS '2024-01-01 00:00:00'
DO
  DELETE FROM logs WHERE created_at &amp;lt; NOW() - INTERVAL 30 DAY;&lt;/code&gt;&lt;/pre&gt;
&lt;div&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;MySQL 버전별 참고사항&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;MySQL 5.1부터&lt;/b&gt;&lt;/span&gt;&lt;span&gt; 이벤트 스케줄러 기능이 도입되었습니다. 기본적으로 비활성화되어 있으며, &lt;/span&gt;&lt;span&gt;event_scheduler&lt;/span&gt;&lt;span&gt; 시스템 변수를 &lt;/span&gt;&lt;span&gt;ON&lt;/span&gt;&lt;span&gt;으로 설정해야 합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;MySQL 8.0&lt;/b&gt;&lt;/span&gt;&lt;span&gt;에서도 기본 구조는 동일하지만, 이벤트 복사 및 관리가 더 쉬워졌으며, &lt;/span&gt;&lt;span&gt;INFORMATION_SCHEMA.EVENTS&lt;/span&gt;&lt;span&gt; 뷰를 통해 메타 정보도 확인 가능합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;결론 및 실무 팁&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;SHOW CREATE EVENT&lt;/span&gt;&lt;span&gt;는 스케줄된 작업을 명확하게 파악하고 백업하거나 재현할 수 있는 유용한 명령어입니다. 이벤트 기반 자동화 작업이 많을수록 이 명령어의 활용도는 높아집니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;실무 팁:&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span&gt;event_scheduler&lt;/span&gt;&lt;span&gt; 시스템 변수가 &lt;/span&gt;&lt;span&gt;ON&lt;/span&gt;&lt;span&gt;인지 확인하세요 (&lt;/span&gt;&lt;span&gt;SHOW VARIABLES LIKE 'event_scheduler';&lt;/span&gt;&lt;span&gt;).&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;이벤트를 백업하거나 다른 서버로 옮길 때는 &lt;/span&gt;&lt;span&gt;SHOW CREATE EVENT&lt;/span&gt;&lt;span&gt; 출력 결과를 그대로 사용할 수 있습니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;이벤트 실행 시점과 주기를 명확히 지정하지 않으면 의도치 않게 작동하지 않을 수 있으니 주의하세요.&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;공식 문서 링크:&lt;/b&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;a href=&quot;https://dev.mysql.com/doc/refman/8.0/en/show-create-event.html&quot;&gt;&lt;span&gt;MySQL SHOW CREATE EVENT - 공식 문서&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;</description>
      <category>SQL/MYSQL</category>
      <category>MySQL</category>
      <category>show create event</category>
      <author>Ant_U</author>
      <guid isPermaLink="true">https://dbaant.tistory.com/256</guid>
      <comments>https://dbaant.tistory.com/256#entry256comment</comments>
      <pubDate>Sun, 29 Jun 2025 00:10:58 +0900</pubDate>
    </item>
    <item>
      <title>[MySQL] SHOW CREATE DATABASE 문 설명: 데이터베이스 생성 SQL 확인하기</title>
      <link>https://dbaant.tistory.com/255</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;SHOW CREATE DATABASE란?&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;MySQL의 &lt;/span&gt;&lt;span&gt;SHOW CREATE DATABASE&lt;/span&gt;&lt;span&gt; 문은 지정한 데이터베이스가 생성될 때 사용된 SQL 문을 보여줍니다. 여기에는 데이터베이스 이름, 문자 집합(character set), 콜레이션(collation) 정보가 포함되어 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;이 명령어는 데이터베이스 마이그레이션, 백업 및 재현 시 유용하며, 기존 설정을 확인하고 동일한 구성을 다른 환경에 적용할 때 자주 사용됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;div&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;기본 문법과 예제&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;기본 문법:&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;SHOW CREATE DATABASE 데이터베이스명;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;예제:&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;SHOW CREATE DATABASE mydb;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;출력 예시:&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DatabaseCreate Database&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;mydb&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;CREATE DATABASE &lt;/span&gt;&lt;span&gt;mydb&lt;/span&gt;&lt;span&gt; /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci */&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;이처럼 출력 결과에는 &lt;/span&gt;&lt;span&gt;CREATE DATABASE&lt;/span&gt;&lt;span&gt; 구문과 함께 문자 집합과 콜레이션 설정이 포함됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;div&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;MySQL 버전별 참고사항&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;MySQL 5.7 이하&lt;/b&gt;&lt;/span&gt;&lt;span&gt;에서는 &lt;/span&gt;&lt;span&gt;utf8mb4&lt;/span&gt;&lt;span&gt; 대신 &lt;/span&gt;&lt;span&gt;utf8&lt;/span&gt;&lt;span&gt;을 기본으로 사용하는 경우가 많았으므로 설정 확인이 중요합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;MySQL 8.0 이상&lt;/b&gt;&lt;/span&gt;&lt;span&gt;에서는 기본 문자 집합이 &lt;/span&gt;&lt;span&gt;utf8mb4&lt;/span&gt;&lt;span&gt;, 콜레이션이 &lt;/span&gt;&lt;span&gt;utf8mb4_0900_ai_ci&lt;/span&gt;&lt;span&gt;로 변경되어 더 나은 유니코드 정렬을 지원합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;SHOW CREATE DATABASE&lt;/span&gt;&lt;span&gt;는 해당 데이터베이스에 대한 접근 권한이 있어야 실행할 수 있습니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;결론 및 실무 팁&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;SHOW CREATE DATABASE&lt;/span&gt;&lt;span&gt;는 설정을 정확히 파악하고 재현할 수 있는 실용적인 명령어입니다. 운영 환경과 테스트 환경 간의 설정 차이로 인한 오류를 방지하는 데 유용합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;실무 팁:&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span&gt;마이그레이션 또는 백업 스크립트 작성 시, 문자 집합과 콜레이션이 일치하는지 반드시 확인하세요.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;여러 데이터베이스를 동일한 기준으로 생성할 경우 &lt;/span&gt;&lt;span&gt;SHOW CREATE DATABASE&lt;/span&gt;&lt;span&gt; 결과를 재사용하면 편리합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;mysqldump&lt;/span&gt;&lt;span&gt;에서도 해당 정보가 함께 백업되지만, 수동 확인이 필요할 때 유용합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;공식 문서 링크:&lt;/b&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;a href=&quot;https://dev.mysql.com/doc/refman/8.0/en/show-create-database.html&quot;&gt;&lt;span&gt;MySQL SHOW CREATE DATABASE - 공식 문서&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;</description>
      <category>SQL/MYSQL</category>
      <category>MySQL</category>
      <category>show create database</category>
      <author>Ant_U</author>
      <guid isPermaLink="true">https://dbaant.tistory.com/255</guid>
      <comments>https://dbaant.tistory.com/255#entry255comment</comments>
      <pubDate>Sat, 28 Jun 2025 00:30:13 +0900</pubDate>
    </item>
    <item>
      <title>[MySQL] SHOW COLUMNS 문 완전 정리: 테이블 구조 빠르게 확인하기</title>
      <link>https://dbaant.tistory.com/254</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;SHOW COLUMNS란?&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;MySQL의 &lt;/span&gt;&lt;span&gt;SHOW COLUMNS&lt;/span&gt;&lt;span&gt; 문은 특정 테이블의 열(컬럼) 구조를 조회할 수 있는 명령어입니다. 데이터 타입, NULL 여부, 기본값 등 테이블 스키마에 대한 핵심 정보를 빠르게 확인할 수 있어 테이블 구조를 이해하거나 디버깅할 때 매우 유용합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;이 명령어는 &lt;/span&gt;&lt;span&gt;DESCRIBE&lt;/span&gt;&lt;span&gt; 문과 거의 동일한 기능을 제공하지만, &lt;/span&gt;&lt;span&gt;SHOW COLUMNS&lt;/span&gt;&lt;span&gt;는 &lt;/span&gt;&lt;span&gt;LIKE&lt;/span&gt;&lt;span&gt; 또는 &lt;/span&gt;&lt;span&gt;WHERE&lt;/span&gt;&lt;span&gt; 절을 추가하여 더 유연한 필터링이 가능합니다.&lt;/span&gt;&lt;/p&gt;
&lt;div&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;기본 문법과 필터링 옵션&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;기본 문법:&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;SHOW [FULL] COLUMNS FROM 테이블명 [FROM 데이터베이스명] [LIKE '패턴'] [WHERE 조건];&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;예제:&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;SHOW COLUMNS FROM users;
SHOW FULL COLUMNS FROM orders LIKE 'created%';&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;FULL&lt;/span&gt;&lt;span&gt; 키워드를 사용하면 &lt;/span&gt;&lt;span&gt;Comment&lt;/span&gt;&lt;span&gt;와 &lt;/span&gt;&lt;span&gt;Privileges&lt;/span&gt;&lt;span&gt; 컬럼도 포함됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;출력 컬럼 설명:&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;Field&lt;/span&gt;&lt;span&gt;: 컬럼 이름&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Type&lt;/span&gt;&lt;span&gt;: 데이터 타입 (예: &lt;/span&gt;&lt;span&gt;varchar(255)&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;int(11)&lt;/span&gt;&lt;span&gt; 등)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Null&lt;/span&gt;&lt;span&gt;: NULL 허용 여부 (&lt;/span&gt;&lt;span&gt;YES&lt;/span&gt;&lt;span&gt; 또는 &lt;/span&gt;&lt;span&gt;NO&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Key&lt;/span&gt;&lt;span&gt;: 인덱스 여부 (&lt;/span&gt;&lt;span&gt;PRI&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;UNI&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;MUL&lt;/span&gt;&lt;span&gt; 등)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Default&lt;/span&gt;&lt;span&gt;: 기본값&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Extra&lt;/span&gt;&lt;span&gt;: 자동 증가(auto_increment) 등 부가 정보&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Comment&lt;/span&gt;&lt;span&gt; (FULL 사용 시): 컬럼에 설정된 설명&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;MySQL 버전별 참고사항&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;MySQL 5.7 이상&lt;/b&gt;&lt;/span&gt;&lt;span&gt;에서는 &lt;/span&gt;&lt;span&gt;SHOW FULL COLUMNS&lt;/span&gt;&lt;span&gt;를 통해 컬럼에 설정된 주석(Comment)을 확인할 수 있습니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;MySQL 8.0 이상&lt;/b&gt;&lt;/span&gt;&lt;span&gt;에서는 JSON 데이터 타입이나 가상 컬럼 등 새로운 형식이 등장했으며, 이들도 &lt;/span&gt;&lt;span&gt;SHOW COLUMNS&lt;/span&gt;&lt;span&gt;로 확인 가능합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;파티션 테이블의 경우 컬럼 정보는 메타데이터로부터 일관되게 출력되지만, 실제 사용상 제한이 있을 수 있으므로 별도 주의가 필요합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;결론 및 실무 팁&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;SHOW COLUMNS&lt;/span&gt;&lt;span&gt;는 MySQL 테이블 구조를 빠르게 파악할 수 있는 필수 명령어입니다. SQL을 작성하거나 디버깅할 때 스키마 확인은 필수이므로 자주 활용하게 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;실무 팁:&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span&gt;외부 테이블 조작 전에는 항상 &lt;/span&gt;&lt;span&gt;SHOW COLUMNS&lt;/span&gt;&lt;span&gt;로 구조를 확인하세요.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;LIKE&lt;/span&gt;&lt;span&gt;와 &lt;/span&gt;&lt;span&gt;WHERE&lt;/span&gt;&lt;span&gt; 절을 활용하면 원하는 컬럼만 빠르게 추출할 수 있습니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;컬럼 주석이 중요한 경우 &lt;/span&gt;&lt;span&gt;SHOW FULL COLUMNS&lt;/span&gt;&lt;span&gt;를 사용해 메타 정보를 함께 확인하세요.&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;공식 문서 링크:&lt;/b&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;a href=&quot;https://dev.mysql.com/doc/refman/8.0/en/show-columns.html&quot;&gt;&lt;span&gt;MySQL SHOW COLUMNS - 공식 문서&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;</description>
      <category>SQL/MYSQL</category>
      <category>MySQL</category>
      <category>show columns</category>
      <author>Ant_U</author>
      <guid isPermaLink="true">https://dbaant.tistory.com/254</guid>
      <comments>https://dbaant.tistory.com/254#entry254comment</comments>
      <pubDate>Sat, 28 Jun 2025 00:10:40 +0900</pubDate>
    </item>
    <item>
      <title>[MySQL] SHOW COLLATION 문 완벽 해설: 콜레이션 종류와 차이점 이해하기</title>
      <link>https://dbaant.tistory.com/253</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;SHOW COLLATION이란?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MySQL의 SHOW COLLATION 문은 데이터베이스에서 사용 가능한 콜레이션(collaion, 문자 정렬 규칙)의 목록을 조회하는 데 사용됩니다. 콜레이션은 문자열의 비교 및 정렬 방식에 영향을 주며, 같은 문자 집합 내에서도 다양한 정렬 규칙을 사용할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어, utf8mb4 문자 집합에는 대소문자 구분 여부, 악센트 구분 여부에 따라 수십 개의 콜레이션이 존재합니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;기본 사용법 및 필터링 옵션&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본 문법은 다음과 같습니다:&lt;/p&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;SHOW COLLATION [LIKE 'pattern' | WHERE 조건];
&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;LIKE 또는 WHERE 절을 통해 특정 문자 집합이나 콜레이션 이름으로 필터링 가능합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예제:&lt;/p&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;SHOW COLLATION;
SHOW COLLATION LIKE 'utf8mb4%';
SHOW COLLATION WHERE Charset = 'utf8mb4';
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;출력 컬럼 설명:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Collation: 콜레이션 이름&lt;/li&gt;
&lt;li&gt;Charset: 관련 문자 집합&lt;/li&gt;
&lt;li&gt;Id: 내부 식별자&lt;/li&gt;
&lt;li&gt;Default: 기본 콜레이션 여부 (Yes/No)&lt;/li&gt;
&lt;li&gt;Compiled: 서버에 포함 여부&lt;/li&gt;
&lt;li&gt;Sortlen: 정렬에 필요한 키 길이&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;콜레이션의 실질적 영향&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;콜레이션은 문자열 정렬, 검색(ORDER BY, LIKE, = 연산 등) 시의 결과에 직접적인 영향을 줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;utf8mb4_general_ci: 대소문자 구분 안 함 (ci: case-insensitive), 빠른 성능&lt;/li&gt;
&lt;li&gt;utf8mb4_bin: 이진 비교, 대소문자 및 악센트 구분함, 가장 정밀하지만 느릴 수 있음&lt;/li&gt;
&lt;li&gt;utf8mb4_0900_ai_ci (MySQL 8.0): 유니코드 9.0 기반 정렬, 악센트 구분 안 함 (ai: accent-insensitive), 표준화된 비교 제공&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;MySQL 버전별 변화 및 주의사항&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;MySQL 8.0부터&lt;/b&gt; utf8mb4 문자 집합에 대해 새로운 콜레이션(utf8mb4_0900_ai_ci 등)이 기본으로 설정되며, 더 나은 언어 정렬 규칙과 성능 개선이 이루어졌습니다.&lt;/li&gt;
&lt;li&gt;MySQL 5.x 버전에서는 utf8mb4_general_ci나 utf8mb4_unicode_ci가 기본으로 사용되었습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;버전 간 호환성을 고려할 때 콜레이션 변경이 성능과 결과에 영향을 줄 수 있으므로 주의가 필요합니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;결론 및 실무 팁&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SHOW COLLATION은 문자 비교/정렬의 미묘한 차이를 확인하고, 애플리케이션에 가장 적합한 설정을 선택하는 데 꼭 필요한 도구입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;실무 팁:&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;다국어 지원이 필요한 경우 utf8mb4_0900_ai_ci와 같은 최신 콜레이션 사용을 고려하세요.&lt;/li&gt;
&lt;li&gt;정렬 정확도가 중요한 경우 bin 콜레이션도 검토해 보세요.&lt;/li&gt;
&lt;li&gt;데이터 정렬이 느려질 수 있으므로 Sortlen이 짧은 콜레이션을 선호하는 것이 성능에 유리할 수 있습니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;공식 문서 링크:&lt;/b&gt;&lt;br /&gt;&lt;a href=&quot;https://dev.mysql.com/doc/refman/8.0/en/show-collation.html&quot;&gt;MySQL SHOW COLLATION - 공식 문서&lt;/a&gt;&lt;/p&gt;</description>
      <category>SQL/MYSQL</category>
      <category>MySQL</category>
      <category>show collation</category>
      <author>Ant_U</author>
      <guid isPermaLink="true">https://dbaant.tistory.com/253</guid>
      <comments>https://dbaant.tistory.com/253#entry253comment</comments>
      <pubDate>Fri, 27 Jun 2025 12:21:14 +0900</pubDate>
    </item>
    <item>
      <title>[MySQL] SHOW CHARACTER SET 문 설명: 사용 가능한 문자 집합 확인하기</title>
      <link>https://dbaant.tistory.com/252</link>
      <description>&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;h3 data-ke-size=&quot;size23&quot;&gt;SHOW CHARACTER SET이란?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MySQL에서 SHOW CHARACTER SET 문은 현재 서버에서 사용 가능한 문자 집합(character set) 목록과 그 특성을 보여주는 명령어입니다. 문자 집합은 문자열 데이터의 인코딩 방식을 정의하므로, 데이터 저장과 검색 시 정확한 문자 처리를 위해 꼭 이해해야 할 개념입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 명령어는 다음과 같은 상황에서 유용합니다:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;테이블이나 데이터베이스의 문자 집합 설정 전 사용 가능한 옵션을 확인할 때&lt;/li&gt;
&lt;li&gt;특정 문자 인코딩이 지원되는지 점검할 때&lt;/li&gt;
&lt;li&gt;문자 집합에 따른 저장 용량(바이트 수)을 비교할 때&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;기본 사용법과 결과 해석&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본 문법은 다음과 같습니다:&lt;/p&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;SHOW CHARACTER SET [LIKE 'pattern' | WHERE 조건];
&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;LIKE 또는 WHERE 절을 통해 특정 문자 집합만 필터링할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예제:&lt;/p&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;SHOW CHARACTER SET;
SHOW CHARACTER SET LIKE 'utf8%';
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;출력 컬럼:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Charset: 문자 집합 이름 (예: utf8mb4, latin1 등)&lt;/li&gt;
&lt;li&gt;Description: 문자 집합 설명&lt;/li&gt;
&lt;li&gt;Default collation: 기본 콜레이션(문자 정렬 방식)&lt;/li&gt;
&lt;li&gt;Maxlen: 문자 하나가 차지할 수 있는 최대 바이트 수&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어, utf8mb4는 최대 4바이트까지 사용하며, utf8mb4_general_ci 등의 콜레이션을 기본으로 가집니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;MySQL 버전별 변화와 주의사항&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;MySQL 5.5부터&lt;/b&gt; utf8mb4 문자 집합이 도입되어 이모지나 일부 유니코드 문자까지 완전히 지원합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;MySQL 8.0 이상&lt;/b&gt;에서는 utf8mb4가 사실상 표준 문자 집합으로 사용되며, 더 나은 정렬을 위해 utf8mb4_0900_ai_ci 등의 새로운 콜레이션이 추가되었습니다.&lt;/li&gt;
&lt;li&gt;일부 문자 집합(latin1 등)은 레거시 환경에서만 쓰이는 경우가 많고, 신규 프로젝트에는 권장되지 않습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;결론 및 실무 팁&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SHOW CHARACTER SET 명령어는 데이터베이스 설계 및 마이그레이션 시 필수적으로 참고해야 하는 도구입니다. 문자 인코딩 호환성 문제나 검색 속도 등에 영향을 줄 수 있기 때문입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;실무 팁:&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;새 프로젝트에서는 가급적 utf8mb4를 기본 문자 집합으로 사용하는 것을 권장합니다.&lt;/li&gt;
&lt;li&gt;문자 집합과 콜레이션은 함께 고려해야 하므로 SHOW COLLATION 명령어도 같이 확인하세요.&lt;/li&gt;
&lt;li&gt;저장 공간이 중요한 경우 Maxlen 값도 비교해보세요.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;공식 문서 링크:&lt;/b&gt;&lt;br /&gt;&lt;a href=&quot;https://dev.mysql.com/doc/refman/8.0/en/show-character-set.html&quot;&gt;MySQL SHOW CHARACTER SET - 공식 문서&lt;/a&gt;&lt;/p&gt;</description>
      <category>SQL/MYSQL</category>
      <category>MySQL</category>
      <category>show character set</category>
      <author>Ant_U</author>
      <guid isPermaLink="true">https://dbaant.tistory.com/252</guid>
      <comments>https://dbaant.tistory.com/252#entry252comment</comments>
      <pubDate>Fri, 27 Jun 2025 12:20:21 +0900</pubDate>
    </item>
    <item>
      <title>[MySQL] SHOW BINLOG EVENTS 문 완벽 가이드: 바이너리 로그 이벤트 분석하기</title>
      <link>https://dbaant.tistory.com/251</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;SHOW BINLOG EVENTS란?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MySQL에서 SHOW BINLOG EVENTS는 바이너리 로그 파일에 기록된 이벤트를 조회할 수 있는 명령어입니다. 이 명령어는 주로 레플리케이션 문제를 분석하거나, 특정 트랜잭션이 어떻게 처리되었는지를 확인할 때 사용됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;바이너리 로그는 데이터 변경(INSERT, UPDATE, DELETE 등) 이력을 기록하는 MySQL의 핵심 기능이며, 마스터-슬레이브 복제(replication)의 기반이 되는 중요한 자료입니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;기본 사용법과 주요 옵션&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본적인 문법은 다음과 같습니다:&lt;/p&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;SHOW BINLOG EVENTS [IN 'log_name'] [FROM pos] [LIMIT [offset,] row_count];
&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;IN 'log_name': 조회할 바이너리 로그 파일 이름 지정 (예: 'mysql-bin.000001')&lt;/li&gt;
&lt;li&gt;FROM pos: 특정 위치부터 이벤트 조회 시작 (기본은 4)&lt;/li&gt;
&lt;li&gt;LIMIT: 출력할 이벤트 개수 제한 (페이징 처리에 유용)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예제:&lt;/p&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;SHOW BINLOG EVENTS IN 'mysql-bin.000001' FROM 120 LIMIT 10;
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 명령은 mysql-bin.000001 로그 파일의 120번째 포지션부터 10개의 이벤트를 출력합니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;출력 결과 해석하기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;출력 결과는 다음과 같은 컬럼을 포함합니다:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Log_name: 로그 파일 이름&lt;/li&gt;
&lt;li&gt;Pos: 이벤트 위치 (바이너리 로그에서의 바이트 오프셋)&lt;/li&gt;
&lt;li&gt;Event_type: 이벤트 종류 (Query, Write_rows, Update_rows 등)&lt;/li&gt;
&lt;li&gt;Server_id: 이벤트를 기록한 서버 ID&lt;/li&gt;
&lt;li&gt;End_log_pos: 해당 이벤트가 끝나는 위치&lt;/li&gt;
&lt;li&gt;Info: SQL 문이나 부가 정보&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 Event_type과 Info 컬럼은 트랜잭션 내용을 파악하는 데 중요합니다. 예를 들어, Query 이벤트의 Info에 실제 실행된 SQL이 포함되어 있습니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;MySQL 버전별 변화 및 주의사항&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;MySQL 5.6부터&lt;/b&gt; GTID 기반 복제를 지원하면서, 바이너리 로그에 GTID 관련 이벤트(GTID, ANONYMOUS_GTID 등)가 추가되었습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;MySQL 8.0 이상&lt;/b&gt;에서는 기본적으로 바이너리 로그 포맷이 ROW로 설정되어 있어, Query 이벤트보다는 Write_rows, Update_rows, Delete_rows와 같은 행 기반 이벤트가 주로 나타납니다.&lt;/li&gt;
&lt;li&gt;SHOW BINLOG EVENTS는 현재 슬레이브 서버에서는 동작하지 않으며, 마스터 서버에서만 사용 가능합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;결론 및 실무 팁&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SHOW BINLOG EVENTS는 MySQL에서 데이터 변경 이력을 직접 확인할 수 있는 매우 강력한 도구입니다. 복제 오류 분석, 트랜잭션 추적, 이상 데이터 원인 분석 등에 유용합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;실무 팁:&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;바이너리 로그 포맷에 따라 해석 방식이 다릅니다. STATEMENT vs ROW 포맷을 확인하세요.&lt;/li&gt;
&lt;li&gt;mysqlbinlog 유틸리티를 함께 사용하면 로그 분석이 더 유연해집니다.&lt;/li&gt;
&lt;li&gt;보안상 민감한 데이터가 로그에 포함될 수 있으니 접근 권한을 주의 깊게 설정하세요.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;공식 문서 링크:&lt;/b&gt;&lt;br /&gt;&lt;a href=&quot;https://dev.mysql.com/doc/refman/8.0/en/show-binlog-events.html&quot;&gt;MySQL SHOW BINLOG EVENTS - 공식 문서&lt;/a&gt;&lt;/p&gt;</description>
      <category>SQL/MYSQL</category>
      <category>MySQL</category>
      <category>show binlog events</category>
      <author>Ant_U</author>
      <guid isPermaLink="true">https://dbaant.tistory.com/251</guid>
      <comments>https://dbaant.tistory.com/251#entry251comment</comments>
      <pubDate>Fri, 27 Jun 2025 12:18:45 +0900</pubDate>
    </item>
    <item>
      <title>[MySQL] SHOW BINARY LOGS로 바이너리 로그 목록 확인하기</title>
      <link>https://dbaant.tistory.com/250</link>
      <description>&lt;h2 data-end=&quot;310&quot; data-start=&quot;264&quot; data-ke-size=&quot;size26&quot;&gt;MySQL 바이너리 로그 목록 조회: SHOW BINARY LOGS 사용법&lt;/h2&gt;
&lt;p data-end=&quot;551&quot; data-start=&quot;312&quot; data-ke-size=&quot;size16&quot;&gt;MySQL에서 데이터 변경 사항을 기록하는 바이너리 로그(binary log)는 복제(replication), 장애 복구, 감사(audit) 등 다양한 용도로 활용됩니다. 이 로그들은 서버 내에서 여러 파일로 저장되며, SHOW BINARY LOGS 명령어를 통해 어떤 로그들이 존재하는지 목록을 확인할 수 있습니다. 이 글에서는 SHOW BINARY LOGS의 기본 개념과 사용 방법, 실무에서의 활용 팁을 소개합니다.&lt;/p&gt;
&lt;hr data-end=&quot;556&quot; data-start=&quot;553&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;584&quot; data-start=&quot;558&quot; data-ke-size=&quot;size26&quot;&gt;1. SHOW BINARY LOGS란?&lt;/h2&gt;
&lt;p data-end=&quot;675&quot; data-start=&quot;586&quot; data-ke-size=&quot;size16&quot;&gt;SHOW BINARY LOGS는 MySQL 서버에 저장된 모든 바이너리 로그 파일의 목록과 각 파일의 크기를 보여주는 명령어입니다. 다음과 같이 실행합니다:&lt;/p&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1750920490611&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SHOW BINARY LOGS;&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-end=&quot;723&quot; data-start=&quot;707&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;723&quot; data-start=&quot;707&quot; data-ke-size=&quot;size16&quot;&gt;출력 예시는 다음과 같습니다:&lt;/p&gt;
&lt;div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 51px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;Log_name&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;File_size&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;mysql-bin.000123&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;107374182&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;mysql-bin.000124&lt;/td&gt;
&lt;td style=&quot;width: 50%; height: 17px;&quot;&gt;93482913&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;br /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;p data-end=&quot;877&quot; data-start=&quot;858&quot; data-ke-size=&quot;size16&quot;&gt;각 컬럼의 의미는 다음과 같습니다:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;946&quot; data-start=&quot;879&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;908&quot; data-start=&quot;879&quot;&gt;&lt;b&gt;Log_name&lt;/b&gt;: 바이너리 로그 파일 이름&lt;/li&gt;
&lt;li data-end=&quot;946&quot; data-start=&quot;909&quot;&gt;&lt;b&gt;File_size&lt;/b&gt;: 각 로그 파일의 크기 (바이트 단위)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;1015&quot; data-start=&quot;948&quot; data-ke-size=&quot;size16&quot;&gt;이 명령어는 현재까지 생성된 로그 파일의 전체 목록을 보여주며, 복제 설정이나 로그 정리 작업에서 필수적으로 사용됩니다.&lt;/p&gt;
&lt;hr data-end=&quot;1020&quot; data-start=&quot;1017&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1048&quot; data-start=&quot;1022&quot; data-ke-size=&quot;size26&quot;&gt;2. 실무 활용: 복제 설정 및 로그 관리&lt;/h2&gt;
&lt;p data-end=&quot;1092&quot; data-start=&quot;1050&quot; data-ke-size=&quot;size16&quot;&gt;SHOW BINARY LOGS는 아래와 같은 다양한 상황에서 유용합니다:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1342&quot; data-start=&quot;1094&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1182&quot; data-start=&quot;1094&quot;&gt;&lt;b&gt;복제 초기 구성&lt;/b&gt;: 슬레이브 서버에서 CHANGE MASTER TO 명령을 사용할 때, 시작할 로그 파일 이름을 이 명령어로 확인할 수 있습니다.&lt;/li&gt;
&lt;li data-end=&quot;1264&quot; data-start=&quot;1183&quot;&gt;&lt;b&gt;로그 정리 전 목록 확인&lt;/b&gt;: PURGE BINARY LOGS 명령을 실행하기 전에 어떤 로그 파일이 남아 있는지 확인해야 안전합니다.&lt;/li&gt;
&lt;li data-end=&quot;1342&quot; data-start=&quot;1265&quot;&gt;&lt;b&gt;디스크 사용량 점검&lt;/b&gt;: 로그 크기를 확인하여 저장 공간을 예측하고, 필요 시 로그 파일 압축 또는 삭제 계획을 세울 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1347&quot; data-start=&quot;1344&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1370&quot; data-start=&quot;1349&quot; data-ke-size=&quot;size26&quot;&gt;3. 주의할 점과 버전별 특이사항&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;1625&quot; data-start=&quot;1372&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;1446&quot; data-start=&quot;1372&quot;&gt;&lt;b&gt;권한 필요&lt;/b&gt;: REPLICATION CLIENT 권한이 없으면 SHOW BINARY LOGS 결과를 볼 수 없습니다.&lt;/li&gt;
&lt;li data-end=&quot;1521&quot; data-start=&quot;1447&quot;&gt;&lt;b&gt;바이너리 로그 비활성화 시 결과 없음&lt;/b&gt;: log_bin 설정이 OFF 되어 있으면 이 명령어는 결과를 반환하지 않습니다.&lt;/li&gt;
&lt;li data-end=&quot;1625&quot; data-start=&quot;1522&quot;&gt;&lt;b&gt;MySQL 8.0 이후 차이점&lt;/b&gt;: MySQL 8.0부터는 보안 기능이 강화되면서 기본 계정으로는 로그 파일 정보 접근이 제한될 수 있으니, 최소 권한 계정 사용 시 주의하세요.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;1630&quot; data-start=&quot;1627&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1644&quot; data-start=&quot;1632&quot; data-ke-size=&quot;size26&quot;&gt;결론 및 실무 팁&lt;/h2&gt;
&lt;p data-end=&quot;1754&quot; data-start=&quot;1646&quot; data-ke-size=&quot;size16&quot;&gt;SHOW BINARY LOGS는 바이너리 로그 관리와 복제 구성에서 매우 기본적이지만 중요한 명령입니다. 서버의 로그 상태를 정기적으로 점검하고, 복제나 백업 전략에 반영하는 것이 좋습니다.&lt;/p&gt;
&lt;h3 data-end=&quot;1765&quot; data-start=&quot;1756&quot; data-ke-size=&quot;size23&quot;&gt;실무 팁:&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;1954&quot; data-start=&quot;1766&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;1833&quot; data-start=&quot;1766&quot;&gt;&lt;b&gt;로그 파일 정리 전 반드시 확인&lt;/b&gt;: 실수로 필요한 로그 파일을 삭제하지 않도록 이 명령으로 목록을 점검하세요.&lt;/li&gt;
&lt;li data-end=&quot;1895&quot; data-start=&quot;1834&quot;&gt;&lt;b&gt;복제 서버 구성 시 필수 정보&lt;/b&gt;: 어떤 로그 파일부터 데이터를 받아야 하는지 확인할 때 유용합니다.&lt;/li&gt;
&lt;li data-end=&quot;1954&quot; data-start=&quot;1896&quot;&gt;&lt;b&gt;디스크 공간 확보를 위한 기준 마련&lt;/b&gt;: 로그 크기 정보를 바탕으로 로그 보존 정책을 세우세요.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-end=&quot;1959&quot; data-start=&quot;1956&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-end=&quot;1969&quot; data-start=&quot;1961&quot; data-ke-size=&quot;size26&quot;&gt;참고 문서&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2067&quot; data-start=&quot;1971&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2067&quot; data-start=&quot;1971&quot;&gt;&lt;a href=&quot;https://dev.mysql.com/doc/refman/8.0/en/show-binary-logs.html&quot; data-end=&quot;2067&quot; data-start=&quot;1973&quot;&gt;MySQL 공식 문서: SHOW BINARY LOGS&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>SQL/MYSQL</category>
      <category>MySQL</category>
      <category>show binary logs</category>
      <author>Ant_U</author>
      <guid isPermaLink="true">https://dbaant.tistory.com/250</guid>
      <comments>https://dbaant.tistory.com/250#entry250comment</comments>
      <pubDate>Thu, 26 Jun 2025 15:48:31 +0900</pubDate>
    </item>
    <item>
      <title>[MySQL] SHOW BINARY LOG STATUS로 바이너리 로그 상태 확인하기</title>
      <link>https://dbaant.tistory.com/249</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;MySQL의 바이너리 로그 상태를 확인하는 법&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MySQL을 운영하다 보면 바이너리 로그(Binary Log)를 확인해야 하는 순간이 자주 발생합니다. 특히 데이터 복제(replication)나 장애 복구를 위한 로그 백업을 설정할 때 로그의 현재 상태를 알아야 하죠. 이럴 때 유용하게 사용할 수 있는 명령어가 바로 SHOW BINARY LOG STATUS입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 문서는 MySQL 사용자들이 SHOW BINARY LOG STATUS 명령어를 통해 어떤 정보를 얻을 수 있는지, 실제로 언제 어떻게 활용할 수 있는지를 알기 쉽게 설명합니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;SHOW BINARY LOG STATUS란?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SHOW BINARY LOG STATUS는 현재 사용 중인 바이너리 로그 파일과 그 위치를 확인할 수 있는 MySQL 명령어입니다. 일반적으로 다음과 같은 결과를 출력합니다:&lt;/p&gt;
&lt;pre class=&quot;asciidoc&quot;&gt;&lt;code&gt;mysql&amp;gt; SHOW BINARY LOG STATUS;
+------------------+----------+
| File             | Position |
+------------------+----------+
| mysql-bin.000025 |     154  |
+------------------+----------+
&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;File&lt;/b&gt;: 현재 MySQL 서버가 기록 중인 바이너리 로그 파일명&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Position&lt;/b&gt;: 그 파일 내에서 다음 로그 이벤트가 기록될 위치(offset)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 정보는 주로 &lt;b&gt;복제 설정&lt;/b&gt;, &lt;b&gt;binlog 백업&lt;/b&gt;, &lt;b&gt;GTID 복구 시점 파악&lt;/b&gt; 등에 사용됩니다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  참고: 이 명령어는 MySQL 8.x에서도 동일하게 작동하며, 이전 버전(5.7, 5.6)과도 호환됩니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;언제 어떻게 사용하나?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. 복제(replication) 설정할 때&lt;/b&gt;&lt;br /&gt;복제를 위해 슬레이브 서버를 설정할 때, CHANGE MASTER TO 문에 사용할 MASTER_LOG_FILE과 MASTER_LOG_POS 값을 알아야 합니다. 이 값을 마스터 서버에서 SHOW BINARY LOG STATUS로 확인할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. binlog 백업 자동화&lt;/b&gt;&lt;br /&gt;정기적으로 binlog를 백업하고, 어느 시점까지 백업했는지를 추적하려면 File과 Position 정보를 활용할 수 있습니다. 백업 스크립트와 연동하여 현재 상태를 기록해두면, 장애 복구 시 매우 유용합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3. 장애 복구 및 Point-in-Time Recovery (PITR)&lt;/b&gt;&lt;br /&gt;데이터 복원 후 바이너리 로그를 재적용할 때, 어디서부터 로그를 적용해야 할지를 판단하기 위해 SHOW BINARY LOG STATUS가 쓰입니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;유의할 점 및 버전 관련 팁&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;SHOW BINARY LOG STATUS는 현재 사용 중인 binlog 파일 하나만 보여주므로, &lt;b&gt;모든 로그 목록을 보려면 SHOW BINARY LOGS를 사용&lt;/b&gt;해야 합니다.&lt;/li&gt;
&lt;li&gt;바이너리 로그가 비활성화된 경우(--log-bin 옵션 미사용) 이 명령어는 아무 결과도 반환하지 않습니다.&lt;/li&gt;
&lt;li&gt;MySQL 8.0에서는 Performance_Schema나 Information_Schema를 통해 더 정교한 로그 분석이 가능해졌지만, 이 명령어는 여전히 간단한 상태 확인용으로 널리 사용됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;마무리 및 실전 팁&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SHOW BINARY LOG STATUS는 단순하지만, 운영 중인 MySQL 시스템의 로그 상태를 파악하는 데 매우 유용한 도구입니다. 복제, 백업, 복구 등 여러 시나리오에서 중요한 역할을 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;실전 팁:&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;마스터 서버에서는 이 명령어의 결과를 주기적으로 기록해두는 것이 좋습니다.&lt;/li&gt;
&lt;li&gt;복제를 설정하기 전에는 항상 SHOW MASTER STATUS와 함께 확인하세요.&lt;/li&gt;
&lt;li&gt;로그 순서에 따라 백업 순서를 정할 때, SHOW BINARY LOGS와 함께 사용하면 효과적입니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;공식 문서 링크&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://dev.mysql.com/doc/refman/8.0/en/show-binary-log-status.html&quot;&gt;MySQL 공식 문서: SHOW BINARY LOG STATUS&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>SQL/MYSQL</category>
      <category>MySQL</category>
      <category>show binary log status</category>
      <author>Ant_U</author>
      <guid isPermaLink="true">https://dbaant.tistory.com/249</guid>
      <comments>https://dbaant.tistory.com/249#entry249comment</comments>
      <pubDate>Thu, 26 Jun 2025 15:46:21 +0900</pubDate>
    </item>
    <item>
      <title>[MySQL] SET NAMES 사용법: 클라이언트 문자셋과 콜레이션 완벽 제어하기</title>
      <link>https://dbaant.tistory.com/248</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-pm-slice=&quot;1 3 []&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;들어가며&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;MySQL 클라이언트와 서버 간 데이터 전송 시 문자 인코딩이 맞지 않으면 깨진 문자나 데이터 손실이 발생할 수 있습니다. 이를 방지하기 위해 클라이언트 연결 직후 정확한 문자셋을 설정하는 것이 중요합니다. &lt;/span&gt;&lt;span&gt;SET NAMES&lt;/span&gt;&lt;span&gt;는 클라이언트-서버 통신에 사용될 문자셋과 콜레이션을 명시적으로 지정하는 가장 널리 쓰이는 명령어입니다. 오늘은 이 명령어의 개념, 문법, 활용법을 상세히 살펴보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;div&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;SET NAMES&lt;/span&gt;&lt;span&gt;란 무엇인가?&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;SET NAMES&lt;/span&gt;&lt;span&gt;는 MySQL 세션의 문자셋 관련 시스템 변수를 한 번에 설정하는 명령어입니다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;변경되는 시스템 변수&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;character_set_client&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;character_set_results&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;character_set_connection&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;이 세 변수가 동시에 지정한 문자셋으로 설정되어 클라이언트와 서버 간의 문자 인코딩 일관성을 확보합니다.&lt;/span&gt;&lt;/p&gt;
&lt;div&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;기본 문법과 사용 예제&lt;/span&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;기본 문법&lt;/span&gt;&lt;/h3&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;SET NAMES 문자셋 [COLLATE 콜레이션];&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;문자셋: 사용할 문자 인코딩 이름 (예: &lt;/span&gt;&lt;span&gt;utf8mb4&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;콜레이션: 문자 정렬 및 비교 규칙 (선택 사항)&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;예제 1: 기본 문자셋 설정&lt;/span&gt;&lt;/h3&gt;
&lt;pre class=&quot;gams&quot;&gt;&lt;code&gt;SET NAMES utf8mb4;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;예제 2: 문자셋과 콜레이션 동시 설정&lt;/span&gt;&lt;/h3&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;SET NAMES utf8mb4 COLLATE utf8mb4_general_ci;&lt;/code&gt;&lt;/pre&gt;
&lt;div&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;SET CHARACTER SET&lt;/span&gt;&lt;span&gt;과의 차이점&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;구분SET NAMESSET CHARACTER SET&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;콜레이션 지정&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;지원함&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;지원 안 함 (디폴트 콜레이션 사용)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;유연성&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;더 세밀한 설정 가능&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;간단하고 빠른 기본 설정&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;내부 동작&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;시스템 변수 직접 설정&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;내부적으로 SET NAMES 호출&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;Tip:&lt;/b&gt;&lt;/span&gt;&lt;span&gt; 복잡한 다국어 처리나 정렬 규칙을 명확히 제어하려면 &lt;/span&gt;&lt;span&gt;SET NAMES&lt;/span&gt;&lt;span&gt; 사용을 권장합니다.&lt;/span&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;설정 상태 확인&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;현재 적용된 문자셋과 콜레이션 상태는 다음과 같이 확인할 수 있습니다:&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;SHOW VARIABLES LIKE 'character_set%';
SHOW VARIABLES LIKE 'collation%';&lt;/code&gt;&lt;/pre&gt;
&lt;div&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;사용 시 주의사항&lt;/span&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;클라이언트-서버 통신 초기 단계에서 가장 먼저 설정하는 것이 안전합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;애플리케이션 커넥션 풀링 사용 시, 세션 재사용에 따른 문자셋 상태 관리 필요&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;서버에서 지원하는 문자셋인지 확인하려면:&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;SHOW CHARACTER SET;&lt;/code&gt;&lt;/pre&gt;
&lt;div&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;마무리 및 실전 팁&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;SET NAMES&lt;/span&gt;&lt;span&gt;는 MySQL 국제화 지원의 핵심입니다. 통신 문자셋과 콜레이션을 명확히 맞춰두면 예상치 못한 데이터 손상 이슈를 예방할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;실전 팁:&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span&gt;커넥션 풀 기반 환경에서는 커넥션 생성 시 초기화 스크립트에 반드시 &lt;/span&gt;&lt;span&gt;SET NAMES&lt;/span&gt;&lt;span&gt; 포함하세요.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;다국어 서비스에서는 항상 &lt;/span&gt;&lt;span&gt;utf8mb4&lt;/span&gt;&lt;span&gt; 문자셋을 추천합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;콜레이션은 시스템 요구사항에 맞춰 &lt;/span&gt;&lt;span&gt;utf8mb4_unicode_ci&lt;/span&gt;&lt;span&gt; 등 더 적절한 값을 선택하세요.&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;공식 문서 링크&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;더 자세한 내용은 MySQL 공식 문서를 참고하세요:&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://dev.mysql.com/doc/refman/8.0/en/set-names.html&quot;&gt;&lt;span&gt;SET NAMES 공식 문서&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>SQL/MYSQL</category>
      <category>MySQL</category>
      <category>set names</category>
      <author>Ant_U</author>
      <guid isPermaLink="true">https://dbaant.tistory.com/248</guid>
      <comments>https://dbaant.tistory.com/248#entry248comment</comments>
      <pubDate>Wed, 25 Jun 2025 18:22:25 +0900</pubDate>
    </item>
    <item>
      <title>[MySQL] SET CHARACTER SET 사용법: 세션 문자셋 쉽게 변경하기</title>
      <link>https://dbaant.tistory.com/247</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-pm-slice=&quot;1 3 []&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;들어가며&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;MySQL에서 문자 인코딩은 데이터의 저장과 전송 품질에 직접적인 영향을 미칩니다. 특히 다양한 언어 데이터를 다룰 때 문자셋 설정이 매우 중요합니다. 클라이언트가 서버와 통신할 때 사용할 문자셋을 세션 단위로 변경할 수 있도록 도와주는 명령어가 &lt;/span&gt;&lt;span&gt;SET CHARACTER SET&lt;/span&gt;&lt;span&gt;입니다. 오늘은 이 명령어의 기본 개념과 사용법을 살펴보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;div&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;SET CHARACTER SET&lt;/span&gt;&lt;span&gt;이란 무엇인가?&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;SET CHARACTER SET&lt;/span&gt;&lt;span&gt; 명령어는 현재 클라이언트 세션의 문자셋 관련 시스템 변수를 한 번에 변경해줍니다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;변경되는 시스템 변수&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;character_set_client&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;character_set_results&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;character_set_connection&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;이 세 변수는 모두 지정한 문자셋으로 동시에 설정됩니다. 다만 &lt;/span&gt;&lt;span&gt;character_set_server&lt;/span&gt;&lt;span&gt;에는 영향을 주지 않습니다.&lt;/span&gt;&lt;/p&gt;
&lt;div&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;기본 문법과 사용 예제&lt;/span&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;기본 문법&lt;/span&gt;&lt;/h3&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;SET CHARACTER SET 문자셋명;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;예제 1: &lt;/span&gt;&lt;span&gt;utf8mb4&lt;/span&gt;&lt;span&gt;로 변경&lt;/span&gt;&lt;/h3&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;SET CHARACTER SET utf8mb4;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;예제 2: &lt;/span&gt;&lt;span&gt;latin1&lt;/span&gt;&lt;span&gt;로 변경&lt;/span&gt;&lt;/h3&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;SET CHARACTER SET latin1;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;이렇게 설정하면 이후 클라이언트가 전송하는 쿼리와 결과 모두 지정한 문자셋을 기준으로 변환됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;변경된 상태 확인&lt;/span&gt;&lt;/h3&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;SHOW VARIABLES LIKE 'character_set%';&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;이 명령어로 현재 문자셋 설정 상태를 확인할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;div&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;SET NAMES&lt;/span&gt;&lt;span&gt;와의 차이점&lt;/span&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;SET CHARACTER SET&lt;/span&gt;&lt;span&gt;은 내부적으로 &lt;/span&gt;&lt;span&gt;SET NAMES 문자셋 COLLATE default_collation&lt;/span&gt;&lt;span&gt;을 실행하는 것과 유사합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;그러나 &lt;/span&gt;&lt;span&gt;SET NAMES&lt;/span&gt;&lt;span&gt;는 좀 더 세밀한 제어가 가능합니다 (collation까지 직접 지정 가능).&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;예시:&lt;/span&gt;&lt;/h3&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;SET NAMES utf8mb4 COLLATE utf8mb4_general_ci;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;SET CHARACTER SET&lt;/span&gt;&lt;span&gt;은 간단하고 빠르게 전체 문자셋을 통일하고 싶을 때 유용합니다.&lt;/span&gt;&lt;/p&gt;
&lt;div&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;사용 시 주의사항&lt;/span&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;클라이언트 세션 단위로만 적용됩니다. 글로벌 설정이 아닙니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;서버 문자셋(&lt;/span&gt;&lt;span&gt;character_set_server&lt;/span&gt;&lt;span&gt;)은 변하지 않습니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;잘못된 문자셋 지정 시 에러가 발생할 수 있으므로 사전에 지원 여부를 확인하세요:&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;SHOW CHARACTER SET;&lt;/code&gt;&lt;/pre&gt;
&lt;div&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;마무리 및 실전 팁&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;다국어 지원, 이종 시스템 연동, 데이터 마이그레이션 환경에서는 문자셋 일치가 매우 중요합니다. &lt;/span&gt;&lt;span&gt;SET CHARACTER SET&lt;/span&gt;&lt;span&gt;은 특히 빠른 세션 제어용으로 활용하면 유용합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;실전 팁:&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span&gt;애플리케이션 연결 초기화 스크립트에 활용해 통신 문자셋을 일관되게 유지하세요.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;데이터 손실을 방지하려면 항상 &lt;/span&gt;&lt;span&gt;SHOW CHARACTER SET&lt;/span&gt;&lt;span&gt;으로 지원 문자셋을 사전 확인하세요.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;글로벌 서버 설정을 바꾸지 않고도 테스트용으로 쉽게 문자셋 변경이 가능합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;공식 문서 링크&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;더 자세한 내용은 MySQL 공식 문서를 참고하세요:&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://dev.mysql.com/doc/refman/8.0/en/set-character-set.html&quot;&gt;&lt;span&gt;SET CHARACTER SET 공식 문서&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>SQL/MYSQL</category>
      <category>MySQL</category>
      <category>set character set</category>
      <author>Ant_U</author>
      <guid isPermaLink="true">https://dbaant.tistory.com/247</guid>
      <comments>https://dbaant.tistory.com/247#entry247comment</comments>
      <pubDate>Wed, 25 Jun 2025 18:21:33 +0900</pubDate>
    </item>
    <item>
      <title>[MySQL] SET 문법: 변수 할당과 시스템 변수 관리 완벽 이해</title>
      <link>https://dbaant.tistory.com/246</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-pm-slice=&quot;1 3 []&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;들어가며&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;MySQL에서는 다양한 변수를 통해 세션 동작을 제어하고 운영 환경을 유연하게 구성할 수 있습니다. 이 변수들은 &lt;/span&gt;&lt;span&gt;SET&lt;/span&gt;&lt;span&gt; 명령어를 통해 동적으로 설정할 수 있으며, 특히 튜닝, 세션 제어, 트랜잭션 관리 등에 자주 사용됩니다. 오늘은 MySQL의 &lt;/span&gt;&lt;span&gt;SET&lt;/span&gt;&lt;span&gt; 문법과 변수 할당 방법을 자세히 살펴보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;div&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;SET&lt;/span&gt;&lt;span&gt;이란 무엇인가?&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;SET&lt;/span&gt;&lt;span&gt; 명령어는 MySQL에서 변수 값을 설정하거나 시스템 파라미터를 동적으로 조정할 때 사용됩니다. 크게 두 가지 용도로 나뉩니다:&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;사용자 변수(User-defined variable) 할당&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;시스템 변수(System variable) 설정&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;사용자 변수 할당&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;사용자 변수는 현재 세션 내에서만 유효한 임시 변수입니다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;기본 문법&lt;/span&gt;&lt;/h3&gt;
&lt;pre class=&quot;gams&quot;&gt;&lt;code&gt;SET @변수명 = 값;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;예제&lt;/span&gt;&lt;/h3&gt;
&lt;pre class=&quot;css&quot;&gt;&lt;code&gt;SET @my_counter = 10;
SELECT @my_counter;&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;@&lt;/span&gt;&lt;span&gt; 기호를 변수명 앞에 붙입니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;사용자 변수는 데이터 타입 선언 없이 사용 가능하며, 세션 종료 시 자동 소멸합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;시스템 변수 설정&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;시스템 변수는 MySQL 서버의 동작을 제어하는 핵심 파라미터입니다. 이 중 일부는 런타임에 조정할 수 있으며, 일부는 서버 재시작이 필요합니다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;기본 문법&lt;/span&gt;&lt;/h3&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;SET [GLOBAL | SESSION] 시스템변수 = 값;&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;GLOBAL&lt;/b&gt;&lt;/span&gt;&lt;span&gt;: 전체 서버 수준에서 적용 (다른 세션에도 적용)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;SESSION&lt;/b&gt;&lt;/span&gt;&lt;span&gt;: 현재 세션에만 적용 (기본값)&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;예제: 세션 변수 변경&lt;/span&gt;&lt;/h3&gt;
&lt;pre class=&quot;gams&quot;&gt;&lt;code&gt;SET SESSION sql_mode = 'STRICT_TRANS_TABLES';&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;예제: 글로벌 변수 변경&lt;/span&gt;&lt;/h3&gt;
&lt;pre class=&quot;gams&quot;&gt;&lt;code&gt;SET GLOBAL max_connections = 200;&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;주의:&lt;/b&gt;&lt;/span&gt;&lt;span&gt; 글로벌 변수 변경은 영구적이지 않으며, 서버 재시작 시 기본값으로 복원됩니다. 영구 반영을 위해서는 설정 파일(&lt;/span&gt;&lt;span&gt;my.cnf&lt;/span&gt;&lt;span&gt;) 수정이 필요합니다.&lt;/span&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;복수 변수 동시 설정&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;SET&lt;/span&gt;&lt;span&gt; 명령어로 여러 변수를 한 번에 설정할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;예제&lt;/span&gt;&lt;/h3&gt;
&lt;pre class=&quot;gams&quot;&gt;&lt;code&gt;SET @counter = 1, @total = 100;
SET SESSION autocommit = 0, sql_mode = 'ANSI';&lt;/code&gt;&lt;/pre&gt;
&lt;div&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;주요 사용 사례&lt;/span&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;튜닝:&lt;/b&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;SET GLOBAL innodb_buffer_pool_size = ...&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;세션 제어:&lt;/b&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;SET autocommit = 0;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;디버깅:&lt;/b&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;SET @debug_flag = 1;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;권한 없는 사용자의 임시 변수 활용:&lt;/b&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;SET @limit = 100;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;마무리 및 실전 팁&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;MySQL의 &lt;/span&gt;&lt;span&gt;SET&lt;/span&gt;&lt;span&gt; 명령어는 시스템 튜닝과 세션 관리를 유연하게 만들어주는 필수 도구입니다. 특히 사용자 변수는 간단한 로직 구현과 디버깅에 매우 유용합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;실전 팁:&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span&gt;시스템 변수 변경 시 &lt;/span&gt;&lt;span&gt;SHOW VARIABLES LIKE '변수명';&lt;/span&gt;&lt;span&gt; 으로 현재 값을 항상 확인하세요.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;글로벌 변수 변경은 운영 환경 적용 전에 충분히 테스트하세요.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;사용자 변수는 세션 단위로만 유지되므로 장기 데이터 저장에는 적합하지 않습니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;공식 문서 링크&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;더 자세한 내용은 MySQL 공식 문서를 참고하세요:&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://dev.mysql.com/doc/refman/8.0/en/set-variable.html&quot;&gt;&lt;span&gt;SET 문법 공식 문서&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>SQL/MYSQL</category>
      <category>MySQL</category>
      <category>set syntax for variable assignment</category>
      <author>Ant_U</author>
      <guid isPermaLink="true">https://dbaant.tistory.com/246</guid>
      <comments>https://dbaant.tistory.com/246#entry246comment</comments>
      <pubDate>Wed, 25 Jun 2025 18:20:40 +0900</pubDate>
    </item>
    <item>
      <title>[MySQL] UNINSTALL PLUGIN 사용법: 플러그인 안전하게 제거하기</title>
      <link>https://dbaant.tistory.com/245</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;들어가며&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;MySQL은 플러그인 기반 아키텍처를 통해 스토리지 엔진, 인증, 복제 등 다양한 기능을 유연하게 확장합니다. 그러나 운영 중 불필요해진 플러그인은 적절히 제거하는 것이 보안과 시스템 안정성 유지에 중요합니다. 이를 위해 사용하는 명령어가 바로 &lt;/span&gt;&lt;span&gt;UNINSTALL PLUGIN&lt;/span&gt;&lt;span&gt;입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;이 글에서는 &lt;/span&gt;&lt;span&gt;UNINSTALL PLUGIN&lt;/span&gt;&lt;span&gt; 명령어의 기본 문법, 사용 방법, 주의사항까지 자세히 살펴보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;div&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;UNINSTALL PLUGIN&lt;/span&gt;&lt;span&gt;이란 무엇인가?&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;UNINSTALL PLUGIN&lt;/span&gt;&lt;span&gt;은 MySQL 서버에 설치된 플러그인을 런타임 중에 동적으로 제거하는 명령어입니다. 서버 재시작 없이 즉시 반영되며, &lt;/span&gt;&lt;span&gt;mysql.plugin&lt;/span&gt;&lt;span&gt; 테이블에서 해당 플러그인 정보도 삭제됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;div&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;기본 문법과 사용 예제&lt;/span&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;기본 문법&lt;/span&gt;&lt;/h3&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;UNINSTALL PLUGIN 플러그인_이름;&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;플러그인_이름&lt;/b&gt;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;INSTALL PLUGIN&lt;/span&gt;&lt;span&gt; 시 지정했던 이름과 동일해야 합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;예제: &lt;/span&gt;&lt;span&gt;daemon_example&lt;/span&gt;&lt;span&gt; 플러그인 제거&lt;/span&gt;&lt;/h3&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;UNINSTALL PLUGIN daemon_example;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;설치 여부 확인&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;현재 설치된 플러그인 목록은 다음 명령어로 확인 가능합니다:&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;SHOW PLUGINS;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;해당 플러그인이 목록에서 사라졌다면 성공적으로 제거된 것입니다.&lt;/span&gt;&lt;/p&gt;
&lt;div&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;주의사항 및 권한&lt;/span&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;권한 필요&lt;/b&gt;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;UNINSTALL PLUGIN&lt;/span&gt;&lt;span&gt; 명령을 실행하려면 &lt;/span&gt;&lt;span&gt;UNINSTALL PLUGIN&lt;/span&gt;&lt;span&gt; 권한이 필요합니다. 일반적으로 &lt;/span&gt;&lt;span&gt;SUPER&lt;/span&gt;&lt;span&gt; 권한이 있는 계정이 사용합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;퍼시스턴스 반영&lt;/b&gt;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;mysql.plugin&lt;/span&gt;&lt;span&gt; 테이블에서 자동으로 삭제되어, 서버 재시작 이후에도 제거 상태가 유지됩니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;파일 삭제는 별도&lt;/b&gt;&lt;/span&gt;&lt;span&gt;: 공유 라이브러리 파일(&lt;/span&gt;&lt;span&gt;.so&lt;/span&gt;&lt;span&gt; 또는 &lt;/span&gt;&lt;span&gt;.dll&lt;/span&gt;&lt;span&gt;) 자체는 파일 시스템에서 별도로 삭제해야 합니다. &lt;/span&gt;&lt;span&gt;UNINSTALL PLUGIN&lt;/span&gt;&lt;span&gt;은 메타데이터만 제거합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;의존성 확인&lt;/b&gt;&lt;/span&gt;&lt;span&gt;: 일부 플러그인은 다른 기능에 의존하고 있을 수 있으므로 제거 전 기능 사용 여부를 반드시 검토하세요.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;MySQL 버전별 차이&lt;/span&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;MySQL 5.1부터 플러그인 아키텍처와 &lt;/span&gt;&lt;span&gt;UNINSTALL PLUGIN&lt;/span&gt;&lt;span&gt; 명령어 지원&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;MySQL 8.0 이후에도 동일한 방식으로 사용 가능&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;MySQL 8.0.14 이후 도입된 컴포넌트(&lt;/span&gt;&lt;span&gt;INSTALL/UNINSTALL COMPONENT&lt;/span&gt;&lt;span&gt;)와는 별도로 관리됨&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;마무리 및 실전 팁&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;운영 서버에서 불필요한 플러그인을 제거하는 것은 보안과 성능 최적화에 도움이 됩니다. &lt;/span&gt;&lt;span&gt;UNINSTALL PLUGIN&lt;/span&gt;&lt;span&gt;을 활용하면 서버 재시작 없이 즉시 적용 가능하므로 운영 중에도 안전하게 관리할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;실전 팁:&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span&gt;SHOW PLUGINS&lt;/span&gt;&lt;span&gt;로 제거 전 설치 상태를 먼저 점검하세요.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;공유 라이브러리 파일은 &lt;/span&gt;&lt;span&gt;UNINSTALL PLUGIN&lt;/span&gt;&lt;span&gt; 이후 별도로 정리하세요.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;운영 환경에서는 변경 전 반드시 백업과 테스트를 선행하세요.&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;공식 문서 링크&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;더 자세한 내용은 MySQL 공식 문서를 참고하세요:&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://dev.mysql.com/doc/refman/8.0/en/uninstall-plugin.html&quot;&gt;&lt;span&gt;UNINSTALL PLUGIN 공식 문서&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>SQL/MYSQL</category>
      <category>MySQL</category>
      <category>uninstall plugin</category>
      <author>Ant_U</author>
      <guid isPermaLink="true">https://dbaant.tistory.com/245</guid>
      <comments>https://dbaant.tistory.com/245#entry245comment</comments>
      <pubDate>Wed, 25 Jun 2025 18:13:47 +0900</pubDate>
    </item>
    <item>
      <title>[MySQL] UNINSTALL COMPONENT 사용법: 컴포넌트 제거와 관리 완벽 이해</title>
      <link>https://dbaant.tistory.com/244</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;들어가며&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;MySQL 8.0부터 컴포넌트 아키텍처가 도입되면서 다양한 확장 기능을 &lt;/span&gt;&lt;span&gt;INSTALL COMPONENT&lt;/span&gt;&lt;span&gt;로 쉽게 설치할 수 있게 되었습니다. 하지만 설치만큼 중요한 것이 바로 &lt;/span&gt;&lt;span&gt;&lt;b&gt;안전한 제거&lt;/b&gt;&lt;/span&gt;&lt;span&gt;입니다. 불필요한 컴포넌트가 시스템에 남아 있으면 보안상 위험하거나 시스템 리소스를 낭비할 수 있기 때문입니다. 이를 위해 사용하는 명령어가 &lt;/span&gt;&lt;span&gt;UNINSTALL COMPONENT&lt;/span&gt;&lt;span&gt;입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;이 글에서는 &lt;/span&gt;&lt;span&gt;UNINSTALL COMPONENT&lt;/span&gt;&lt;span&gt; 명령어의 기본 문법과 사용 예제, 주의사항까지 상세히 살펴보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;div&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;UNINSTALL COMPONENT&lt;/span&gt;&lt;span&gt;란 무엇인가?&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;UNINSTALL COMPONENT&lt;/span&gt;&lt;span&gt;는 MySQL 8.0.14부터 도입된 컴포넌트 제거 명령어입니다. 동적으로 설치된 컴포넌트를 서버 재시작 없이 런타임 중에 제거할 수 있도록 지원합니다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;컴포넌트란?&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;MySQL 서버의 새로운 확장 방식&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;보안, 감사, 로깅, 비동기 서비스 등 다양한 기능을 모듈 형태로 제공&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;설치는 &lt;/span&gt;&lt;span&gt;INSTALL COMPONENT&lt;/span&gt;&lt;span&gt; 명령어로 수행됨&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;기본 문법과 사용 예제&lt;/span&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;기본 문법&lt;/span&gt;&lt;/h3&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;UNINSTALL COMPONENT 'file://컴포넌트_이름';&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;여기서 &lt;/span&gt;&lt;span&gt;컴포넌트_이름&lt;/span&gt;&lt;span&gt;은 설치 시 사용한 경로명을 그대로 입력해야 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;예제: &lt;/span&gt;&lt;span&gt;audit_log&lt;/span&gt;&lt;span&gt; 컴포넌트 제거하기&lt;/span&gt;&lt;/h3&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;UNINSTALL COMPONENT 'file://component_audit_api_message_emit';&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;설치 여부 확인&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;컴포넌트가 현재 설치되어 있는지 확인하려면:&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;n1ql&quot;&gt;&lt;code&gt;SELECT * FROM mysql.component;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;이 테이블에서 제거 대상 컴포넌트가 존재하는지 확인 가능합니다.&lt;/span&gt;&lt;/p&gt;
&lt;div&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;주의사항 및 권한&lt;/span&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;권한 필요&lt;/b&gt;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;UNINSTALL COMPONENT&lt;/span&gt;&lt;span&gt; 권한이 필요합니다. 일반적으로 &lt;/span&gt;&lt;span&gt;SUPER&lt;/span&gt;&lt;span&gt; 권한을 가진 계정이 사용합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;정확한 경로 사용&lt;/b&gt;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;INSTALL COMPONENT&lt;/span&gt;&lt;span&gt; 시 입력한 정확한 경로명을 그대로 입력해야 합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;퍼시스턴스 반영&lt;/b&gt;&lt;/span&gt;&lt;span&gt;: 제거하면 &lt;/span&gt;&lt;span&gt;mysql.component&lt;/span&gt;&lt;span&gt; 테이블에서도 해당 컴포넌트 정보가 즉시 삭제됩니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;의존성 확인&lt;/b&gt;&lt;/span&gt;&lt;span&gt;: 일부 컴포넌트는 다른 컴포넌트와 의존 관계가 있을 수 있으므로 제거 전 의존성 확인이 필요합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;MySQL 버전별 차이&lt;/span&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;UNINSTALL COMPONENT&lt;/span&gt;&lt;span&gt;는 MySQL 8.0.14 이상에서만 지원됩니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;구버전(MySQL 5.x 시절)의 플러그인 제거는 &lt;/span&gt;&lt;span&gt;UNINSTALL PLUGIN&lt;/span&gt;&lt;span&gt; 명령을 사용합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;마무리 및 실전 팁&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;컴포넌트 기반 아키텍처는 MySQL 확장을 매우 유연하게 만들어 주지만, 설치 후 관리 또한 신중해야 합니다. 필요하지 않은 컴포넌트는 주기적으로 점검하여 안전하게 제거하는 것이 시스템 안정성과 보안을 유지하는 핵심입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;실전 팁:&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span&gt;컴포넌트 제거 전 항상 &lt;/span&gt;&lt;span&gt;mysql.component&lt;/span&gt;&lt;span&gt; 테이블로 설치 상태를 먼저 확인하세요.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;제거 명령 시 경로 문자열을 오타 없이 입력하세요.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;운영 서버에서는 제거 전 반드시 의존성 여부를 검토하고 백업을 권장합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;공식 문서 링크&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;더 자세한 내용은 MySQL 공식 문서를 참고하세요:&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://dev.mysql.com/doc/refman/8.0/en/uninstall-component.html&quot;&gt;&lt;span&gt;UNINSTALL COMPONENT 공식 문서&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>SQL/MYSQL</category>
      <category>MySQL</category>
      <category>uninstall component</category>
      <author>Ant_U</author>
      <guid isPermaLink="true">https://dbaant.tistory.com/244</guid>
      <comments>https://dbaant.tistory.com/244#entry244comment</comments>
      <pubDate>Wed, 25 Jun 2025 18:13:00 +0900</pubDate>
    </item>
    <item>
      <title>[MySQL] INSTALL PLUGIN 사용법: 플러그인 설치와 관리 완벽 이해</title>
      <link>https://dbaant.tistory.com/243</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-pm-slice=&quot;1 3 []&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;들어가며&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;MySQL은 다양한 기능을 플러그인 형태로 확장할 수 있습니다. 스토리지 엔진, 인증, 복제 기능 등 많은 확장 기능이 플러그인으로 제공됩니다. 이러한 플러그인을 설치하고 활성화하는 가장 기본적인 명령어가 바로 &lt;/span&gt;&lt;span&gt;INSTALL PLUGIN&lt;/span&gt;&lt;span&gt;입니다. 오늘은 MySQL의 &lt;/span&gt;&lt;span&gt;INSTALL PLUGIN&lt;/span&gt;&lt;span&gt; 문법과 실제 사용 방법을 상세히 알아보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;div&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;INSTALL PLUGIN&lt;/span&gt;&lt;span&gt;이란 무엇인가?&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;INSTALL PLUGIN&lt;/span&gt;&lt;span&gt;은 MySQL 5.x 시절부터 제공된 전통적인 플러그인 설치 명령어입니다. MySQL 서버에 새로운 기능을 추가할 때 서버 실행 중에 플러그인을 동적으로 로드하여 활성화할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;플러그인 종류 예시&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;스토리지 엔진 플러그인 (예: &lt;/span&gt;&lt;span&gt;InnoDB&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;ARCHIVE&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;인증 플러그인 (예: &lt;/span&gt;&lt;span&gt;auth_socket&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;caching_sha2_password&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;복제 플러그인 (예: Group Replication)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;기타 다양한 서버 확장 기능&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;기본 문법과 사용 예제&lt;/span&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;기본 문법&lt;/span&gt;&lt;/h3&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;INSTALL PLUGIN 플러그인_이름 SONAME '공유라이브러리파일.so';&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;플러그인_이름&lt;/b&gt;&lt;/span&gt;&lt;span&gt;: MySQL 서버 내부에서 사용할 이름&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;공유라이브러리파일.so&lt;/b&gt;&lt;/span&gt;&lt;span&gt;: 실제 서버 파일 시스템에 존재하는 공유 라이브러리 파일&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;예제: &lt;/span&gt;&lt;span&gt;daemon_example&lt;/span&gt;&lt;span&gt; 플러그인 설치&lt;/span&gt;&lt;/h3&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;INSTALL PLUGIN daemon_example SONAME 'daemon_example.so';&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;설치 확인&lt;/span&gt;&lt;/h3&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;SHOW PLUGINS;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;이 명령어로 현재 서버에 설치된 플러그인 목록과 상태를 확인할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;플러그인 제거&lt;/span&gt;&lt;/h3&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;UNINSTALL PLUGIN daemon_example;&lt;/code&gt;&lt;/pre&gt;
&lt;div&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;주의사항 및 권한&lt;/span&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;파일 위치&lt;/b&gt;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;SONAME&lt;/span&gt;&lt;span&gt;에 지정된 라이브러리 파일은 &lt;/span&gt;&lt;span&gt;plugin_dir&lt;/span&gt;&lt;span&gt; 디렉토리에 위치해야 MySQL이 이를 로드할 수 있습니다. &lt;/span&gt;&lt;span&gt;SHOW VARIABLES LIKE 'plugin_dir';&lt;/span&gt;&lt;span&gt; 명령어로 경로를 확인할 수 있습니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;권한 필요&lt;/b&gt;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;INSTALL PLUGIN&lt;/span&gt;&lt;span&gt; 명령을 실행하려면 &lt;/span&gt;&lt;span&gt;INSTALL PLUGIN&lt;/span&gt;&lt;span&gt; 권한이 필요합니다. 일반적으로 &lt;/span&gt;&lt;span&gt;SUPER&lt;/span&gt;&lt;span&gt; 권한이 있는 계정이 사용됩니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;퍼시스턴스&lt;/b&gt;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;INSTALL PLUGIN&lt;/span&gt;&lt;span&gt;으로 설치한 플러그인은 &lt;/span&gt;&lt;span&gt;mysql.plugin&lt;/span&gt;&lt;span&gt; 테이블에 기록됩니다. 서버 재시작 이후에도 자동으로 활성화됩니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;설정파일 활용&lt;/b&gt;&lt;/span&gt;&lt;span&gt;: 서버 재시작 시 플러그인을 자동으로 로드하려면 &lt;/span&gt;&lt;span&gt;my.cnf&lt;/span&gt;&lt;span&gt; 설정 파일에 다음과 같이 명시할 수도 있습니다:&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;ini&quot;&gt;&lt;code&gt;[mysqld]
plugin-load=daemon_example.so&lt;/code&gt;&lt;/pre&gt;
&lt;div&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;MySQL 버전별 차이점&lt;/span&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;MySQL 5.1부터 플러그인 아키텍처 도입 및 &lt;/span&gt;&lt;span&gt;INSTALL PLUGIN&lt;/span&gt;&lt;span&gt; 지원&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;MySQL 8.0 이후에도 &lt;/span&gt;&lt;span&gt;INSTALL PLUGIN&lt;/span&gt;&lt;span&gt;은 여전히 활용 가능&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;MySQL 8.0.14 이후에는 새로운 &lt;/span&gt;&lt;span&gt;INSTALL COMPONENT&lt;/span&gt;&lt;span&gt; 방식이 병행 도입 (하지만 기존 플러그인 확장은 여전히 &lt;/span&gt;&lt;span&gt;INSTALL PLUGIN&lt;/span&gt;&lt;span&gt;으로 처리됨)&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;마무리 및 실전 팁&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;플러그인은 MySQL의 유연성과 확장성을 만들어주는 핵심 요소입니다. &lt;/span&gt;&lt;span&gt;INSTALL PLUGIN&lt;/span&gt;&lt;span&gt; 명령어를 통해 서버를 재시작하지 않고도 대부분의 확장을 적용할 수 있으므로 운영 중인 시스템에도 유용하게 활용됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;실전 팁:&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span&gt;설치 전 라이브러리 파일이 &lt;/span&gt;&lt;span&gt;plugin_dir&lt;/span&gt;&lt;span&gt;에 정확히 배치되어 있는지 확인하세요.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;운영 환경 적용 전 반드시 테스트 환경에서 검증하세요.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;SHOW PLUGINS&lt;/span&gt;&lt;span&gt;와 &lt;/span&gt;&lt;span&gt;mysql.plugin&lt;/span&gt;&lt;span&gt; 테이블을 활용해 설치 상태를 주기적으로 점검하세요.&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;공식 문서 링크&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;더 자세한 내용은 MySQL 공식 문서를 참고하세요:&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://dev.mysql.com/doc/refman/8.0/en/install-plugin.html&quot;&gt;&lt;span&gt;INSTALL PLUGIN 공식 문서&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>SQL/MYSQL</category>
      <category>install plugin</category>
      <category>MySQL</category>
      <author>Ant_U</author>
      <guid isPermaLink="true">https://dbaant.tistory.com/243</guid>
      <comments>https://dbaant.tistory.com/243#entry243comment</comments>
      <pubDate>Wed, 25 Jun 2025 18:11:59 +0900</pubDate>
    </item>
    <item>
      <title>[MySQL] INSTALL COMPONENT 문법: 플러그인과 컴포넌트 설치 완벽 이해</title>
      <link>https://dbaant.tistory.com/242</link>
      <description>&lt;h2 data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;들어가며&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;MySQL을 사용하다 보면 기능 확장이 필요한 경우가 많습니다. 예전에는 주로 &lt;/span&gt;&lt;span&gt;INSTALL PLUGIN&lt;/span&gt;&lt;span&gt;을 사용해 플러그인을 설치했지만, MySQL 8.0부터는 더 발전된 &lt;/span&gt;&lt;span&gt;INSTALL COMPONENT&lt;/span&gt;&lt;span&gt; 명령어가 도입되었습니다. 이 명령어는 플러그인보다 더 유연하고 모듈화된 아키텍처를 제공하며, MySQL의 최신 기능을 활용하는 데 중요한 역할을 합니다. 오늘은 &lt;/span&gt;&lt;span&gt;INSTALL COMPONENT&lt;/span&gt;&lt;span&gt; 명령어의 개념부터 실습 예제까지 자세히 알아보겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;div&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;INSTALL COMPONENT&lt;/span&gt;&lt;span&gt;란 무엇인가?&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;MySQL 8.0.14 버전부터 새롭게 도입된 &lt;/span&gt;&lt;span&gt;INSTALL COMPONENT&lt;/span&gt;&lt;span&gt; 명령어는 기존의 &lt;/span&gt;&lt;span&gt;INSTALL PLUGIN&lt;/span&gt;&lt;span&gt;과 유사하지만, 좀 더 진보된 컴포넌트 기반 시스템을 위한 것입니다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;컴포넌트 vs 플러그인&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;플러그인(PLUGIN)&lt;/b&gt;&lt;/span&gt;&lt;span&gt;: MySQL의 특정 기능 확장을 위해 오래전부터 사용됨 (예: 인증 플러그인, 스토리지 엔진 등)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;컴포넌트(COMPONENT)&lt;/b&gt;&lt;/span&gt;&lt;span&gt;: 플러그인보다 더 유연한 모듈화 구조. 서로 독립적이면서도 쉽게 상호 작용 가능. 비동기 기능, 새로운 보안 기능 등에 활용됨.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;컴포넌트는 MySQL 서버 실행 중에 동적으로 설치 및 제거가 가능하며, 별도의 서버 재시작이 필요 없습니다.&lt;/span&gt;&lt;/p&gt;
&lt;div&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;기본 문법과 사용 예시&lt;/span&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;기본 문법&lt;/span&gt;&lt;/h3&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;INSTALL COMPONENT '컴포넌트_경로';&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;여기서 &lt;/span&gt;&lt;span&gt;컴포넌트_경로&lt;/span&gt;&lt;span&gt;는 컴포넌트의 이름을 나타내며, 일반적으로 &lt;/span&gt;&lt;span&gt;file://&lt;/span&gt;&lt;span&gt; 스킴을 사용합니다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;예제: audit_log 컴포넌트 설치하기&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;MySQL Enterprise Edition에서 제공하는 &lt;/span&gt;&lt;span&gt;audit_log&lt;/span&gt;&lt;span&gt; 컴포넌트를 설치하는 예제입니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;INSTALL COMPONENT 'file://component_audit_api_message_emit';&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;이 명령어를 실행하면 해당 컴포넌트가 활성화되며, 설치된 컴포넌트 목록은 다음과 같이 확인할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;n1ql&quot;&gt;&lt;code&gt;SELECT * FROM mysql.component;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;컴포넌트 제거&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;컴포넌트를 제거할 때는 &lt;/span&gt;&lt;span&gt;UNINSTALL COMPONENT&lt;/span&gt;&lt;span&gt;를 사용합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;UNINSTALL COMPONENT 'file://component_audit_api_message_emit';&lt;/code&gt;&lt;/pre&gt;
&lt;div&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;주의사항 및 버전별 특징&lt;/span&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;MySQL 8.0.14 이상에서만 지원&lt;/b&gt;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;INSTALL COMPONENT&lt;/span&gt;&lt;span&gt;는 8.0.14부터 도입되었으므로 구버전에서는 사용할 수 없습니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;권한 필요&lt;/b&gt;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;INSTALL COMPONENT&lt;/span&gt;&lt;span&gt;를 실행하려면 &lt;/span&gt;&lt;span&gt;INSTALL COMPONENT&lt;/span&gt;&lt;span&gt; 권한이 필요합니다. 일반적으로 &lt;/span&gt;&lt;span&gt;SUPER&lt;/span&gt;&lt;span&gt; 권한을 가진 사용자가 수행합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;퍼시스턴스&lt;/b&gt;&lt;/span&gt;&lt;span&gt;: 설치된 컴포넌트 정보는 &lt;/span&gt;&lt;span&gt;mysql.component&lt;/span&gt;&lt;span&gt; 테이블에 저장되어 서버 재시작 후에도 유지됩니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;에러 발생 시&lt;/b&gt;&lt;/span&gt;&lt;span&gt;: 설치하려는 컴포넌트가 서버에 존재하지 않거나 권한이 부족하면 에러가 발생합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;마무리 및 실전 팁&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;INSTALL COMPONENT&lt;/span&gt;&lt;span&gt;는 MySQL의 최신 아키텍처 변화를 잘 보여주는 기능입니다. 서버를 재시작하지 않고도 새로운 기능을 유연하게 추가할 수 있어 운영 중인 시스템에도 큰 도움이 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;실전 팁:&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span&gt;새 기능을 도입할 때 컴포넌트 방식이 지원되는지 먼저 확인해보세요.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;mysql.component&lt;/span&gt;&lt;span&gt; 테이블을 주기적으로 점검하여 불필요한 컴포넌트가 설치되어 있지 않은지 확인하세요.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;반드시 운영 환경이 아닌 테스트 환경에서 먼저 설치 테스트를 진행하세요.&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;공식 문서 링크&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;더 자세한 내용은 MySQL 공식 문서를 참고하세요: &lt;/span&gt;&lt;span&gt;&lt;a href=&quot;https://dev.mysql.com/doc/refman/8.0/en/component-overview.html&quot;&gt;https://dev.mysql.com/doc/refman/8.0/en/component-overview.html&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;</description>
      <category>SQL/MYSQL</category>
      <category>install component</category>
      <category>MySQL</category>
      <author>Ant_U</author>
      <guid isPermaLink="true">https://dbaant.tistory.com/242</guid>
      <comments>https://dbaant.tistory.com/242#entry242comment</comments>
      <pubDate>Wed, 25 Jun 2025 18:10:04 +0900</pubDate>
    </item>
    <item>
      <title>[MySQL] Loadable Functions 삭제하기: DROP FUNCTION 사용법</title>
      <link>https://dbaant.tistory.com/241</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MySQL을 사용하다 보면 커스텀 기능이 필요할 때가 있습니다. 이럴 때 종종 &lt;b&gt;Loadable Function&lt;/b&gt;(로드 가능한 함수)을 만들어 사용하게 되는데요. 하지만 이 함수를 더 이상 사용하지 않게 되거나 수정이 필요할 때는 삭제해야 합니다. 이때 사용하는 명령어가 바로 DROP FUNCTION입니다. 이번 글에서는 Loadable Function을 삭제할 때 사용하는 DROP FUNCTION 문에 대해 자세히 알아보겠습니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Loadable Function이란?&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 간단히 Loadable Function이 무엇인지 짚고 넘어가겠습니다. Loadable Function은 사용자가 C 언어로 작성한 공유 라이브러리 파일(.so 또는 .dll 등)을 MySQL 서버에 로드하여 사용할 수 있는 사용자 정의 함수(UDF)입니다. 일반적인 SQL 함수로 구현하기 어려운 복잡한 계산이나 외부 라이브러리 기능을 MySQL 내에서 활용할 수 있게 해줍니다.&lt;/p&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;CREATE FUNCTION my_custom_function RETURNS INTEGER SONAME 'my_custom_library.so';
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 생성하면 my_custom_function()을 일반 함수처럼 사용할 수 있습니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;DROP FUNCTION 문법&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Loadable Function을 삭제할 때는 다음과 같이 DROP FUNCTION 문을 사용합니다:&lt;/p&gt;
&lt;pre class=&quot;n1ql&quot;&gt;&lt;code&gt;DROP FUNCTION [IF EXISTS] function_name;
&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;IF EXISTS 옵션을 사용하면 삭제하려는 함수가 존재하지 않을 경우에도 오류를 발생시키지 않습니다.&lt;/li&gt;
&lt;li&gt;function_name에는 삭제할 Loadable Function의 이름을 입력합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예시:&lt;/p&gt;
&lt;pre class=&quot;n1ql&quot;&gt;&lt;code&gt;DROP FUNCTION IF EXISTS my_custom_function;
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 명령어를 실행하면 해당 Loadable Function이 MySQL 서버에서 제거됩니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;MySQL 버전별 주의사항&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MySQL에서는 Loadable Function과 일반 스토어드 함수가 다르게 관리됩니다. 특히 다음 사항에 주의하세요:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;MySQL 8.0 버전부터는 &lt;b&gt;UDF 설치가 보안상 더 엄격하게 제한&lt;/b&gt;됩니다. mysql.func 테이블을 직접 수정하는 방식은 deprecated 되었고, 대부분의 경우 INSTALL COMPONENT 명령어를 사용하여 서버 컴포넌트 형태로 관리하는 것이 권장됩니다.&lt;/li&gt;
&lt;li&gt;DROP FUNCTION 명령어는 Loadable Function과 스토어드 함수를 구분하지 않고 동일하게 사용됩니다. 단, 삭제 대상이 Loadable Function인지 확인하는 것이 좋습니다.&lt;/li&gt;
&lt;li&gt;MySQL 5.x 버전에서는 CREATE FUNCTION ... SONAME 방식이 일반적이었지만, 8.0 이후 버전에서는 보안 및 권한 정책 변화로 인해 운영 환경에서는 Loadable Function 사용이 줄어드는 추세입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;실무에서의 고려사항&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;서버 재시작 여부 확인&lt;/b&gt;: Loadable Function을 DROP FUNCTION으로 삭제해도, 해당 공유 라이브러리 파일 자체는 서버 디렉토리에서 제거되지 않습니다. 필요하다면 파일 시스템에서도 삭제하세요.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;권한 확인&lt;/b&gt;: UDF를 삭제하려면 일반적으로 DROP 권한이 필요합니다. 관리 권한이 없다면 DBA에게 요청해야 할 수도 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;호환성 확인&lt;/b&gt;: 다른 애플리케이션이나 스크립트에서 이 함수를 호출하고 있지 않은지 확인한 후 삭제하는 것이 안전합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;마무리 및 실용 팁&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;DROP FUNCTION은 Loadable Function과 스토어드 함수 모두 삭제할 때 사용된다.&lt;/li&gt;
&lt;li&gt;MySQL 8.0 이후 버전에서는 Loadable Function 사용이 보안상 권장되지 않는 경우가 많으므로 대안을 고려해볼 것.&lt;/li&gt;
&lt;li&gt;삭제 전 항상 의존성을 점검하고, 파일 시스템의 라이브러리 파일까지 정리하는 것을 잊지 말자.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;공식 문서 링크&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://dev.mysql.com/doc/refman/8.0/en/drop-function.html&quot;&gt;MySQL 공식 DROP FUNCTION 문서&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>SQL/MYSQL</category>
      <category>drop function</category>
      <category>MySQL</category>
      <author>Ant_U</author>
      <guid isPermaLink="true">https://dbaant.tistory.com/241</guid>
      <comments>https://dbaant.tistory.com/241#entry241comment</comments>
      <pubDate>Mon, 23 Jun 2025 18:50:59 +0900</pubDate>
    </item>
    <item>
      <title>SQLP 자격증 대비: 집계 함수와 윈도우 함수 완벽 정리</title>
      <link>https://dbaant.tistory.com/240</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1 data-pm-slice=&quot;1 3 []&quot;&gt;&lt;span&gt;SQLP 자격증 대비: 집계 및 윈도우 함수 정리&lt;/span&gt;&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;SQLP 자격증을 준비하면서 가장 핵심적으로 출제되는 파트 중 하나가 &lt;/span&gt;&lt;span&gt;&lt;b&gt;집계 함수와 윈도우 함수&lt;/b&gt;&lt;/span&gt;&lt;span&gt;입니다. 이 두 가지 개념을 정확히 이해하고 차이점을 명확히 알고 있으면 시험뿐 아니라 실무 SQL 작성에서도 큰 도움이 됩니다. 이 글에서는 SQLP 관점에서 꼭 알아야 할 내용을 깔끔히 정리합니다.&lt;/span&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;집계 함수 (Aggregate Functions)&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;집계 함수는 그룹 전체의 값을 요약하여 하나의 결과를 반환합니다. 일반적으로 &lt;/span&gt;&lt;span&gt;GROUP BY&lt;/span&gt;&lt;span&gt; 절과 함께 사용되지만, 전체 테이블을 대상으로 단일 요약 값을 구할 수도 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;주요 집계 함수&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;COUNT()&lt;/b&gt;&lt;/span&gt;&lt;span&gt;: 행 개수 세기&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;SUM()&lt;/b&gt;&lt;/span&gt;&lt;span&gt;: 합계&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;AVG()&lt;/b&gt;&lt;/span&gt;&lt;span&gt;: 평균&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;MIN() / MAX()&lt;/b&gt;&lt;/span&gt;&lt;span&gt;: 최소 / 최대값&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;예제&lt;/span&gt;&lt;/h3&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;SELECT 부서번호, COUNT(*) AS 직원수, AVG(급여) AS 평균급여
FROM 사원
GROUP BY 부서번호;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;이 예제는 각 부서별 직원 수와 평균 급여를 구합니다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;특징&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;그룹 단위로 하나의 결과 반환&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;그룹핑되지 않은 일반 컬럼은 SELECT 절에 쓸 수 없음 (GROUP BY 제약)&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;윈도우 함수 (Window Functions)&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;윈도우 함수는 집계처럼 요약하지만, &lt;/span&gt;&lt;span&gt;&lt;b&gt;행을 소멸시키지 않고&lt;/b&gt;&lt;/span&gt;&lt;span&gt; 각 행마다 계산된 집계 결과를 보여줍니다. &lt;/span&gt;&lt;span&gt;OVER()&lt;/span&gt;&lt;span&gt; 절을 사용해 분석 범위(Window)를 정의합니다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;주요 윈도우 함수&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;SUM() OVER()&lt;/b&gt;&lt;/span&gt;&lt;span&gt;: 누적 합계&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;AVG() OVER()&lt;/b&gt;&lt;/span&gt;&lt;span&gt;: 이동 평균 등 가능&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;ROW_NUMBER() OVER()&lt;/b&gt;&lt;/span&gt;&lt;span&gt;: 순번 부여&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;RANK() / DENSE_RANK()&lt;/b&gt;&lt;/span&gt;&lt;span&gt;: 순위 부여&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;LAG() / LEAD()&lt;/b&gt;&lt;/span&gt;&lt;span&gt;: 이전/다음 행 값 참조&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;예제&lt;/span&gt;&lt;/h3&gt;
&lt;pre class=&quot;n1ql&quot;&gt;&lt;code&gt;SELECT 사원번호, 부서번호, 급여,
       SUM(급여) OVER (PARTITION BY 부서번호) AS 부서별총급여
FROM 사원;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;이 예제는 부서별 총급여를 각 사원 행마다 표시합니다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;특징&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;행을 제거하지 않음 (모든 원본 행 유지)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;PARTITION BY&lt;/span&gt;&lt;span&gt;로 그룹 범위 지정 가능&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;ORDER BY&lt;/span&gt;&lt;span&gt;로 정렬 기준 지정 가능&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;집계 함수 vs 윈도우 함수 차이 정리&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;구분집계 함수윈도우 함수&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;반환 행&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;그룹 당 1행&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;원본 행 수 유지&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;사용 위치&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;SELECT, HAVING&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;SELECT, ORDER BY&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;주요 절&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;GROUP BY&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;OVER (PARTITION BY / ORDER BY)&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;SQLP에서는 이 차이를 묻는 문제가 자주 출제됩니다. 특히 &quot;소멸형 집계 vs 비소멸형 집계&quot;라는 용어로 구분하는 경우도 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;SQLP 실전 대비 팁&lt;/span&gt;&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span&gt;OVER()&lt;/span&gt;&lt;span&gt; 절 없이 단순 SUM() 사용 &amp;rarr; 집계 함수&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;OVER()&lt;/span&gt;&lt;span&gt; 절이 나오면 &amp;rarr; 윈도우 함수&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;시험에서 &lt;/span&gt;&lt;span&gt;PARTITION BY&lt;/span&gt;&lt;span&gt; 유무에 따른 결과 차이를 잘 파악하세요.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;ROW_NUMBER()&lt;/span&gt;&lt;span&gt;와 &lt;/span&gt;&lt;span&gt;RANK()&lt;/span&gt;&lt;span&gt;의 차이 (동순위 처리) 꼭 숙지&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;실습으로 직접 결과 행 수 확인해보는 연습 추천&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;집계 함수와 윈도우 함수는 SQLP에서 자주 나오는 핵심 테마입니다. 개념만 이해하면 문제 유형이 반복되므로, 다양한 예제와 기출문제를 통해 연습하면 충분히 고득점을 노릴 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;공식 참고 자료&lt;/span&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;한국데이터산업진흥원 SQLP 공식 교재&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;ANSI SQL 표준 문서 (ISO/IEC 9075)&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>자격증/SQLP</category>
      <category>SQLP</category>
      <category>자격증</category>
      <author>Ant_U</author>
      <guid isPermaLink="true">https://dbaant.tistory.com/240</guid>
      <comments>https://dbaant.tistory.com/240#entry240comment</comments>
      <pubDate>Wed, 18 Jun 2025 16:56:05 +0900</pubDate>
    </item>
    <item>
      <title>[MySQL] CREATE FUNCTION: Loadable Function 작성법 완벽 가이드</title>
      <link>https://dbaant.tistory.com/239</link>
      <description>&lt;h1 data-pm-slice=&quot;1 3 []&quot;&gt;&amp;nbsp;&lt;/h1&gt;
&lt;h1 data-pm-slice=&quot;1 3 []&quot;&gt;&lt;span&gt;MySQL CREATE FUNCTION Statement for Loadable Functions 알아보기&lt;/span&gt;&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;MySQL을 사용하다 보면 내장 함수 외에 직접 만든 함수를 사용하고 싶을 때가 있습니다. 이런 경우 MySQL은 Loadable Function (로더블 함수)를 지원합니다. 이 글에서는 Loadable Function이 무엇인지, 어떻게 작성하고 MySQL에 등록하는지, 그리고 버전 별 차이점을 설명합니다.&lt;/span&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;Loadable Function이란?&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;Loadable Function은 MySQL 서버의 공유 라이브러리로 작성한 C 언어 기반 사용자 정의 함수(UDF)입니다. 즉, SQL 내장 함수처럼 호출할 수 있지만, 사용자가 직접 작성한 C 코드로 동작합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;예를 들어, 복잡한 수학 계산, 문자열 처리, 커스텀 암호화 로직 등을 빠르게 처리할 때 유용합니다. MySQL 서버의 퍼포먼스를 최대한 활용할 수 있지만, 보안과 안정성 관리가 중요합니다.&lt;/span&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;CREATE FUNCTION 문법&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;Loadable Function을 등록하려면 &lt;/span&gt;&lt;span&gt;CREATE FUNCTION&lt;/span&gt;&lt;span&gt; 구문을 사용합니다. 일반적인 문법은 다음과 같습니다:&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;CREATE FUNCTION 함수명 RETURNS 반환타입
SONAME '라이브러리파일.so';&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;함수명&lt;/b&gt;&lt;/span&gt;&lt;span&gt;: SQL에서 사용할 함수 이름&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;RETURNS&lt;/b&gt;&lt;/span&gt;&lt;span&gt;: 반환 데이터 타입 (e.g. STRING, INTEGER, REAL)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;SONAME&lt;/b&gt;&lt;/span&gt;&lt;span&gt;: 서버에 위치한 공유 라이브러리 파일 이름&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;예제&lt;/span&gt;&lt;/h3&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;CREATE FUNCTION my_add RETURNS INTEGER
SONAME 'my_functions.so';&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;이 명령어는 &lt;/span&gt;&lt;span&gt;my_functions.so&lt;/span&gt;&lt;span&gt;라는 공유 라이브러리에서 &lt;/span&gt;&lt;span&gt;my_add&lt;/span&gt;&lt;span&gt; 함수를 로드하여 SQL 내에서 사용할 수 있게 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;주의사항 및 버전 차이&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;MySQL의 Loadable Function은 다음 사항을 반드시 주의해야 합니다:&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-spread=&quot;true&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;공유 라이브러리 빌드&lt;/b&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;반드시 MySQL UDF API를 사용하여 C로 컴파일해야 합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;운영체제 아키텍처, MySQL 서버 버전과 호환되어야 합니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;파일 경로&lt;/b&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;MySQL은 &lt;/span&gt;&lt;span&gt;plugin_dir&lt;/span&gt;&lt;span&gt; 디렉토리에서 라이브러리를 찾습니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;이 경로는 &lt;/span&gt;&lt;span&gt;SHOW VARIABLES LIKE 'plugin_dir';&lt;/span&gt;&lt;span&gt;로 확인할 수 있습니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;보안&lt;/b&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;Loadable Function은 서버 권한으로 실행되므로 보안 위험이 존재합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;MySQL 8.0.29부터는 &lt;/span&gt;&lt;span&gt;CREATE FUNCTION ... SONAME&lt;/span&gt;&lt;span&gt; 사용이 기본적으로 비활성화되어 있습니다 (변수 &lt;/span&gt;&lt;span&gt;mysql_udf_metadata&lt;/span&gt;&lt;span&gt;로 제어).&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;삭제 방법&lt;/b&gt;&lt;/span&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;함수 삭제는 간단합니다:&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;n1ql&quot;&gt;&lt;code&gt;DROP FUNCTION 함수명;&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;MySQL 8.x 이후의 변화&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;MySQL 8.0.29 이후 버전에서는 보안 강화를 위해 Loadable Function 기능 사용이 제한되었습니다. 기본적으로 서버 설정에서 별도 활성화하지 않으면 사용이 불가능합니다. 이는 운영 환경에서의 보안 사고 방지를 위한 조치입니다.&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;CREATE FUNCTION ... SONAME&lt;/span&gt;&lt;span&gt; 활성화를 위해서는 &lt;/span&gt;&lt;span&gt;mysql.udf_registration&lt;/span&gt;&lt;span&gt; 권한 필요&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;mysql_udf_metadata&lt;/span&gt;&lt;span&gt; 시스템 변수 조정 필요&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;따라서 최신 MySQL 버전을 사용할 경우, Loadable Function보다는 &lt;/span&gt;&lt;span&gt;&lt;b&gt;Stored Function&lt;/b&gt;&lt;/span&gt;&lt;span&gt;이나 &lt;/span&gt;&lt;span&gt;&lt;b&gt;Plugin API&lt;/b&gt;&lt;/span&gt;&lt;span&gt; 활용을 먼저 고려하는 것이 권장됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;h1&gt;&lt;span&gt;마무리 및 실전 팁&lt;/span&gt;&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;Loadable Function은 MySQL 기능을 확장하는 강력한 도구이지만, 보안과 유지보수를 위해 신중하게 사용해야 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;실전 팁:&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span&gt;되도록 최신 버전에서는 Plugin API나 내장 함수로 대체 가능한지 검토하세요.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;개발-운영 환경이 동일한 라이브러리 아키텍처를 유지하세요.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;서버 업데이트 시 라이브러리 재빌드를 준비하세요.&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;공식 문서 링크&lt;/span&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://dev.mysql.com/doc/refman/8.0/en/create-function-loadable.html&quot;&gt;&lt;span&gt;MySQL CREATE FUNCTION (Loadable Functions) 공식 문서&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>SQL/MYSQL</category>
      <category>create function</category>
      <category>loadable function</category>
      <category>MySQL</category>
      <author>Ant_U</author>
      <guid isPermaLink="true">https://dbaant.tistory.com/239</guid>
      <comments>https://dbaant.tistory.com/239#entry239comment</comments>
      <pubDate>Wed, 18 Jun 2025 16:53:59 +0900</pubDate>
    </item>
    <item>
      <title>[MySQL] REPAIR TABLE 문 사용법: 손상된 테이블 복구하기</title>
      <link>https://dbaant.tistory.com/238</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;REPAIR TABLE 문이란?&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;MySQL에서 &lt;/span&gt;&lt;span&gt;REPAIR TABLE&lt;/span&gt;&lt;span&gt; 문은 주로 &lt;/span&gt;&lt;span&gt;&lt;b&gt;MyISAM&lt;/b&gt;&lt;/span&gt;&lt;span&gt; 스토리지 엔진을 사용하는 테이블이 손상되었을 때 복구하는 데 사용됩니다. 시스템 비정상 종료, 디스크 오류, 불완전한 쓰기 등으로 인해 &lt;/span&gt;&lt;span&gt;.MYD&lt;/span&gt;&lt;span&gt;(데이터 파일), &lt;/span&gt;&lt;span&gt;.MYI&lt;/span&gt;&lt;span&gt;(인덱스 파일)가 손상될 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;이때 &lt;/span&gt;&lt;span&gt;REPAIR TABLE&lt;/span&gt;&lt;span&gt;을 통해 테이블을 복구하면 일부 데이터를 복원하거나 인덱스를 재구성할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;div&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;기본 문법과 사용 예제&lt;/span&gt;&lt;/h2&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;REPAIR TABLE 테이블명 [QUICK | EXTENDED | USE_FRM];&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;QUICK&lt;/span&gt;&lt;span&gt;: 인덱스 파일만 복구 (빠르지만 제한적)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;EXTENDED&lt;/span&gt;&lt;span&gt;: 데이터 파일까지 재구성 (느리지만 철저)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;USE_FRM&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;.frm&lt;/span&gt;&lt;span&gt; 파일의 구조 정보를 사용해 테이블 복구 (파일이 손상되었을 경우 유용)&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;예시:&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;REPAIR TABLE users EXTENDED;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;결과는 다음과 같은 형식으로 반환됩니다:&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;TableOpMsg_typeMsg_text&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;db.users&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;repair&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;status&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;OK&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;주의사항 및 제약&lt;/span&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;REPAIR TABLE&lt;/span&gt;&lt;span&gt;은 &lt;/span&gt;&lt;span&gt;&lt;b&gt;MyISAM 전용&lt;/b&gt;&lt;/span&gt;&lt;span&gt;입니다. InnoDB나 기타 엔진에서는 사용할 수 없습니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;InnoDB 테이블은 충돌 시 자동 복구 메커니즘이 있기 때문에 REPAIR TABLE이 작동하지 않습니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;복구 시 손상된 일부 데이터가 손실될 수 있으며, 복구 후 무결성 검사가 필요합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;중요한 데이터에는 &lt;/span&gt;&lt;span&gt;REPAIR TABLE&lt;/span&gt;&lt;span&gt;보다 &lt;/span&gt;&lt;span&gt;&lt;b&gt;백업 및 복원&lt;/b&gt;&lt;/span&gt;&lt;span&gt;이 더 안전한 방법일 수 있습니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;실무 적용 팁&lt;/span&gt;&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;백업 먼저:&lt;/b&gt;&lt;/span&gt;&lt;span&gt; REPAIR 수행 전에 반드시 원본 파일 백업&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;QUICK 먼저 시도:&lt;/b&gt;&lt;/span&gt;&lt;span&gt; 시간이 민감한 경우 QUICK 옵션으로 시도 후, 실패 시 EXTENDED 사용&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;서버 로그 확인:&lt;/b&gt;&lt;/span&gt;&lt;span&gt; 복구 중 발생하는 오류는 MySQL 로그 파일을 통해 확인 가능&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;결론 및 요약&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;REPAIR TABLE&lt;/span&gt;&lt;span&gt; 문은 MyISAM 테이블에 문제가 생겼을 때 매우 유용한 도구입니다. 하지만 한계와 리스크도 분명하므로, 주의 깊게 사용해야 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;실무 팁:&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;InnoDB에서는 사용하지 않도록 주의하세요.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;항상 복구 전에 백업을 우선 확보하세요.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;복구 후 &lt;/span&gt;&lt;span&gt;CHECK TABLE&lt;/span&gt;&lt;span&gt;로 상태를 다시 확인하세요.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;공식 문서 링크&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://dev.mysql.com/doc/refman/8.0/en/repair-table.html&quot;&gt;&lt;span&gt;MySQL 공식 문서 - REPAIR TABLE&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;</description>
      <category>SQL/MYSQL</category>
      <category>MySQL</category>
      <category>repair table</category>
      <author>Ant_U</author>
      <guid isPermaLink="true">https://dbaant.tistory.com/238</guid>
      <comments>https://dbaant.tistory.com/238#entry238comment</comments>
      <pubDate>Tue, 17 Jun 2025 14:14:49 +0900</pubDate>
    </item>
    <item>
      <title>SQL 조인과 서브쿼리 완전 정복: 실무에서 자주 쓰는 패턴 정리</title>
      <link>https://dbaant.tistory.com/237</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;조인과 서브쿼리란?&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;SQL에서 조인(JOIN)과 서브쿼리(SUBQUERY)는 둘 이상의 테이블을 함께 사용하는 강력한 도구입니다.&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;조인(JOIN)&lt;/b&gt;&lt;/span&gt;&lt;span&gt;: 여러 테이블을 논리적으로 연결하여 하나의 결과로 만듭니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;서브쿼리(SUBQUERY)&lt;/b&gt;&lt;/span&gt;&lt;span&gt;: 다른 쿼리 내부에 중첩되어 사용되는 쿼리입니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;둘 다 복잡한 데이터 구조에서 원하는 데이터를 추출하는 데 필수적인 역할을 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;div&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;조인(JOIN)의 종류와 사용법&lt;/span&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;1. INNER JOIN&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;두 테이블 모두에 존재하는 데이터만 반환합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;SELECT users.name, orders.amount
FROM users
INNER JOIN orders ON users.id = orders.user_id;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;2. LEFT JOIN (또는 LEFT OUTER JOIN)&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;왼쪽 테이블의 모든 데이터를 가져오고, 오른쪽 테이블에 없는 값은 NULL로 채웁니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;SELECT users.name, orders.amount
FROM users
LEFT JOIN orders ON users.id = orders.user_id;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;3. RIGHT JOIN&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;오른쪽 테이블의 모든 데이터를 기준으로 합니다. (MySQL에서 잘 사용되진 않음)&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;4. FULL OUTER JOIN&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;MySQL은 직접 지원하지 않지만, UNION을 활용해 흉내낼 수 있습니다:&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;n1ql&quot;&gt;&lt;code&gt;SELECT * FROM A LEFT JOIN B ON A.id = B.a_id
UNION
SELECT * FROM A RIGHT JOIN B ON A.id = B.a_id;&lt;/code&gt;&lt;/pre&gt;
&lt;div&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;서브쿼리(SUBQUERY) 사용법&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;서브쿼리는 SELECT, FROM, WHERE 절 어디에서든 사용될 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;1. WHERE 절에 사용되는 서브쿼리&lt;/span&gt;&lt;/h3&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;SELECT name FROM users
WHERE id IN (SELECT user_id FROM orders WHERE amount &amp;gt; 100);&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;2. FROM 절에 사용되는 서브쿼리&lt;/span&gt;&lt;/h3&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;SELECT avg_orders.user_id, avg_orders.avg_amount
FROM (
  SELECT user_id, AVG(amount) AS avg_amount
  FROM orders
  GROUP BY user_id
) AS avg_orders;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;3. SELECT 절에서 컬럼처럼 사용&lt;/span&gt;&lt;/h3&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;SELECT name,
  (SELECT COUNT(*) FROM orders WHERE orders.user_id = users.id) AS order_count
FROM users;&lt;/code&gt;&lt;/pre&gt;
&lt;div&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;조인 vs 서브쿼리: 언제 어떤 걸 써야 할까?&lt;/span&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;조인&lt;/b&gt;&lt;/span&gt;&lt;span&gt;은 데이터를 &quot;옆으로 병합&quot;할 때 유리합니다. 예: 사용자와 주문을 나란히 보여줄 때&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;서브쿼리&lt;/b&gt;&lt;/span&gt;&lt;span&gt;는 특정 조건 하의 통계나 중첩된 조건이 필요할 때 유용합니다. 예: 평균 이상의 주문 사용자 찾기&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;성능 팁:&lt;/b&gt;&lt;/span&gt;&lt;span&gt; MySQL 옵티마이저는 내부적으로 서브쿼리를 조인으로 변환할 수 있기 때문에, 테스트를 통해 더 효율적인 방법을 선택하는 것이 좋습니다.&lt;/span&gt;&lt;/p&gt;
&lt;div&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;결론 및 실무 팁&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;조인과 서브쿼리는 SQL 실무에서 가장 많이 사용되는 문법 중 하나입니다. 상황에 따라 적절히 선택하면 쿼리의 가독성과 성능을 모두 높일 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;실무 팁:&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;조인은 명확한 관계가 있는 테이블 간 연결에 활용하세요.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;서브쿼리는 필터링, 계산, 조건 비교 등에 유리합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;쿼리 성능은 &lt;/span&gt;&lt;span&gt;EXPLAIN&lt;/span&gt;&lt;span&gt; 명령으로 꼭 점검하세요.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;공식 문서 링크&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://dev.mysql.com/doc/refman/8.0/en/join.html&quot;&gt;&lt;span&gt;MySQL 공식 문서 - JOIN&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://dev.mysql.com/doc/refman/8.0/en/subqueries.html&quot;&gt;&lt;span&gt;MySQL 공식 문서 - Subqueries&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;</description>
      <category>자격증/SQLP</category>
      <category>SQLP</category>
      <category>자격증</category>
      <author>Ant_U</author>
      <guid isPermaLink="true">https://dbaant.tistory.com/237</guid>
      <comments>https://dbaant.tistory.com/237#entry237comment</comments>
      <pubDate>Tue, 17 Jun 2025 14:06:40 +0900</pubDate>
    </item>
    <item>
      <title>SQL 기본문 총정리: 초보자를 위한 SELECT부터 INSERT까지 핵심 문법 안내</title>
      <link>https://dbaant.tistory.com/236</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;SQL 기본문이란?&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;SQL(Structured Query Language)은 관계형 데이터베이스에서 데이터를 조회하고 조작하는 언어입니다. 이 중 가장 자주 사용되는 네 가지 기본문은 다음과 같습니다:&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;SELECT&lt;/b&gt;&lt;/span&gt;&lt;span&gt;: 데이터 조회&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;INSERT&lt;/b&gt;&lt;/span&gt;&lt;span&gt;: 새 데이터 추가&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;UPDATE&lt;/b&gt;&lt;/span&gt;&lt;span&gt;: 기존 데이터 수정&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;DELETE&lt;/b&gt;&lt;/span&gt;&lt;span&gt;: 데이터 삭제&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;이 네 가지는 모든 SQL 작업의 기반이 되는 핵심 문장입니다.&lt;/span&gt;&lt;/p&gt;
&lt;div&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;SELECT 문: 데이터 조회&lt;/span&gt;&lt;/h2&gt;
&lt;pre class=&quot;n1ql&quot;&gt;&lt;code&gt;SELECT 열1, 열2 FROM 테이블명 WHERE 조건;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;예시:&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;SELECT name, email FROM users WHERE age &amp;gt; 30;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;SELECT *&lt;/span&gt;&lt;span&gt;를 사용하면 모든 열을 조회할 수 있습니다:&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;SELECT * FROM users;&lt;/code&gt;&lt;/pre&gt;
&lt;div&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;INSERT 문: 데이터 추가&lt;/span&gt;&lt;/h2&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;INSERT INTO 테이블명 (열1, 열2) VALUES (값1, 값2);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;예시:&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;INSERT INTO users (name, email) VALUES ('홍길동', 'hong@example.com');&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;모든 열에 값을 넣을 경우 열 이름 생략 가능:&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;INSERT INTO users VALUES (1, '홍길동', 'hong@example.com');&lt;/code&gt;&lt;/pre&gt;
&lt;div&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;UPDATE 문: 데이터 수정&lt;/span&gt;&lt;/h2&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;UPDATE 테이블명 SET 열1=값1, 열2=값2 WHERE 조건;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;예시:&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;UPDATE users SET email='new@example.com' WHERE id=1;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;주의:&lt;/b&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;WHERE&lt;/span&gt;&lt;span&gt; 없이 UPDATE를 수행하면 모든 행이 수정됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;div&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;DELETE 문: 데이터 삭제&lt;/span&gt;&lt;/h2&gt;
&lt;pre class=&quot;n1ql&quot;&gt;&lt;code&gt;DELETE FROM 테이블명 WHERE 조건;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;예시:&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;DELETE FROM users WHERE id=1;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;주의:&lt;/b&gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;WHERE&lt;/span&gt;&lt;span&gt; 절을 생략하면 테이블의 모든 데이터가 삭제됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;div&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;결론 및 실무 팁&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;SQL 기본문은 데이터베이스와 상호작용하기 위한 기초이자 핵심입니다. 쿼리를 작성할 때는 항상 다음을 주의하세요:&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;WHERE&lt;/span&gt;&lt;span&gt; 조건을 빠뜨리지 않도록 주의&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;INSERT 시 값의 순서와 타입 일치 확인&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;SELECT는 결과가 너무 많을 경우 LIMIT로 범위 지정&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;SQL을 처음 배우는 사람이라면 이 네 가지 문장을 숙지하는 것이 가장 중요합니다.&lt;/span&gt;&lt;/p&gt;
&lt;div&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;공식 문서 링크&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://dev.mysql.com/doc/refman/8.0/en/sql-statements.html&quot;&gt;&lt;span&gt;MySQL 공식 문서 - SQL Syntax&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;</description>
      <category>자격증/SQLP</category>
      <category>SQLP</category>
      <category>자격증</category>
      <author>Ant_U</author>
      <guid isPermaLink="true">https://dbaant.tistory.com/236</guid>
      <comments>https://dbaant.tistory.com/236#entry236comment</comments>
      <pubDate>Tue, 17 Jun 2025 14:04:58 +0900</pubDate>
    </item>
    <item>
      <title>[MySQL] OPTIMIZE TABLE 문: 성능 개선을 위한 최적화 전략</title>
      <link>https://dbaant.tistory.com/235</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;OPTIMIZE TABLE 문이란?&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;MySQL에서 &lt;/span&gt;&lt;span&gt;OPTIMIZE TABLE&lt;/span&gt;&lt;span&gt; 문은 테이블의 저장 구조를 최적화하여 성능을 개선하는 데 사용됩니다. 주로 다음 상황에서 유용합니다:&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;삭제/갱신이 많은 테이블&lt;/b&gt;&lt;/span&gt;&lt;span&gt;에서 공간이 비효율적으로 사용될 때&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;디스크 조각화&lt;/b&gt;&lt;/span&gt;&lt;span&gt;로 인해 I/O 성능이 저하되었을 때&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;쿼리 속도 저하&lt;/b&gt;&lt;/span&gt;&lt;span&gt; 현상이 발생할 때&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;이 명령은 테이블을 재구성하여 데이터와 인덱스를 다시 정렬하고, 필요 없는 공간을 회수해줍니다.&lt;/span&gt;&lt;/p&gt;
&lt;div&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;문법과 기본 사용법&lt;/span&gt;&lt;/h2&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;OPTIMIZE TABLE 테이블명;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;예시:&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;OPTIMIZE TABLE orders;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;이 명령은 &lt;/span&gt;&lt;span&gt;orders&lt;/span&gt;&lt;span&gt; 테이블을 최적화하고 결과를 다음과 같은 형식으로 반환합니다:&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;TableOpMsg_typeMsg_text&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;db.orders&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;optimize&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;status&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;OK&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;스토리지 엔진별 동작 차이&lt;/span&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;MyISAM&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;OPTIMIZE TABLE&lt;/span&gt;&lt;span&gt;은 내부적으로 테이블을 잠그고, 데이터와 인덱스를 재작성합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;공간 회수와 함께 인덱스를 다시 정렬하므로, 큰 성능 향상을 기대할 수 있습니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;InnoDB (MySQL 5.7 이후)&lt;/span&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;OPTIMIZE TABLE&lt;/span&gt;&lt;span&gt;은 &lt;/span&gt;&lt;span&gt;ALTER TABLE ... FORCE&lt;/span&gt;&lt;span&gt;처럼 작동하여 테이블을 재작성합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;일반적으로는 자동으로 공간을 관리하지만, 대량 삭제/갱신 이후에는 수동 최적화가 도움이 될 수 있습니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;주의:&lt;/b&gt;&lt;/span&gt;&lt;span&gt; InnoDB에서는 이 작업이 잠금과 많은 디스크 I/O를 유발할 수 있으므로, 운영 중에는 신중히 사용해야 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;div&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;실전 적용 팁&lt;/span&gt;&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;정기적 최적화 일정 수립:&lt;/b&gt;&lt;/span&gt;&lt;span&gt; 데이터가 자주 갱신되는 테이블에 대해 주기적으로 OPTIMIZE 수행&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;자동화 스크립트와 연계:&lt;/b&gt;&lt;/span&gt;&lt;span&gt; 백업 후에 최적화를 자동으로 실행하도록 스크립트화&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;디스크 모니터링 병행:&lt;/b&gt;&lt;/span&gt;&lt;span&gt; 최적화 후 디스크 공간과 쿼리 성능을 모니터링해 효과 확인&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;div&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;결론 및 실무 적용 팁&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;OPTIMIZE TABLE&lt;/span&gt;&lt;span&gt; 문은 데이터 변경이 빈번한 테이블의 성능을 유지하기 위한 중요한 도구입니다. 특히 MyISAM이나 InnoDB에서 대량의 삭제 후 조각화 문제를 해결하는 데 유용합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;실무 팁:&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;운영 중 테이블에 대해 실행할 경우 서비스 중단 가능성을 고려하세요.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;InnoDB의 경우 &lt;/span&gt;&lt;span&gt;OPTIMIZE TABLE&lt;/span&gt;&lt;span&gt;은 실제로 테이블 재작성과 유사하므로 주의가 필요합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;주기적으로 모니터링 도구와 함께 사용하면 더 큰 효과를 볼 수 있습니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;공식 문서 링크&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://dev.mysql.com/doc/refman/8.0/en/optimize-table.html&quot;&gt;&lt;span&gt;MySQL 공식 문서 - OPTIMIZE TABLE&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;</description>
      <category>SQL/MYSQL</category>
      <category>myslql</category>
      <category>optimize table</category>
      <author>Ant_U</author>
      <guid isPermaLink="true">https://dbaant.tistory.com/235</guid>
      <comments>https://dbaant.tistory.com/235#entry235comment</comments>
      <pubDate>Tue, 17 Jun 2025 13:39:49 +0900</pubDate>
    </item>
    <item>
      <title>[MySQL] CHECKSUM TABLE 문 완벽 가이드: 무결성 검증을 위한 실전 팁</title>
      <link>https://dbaant.tistory.com/234</link>
      <description>&lt;h2 data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;CHECKSUM TABLE 문이란?&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;MySQL에서 &lt;/span&gt;&lt;span&gt;CHECKSUM TABLE&lt;/span&gt;&lt;span&gt; 문은 테이블의 데이터와 구조를 바탕으로 해시값(체크섬)을 계산하는 기능을 제공합니다. 이를 통해 테이블의 변경 여부나 데이터 손상을 감지할 수 있습니다. 주로 다음과 같은 용도에 활용됩니다:&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;레플리케이션 무결성 검사:&lt;/b&gt;&lt;/span&gt;&lt;span&gt; 마스터와 슬레이브 간 데이터 일치 여부 확인&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;백업 검증:&lt;/b&gt;&lt;/span&gt;&lt;span&gt; 복원 후 데이터가 변경되지 않았는지 확인&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;간단한 변경 감지:&lt;/b&gt;&lt;/span&gt;&lt;span&gt; 데이터 변경 여부를 빠르게 판단&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;즉, CHECKSUM TABLE은 테이블을 직접 비교하지 않고도, 해시값 비교만으로 일관성을 빠르게 판단할 수 있게 해주는 유용한 도구입니다.&lt;/span&gt;&lt;/p&gt;
&lt;div&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;문법과 기본 사용법&lt;/span&gt;&lt;/h2&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;CHECKSUM TABLE 테이블명 [QUICK | EXTENDED];&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;QUICK&lt;/span&gt;&lt;span&gt;: 인덱스만을 기반으로 체크섬 계산 (빠르지만 정확도 낮음)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;EXTENDED&lt;/span&gt;&lt;span&gt;: 실제 데이터를 기반으로 체크섬 계산 (느리지만 정확도 높음)&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;예시:&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;CHECKSUM TABLE users EXTENDED;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;이 명령은 &lt;/span&gt;&lt;span&gt;users&lt;/span&gt;&lt;span&gt; 테이블의 실제 데이터를 기반으로 체크섬을 계산합니다. 결과는 다음과 같은 형태로 반환됩니다:&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;TableChecksum&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;db.users&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;1234567890&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;이 체크섬 값은 같은 테이블이라도 내용이 달라지면 변경되므로, 비교 시 매우 유용합니다.&lt;/span&gt;&lt;/p&gt;
&lt;div&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;MySQL 버전에 따른 변화 및 제약사항&lt;/span&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;MySQL 5.6 이후&lt;/b&gt;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;innodb_table_checksum&lt;/span&gt;&lt;span&gt; 시스템 변수는 기본값이 &lt;/span&gt;&lt;span&gt;ON&lt;/span&gt;&lt;span&gt;으로 설정되어 있어, InnoDB 테이블에 대해서도 CHECKSUM 계산이 가능합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;InnoDB 주의사항&lt;/b&gt;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;CHECKSUM TABLE&lt;/span&gt;&lt;span&gt;은 MyISAM에서는 정확히 작동하지만, InnoDB에서는 테이블 옵션 &lt;/span&gt;&lt;span&gt;CHECKSUM=1&lt;/span&gt;&lt;span&gt;이어야 정확한 값을 제공합니다. 또한, InnoDB는 MVCC로 인해 트랜잭션에 따라 체크섬 결과가 달라질 수 있습니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;테이블 포맷에 따라 정확도 차이&lt;/b&gt;&lt;/span&gt;&lt;span&gt;: CSV나 MEMORY 엔진에서는 예상한 대로 작동하지 않을 수 있습니다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;따라서 중요한 무결성 비교를 수행할 경우에는 같은 엔진과 설정을 갖춘 환경에서 비교하는 것이 안전합니다.&lt;/span&gt;&lt;/p&gt;
&lt;div&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;실전 활용 팁&lt;/span&gt;&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;레플리케이션 상태 점검:&lt;/b&gt;&lt;/span&gt;&lt;span&gt; 주기적으로 마스터와 슬레이브에서 동일 테이블의 체크섬을 계산하여 비교&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;데이터 변경 감지:&lt;/b&gt;&lt;/span&gt;&lt;span&gt; 중요한 테이블에 대해 정기적으로 체크섬 값을 기록해 두고, 이후 값이 변경되었는지 확인&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;백업 검증 자동화:&lt;/b&gt;&lt;/span&gt;&lt;span&gt; 백업 및 복원 후 CHECKSUM TABLE 결과가 일치하는지 자동 스크립트로 확인&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;이러한 방식으로 CHECKSUM TABLE 문을 활용하면 예상치 못한 데이터 손상이나 동기화 실패를 조기에 탐지할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;div&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;결론 및 실무 적용 팁&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;CHECKSUM TABLE&lt;/span&gt;&lt;span&gt;은 간단하지만 강력한 도구로, 데이터 무결성을 유지하려는 모든 MySQL 사용자가 알아두면 유용한 기능입니다. 특히, 레플리케이션 환경이나 대규모 백업 시스템에서 변경 여부를 감지하는 데 큰 도움이 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;실무 팁:&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;QUICK&lt;/span&gt;&lt;span&gt; 옵션은 빠르지만 신뢰도는 낮습니다. 중요한 검증에는 &lt;/span&gt;&lt;span&gt;EXTENDED&lt;/span&gt;&lt;span&gt; 사용을 권장합니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;InnoDB 사용 시 테이블 옵션과 트랜잭션 상태에 따라 체크섬 값이 다를 수 있으니 주의하세요.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;정기적 체크섬 기록 및 모니터링 시스템과 연계해 활용도를 높이세요.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;공식 문서 링크&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://dev.mysql.com/doc/refman/8.0/en/checksum-table.html&quot;&gt;&lt;span&gt;MySQL 공식 문서 - CHECKSUM TABLE&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;</description>
      <category>SQL/MYSQL</category>
      <category>checksum table</category>
      <category>MySQL</category>
      <author>Ant_U</author>
      <guid isPermaLink="true">https://dbaant.tistory.com/234</guid>
      <comments>https://dbaant.tistory.com/234#entry234comment</comments>
      <pubDate>Tue, 17 Jun 2025 13:38:47 +0900</pubDate>
    </item>
    <item>
      <title>[MySQL] CHECK TABLE 문 완전 정복: 테이블 무결성 검사 방법</title>
      <link>https://dbaant.tistory.com/233</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;CHECK TABLE 문이란?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MySQL을 사용하다 보면 테이블이 갑자기 손상되거나, 데이터베이스 서버가 비정상적으로 종료된 후 무결성 문제가 발생하는 경우가 있습니다. 이럴 때 CHECK TABLE 문을 사용하면 테이블의 상태를 점검하고 손상 여부를 확인할 수 있습니다. 특히 MyISAM이나 ARCHIVE 스토리지 엔진을 사용할 때 유용하게 쓰입니다.&lt;/p&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;CHECK TABLE 테이블명;
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 명령어는 지정한 테이블에 대해 구조적인 문제가 있는지 검사하고, 결과를 테이블 형식으로 반환합니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;CHECK TABLE의 출력 결과 해석하기&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CHECK TABLE의 결과는 다음과 같은 컬럼을 포함합니다:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Table: 검사한 테이블의 이름&lt;/li&gt;
&lt;li&gt;Op: 수행한 작업 종류 (보통 'check')&lt;/li&gt;
&lt;li&gt;Msg_type: 메시지 종류 (status, error, warning 등)&lt;/li&gt;
&lt;li&gt;Msg_text: 메시지 내용 (정상 여부나 오류 설명)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 다음과 같은 결과가 나올 수 있습니다:&lt;/p&gt;
&lt;pre class=&quot;asciidoc&quot;&gt;&lt;code&gt;+----------------------+-------+----------+----------+
| Table                | Op    | Msg_type | Msg_text |
+----------------------+-------+----------+----------+
| test.my_table        | check | status   | OK       |
+----------------------+-------+----------+----------+
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Msg_text가 OK라면 테이블에 문제가 없다는 의미입니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;스토리지 엔진에 따른 차이점&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;MyISAM&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MyISAM 테이블은 CHECK TABLE 명령어를 통해 비교적 정확하게 손상 여부를 진단할 수 있습니다. 실제로 손상이 발견되면 REPAIR TABLE 문을 통해 수리가 가능하기 때문에, CHECK TABLE과 함께 자주 사용됩니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;InnoDB&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반면 InnoDB 테이블은 트랜잭션과 자체적인 무결성 메커니즘을 사용하기 때문에, CHECK TABLE 명령어가 단순히 테이블 메타데이터나 인덱스 구조만을 점검합니다. 실제 데이터 블록의 손상 여부는 InnoDB 자체 로그나 innodb_force_recovery 설정을 통해 확인하는 것이 더 정확합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MySQL 5.7 이상에서는 CHECK TABLE이 InnoDB 테이블에서도 조금 더 유의미한 검사를 수행하지만, 여전히 제약이 있으므로 과신해서는 안 됩니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;실전 팁 및 주의사항&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;테이블이 잠깁니다&lt;/b&gt;: CHECK TABLE은 검사 중 해당 테이블에 잠금을 걸기 때문에, 실시간 서비스 중에는 주의해서 사용해야 합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;백업 후 검사&lt;/b&gt;: 테이블에 문제가 생겼을 경우에는 CHECK 전에 백업을 먼저 받아두는 것이 안전합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;REPAIR TABLE과 연계 사용&lt;/b&gt;: MyISAM 테이블에서 오류가 감지되면 바로 REPAIR TABLE을 고려하세요.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;마무리 및 실전 적용 포인트&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MySQL의 CHECK TABLE 문은 테이블의 무결성을 점검하고 손상 여부를 조기에 파악할 수 있는 유용한 도구입니다. 특히 MyISAM 스토리지 엔진을 사용하는 경우에는 정기적인 점검 루틴에 포함시키는 것이 좋습니다. InnoDB의 경우에는 보완적인 수단으로 활용하고, 로그와 설정을 함께 참고하는 것이 중요합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;실전 팁 요약:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;MyISAM에서는 정기적으로 CHECK TABLE 수행 권장&lt;/li&gt;
&lt;li&gt;InnoDB에서는 심각한 손상 의심 시 로그와 innodb_force_recovery 확인&lt;/li&gt;
&lt;li&gt;CHECK TABLE 전후로 백업은 필수&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;공식 문서:&lt;/b&gt;&lt;br /&gt;&lt;a href=&quot;https://dev.mysql.com/doc/refman/8.0/en/check-table.html&quot;&gt;MySQL CHECK TABLE - MySQL Documentation&lt;/a&gt;&lt;/p&gt;</description>
      <category>SQL/MYSQL</category>
      <category>check table</category>
      <category>MySQL</category>
      <author>Ant_U</author>
      <guid isPermaLink="true">https://dbaant.tistory.com/233</guid>
      <comments>https://dbaant.tistory.com/233#entry233comment</comments>
      <pubDate>Mon, 16 Jun 2025 18:22:37 +0900</pubDate>
    </item>
    <item>
      <title>설계 품질 평가: 데이터베이스 설계의 우수성 평가 방법</title>
      <link>https://dbaant.tistory.com/232</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-end=&quot;182&quot; data-start=&quot;172&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;서론&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;455&quot; data-start=&quot;184&quot; data-ke-size=&quot;size16&quot;&gt;데이터베이스 설계는 시스템의 성능과 안정성에 큰 영향을 미칩니다. 하지만 단순히 설계를 완료했다고 해서 그것이 좋은 설계라고 할 수는 없습니다. &lt;b&gt;설계 품질 평가&lt;/b&gt;는 데이터베이스 설계가 실제로 얼마나 효율적이고, 확장 가능하며, 유지보수가 용이한지 측정하는 중요한 과정입니다. 잘 평가된 설계는 이후 시스템 운영과 성능 최적화에 큰 도움이 되며, 개발과 운영 비용을 절감할 수 있습니다. 이 글에서는 데이터베이스 설계 품질을 평가하는 방법과 중요한 평가 기준에 대해 설명하겠습니다.&lt;/p&gt;
&lt;hr data-end=&quot;460&quot; data-start=&quot;457&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;485&quot; data-start=&quot;462&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;설계 품질 평가란 무엇인가?&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;727&quot; data-start=&quot;487&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;설계 품질 평가&lt;/b&gt;는 데이터베이스 설계가 최적화되었는지, 성능에 미치는 영향을 최소화했는지, 향후 시스템 확장에 대비할 수 있는지 등을 판단하는 과정입니다. 이 과정에서 우리는 데이터베이스의 &lt;b&gt;효율성&lt;/b&gt;, &lt;b&gt;확장성&lt;/b&gt;, &lt;b&gt;유지보수성&lt;/b&gt;, &lt;b&gt;보안성&lt;/b&gt;, &lt;b&gt;무결성&lt;/b&gt; 등을 평가합니다. 설계 품질을 제대로 평가하지 않으면, 시스템에 문제를 일으킬 수 있는 설계 결함이 나중에 발견되거나, 성능 문제를 초래할 수 있습니다.&lt;/p&gt;
&lt;p data-end=&quot;845&quot; data-start=&quot;729&quot; data-ke-size=&quot;size16&quot;&gt;설계 품질 평가는 일반적으로 &lt;b&gt;검토&lt;/b&gt;와 &lt;b&gt;테스트&lt;/b&gt; 두 가지 방법으로 진행됩니다. 검토 과정에서는 설계 문서와 모델을 분석하고, 테스트 과정에서는 실제 운영 환경에서 설계가 어떻게 동작하는지 평가합니다.&lt;/p&gt;
&lt;hr data-end=&quot;850&quot; data-start=&quot;847&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;875&quot; data-start=&quot;852&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;설계 품질 평가의 주요 기준&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;917&quot; data-start=&quot;877&quot; data-ke-size=&quot;size16&quot;&gt;데이터베이스 설계를 평가할 때 다음과 같은 주요 기준을 고려해야 합니다:&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;2286&quot; data-start=&quot;919&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;1177&quot; data-start=&quot;919&quot;&gt;&lt;b&gt;성능(Performance)&lt;/b&gt;&lt;br /&gt;데이터베이스 설계의 성능은 매우 중요한 평가 항목입니다. 설계 품질 평가에서 성능은 데이터 조회 속도, 쓰기 성능, 데이터 처리 속도 등을 포함합니다. 좋은 설계는 &lt;b&gt;최소한의 쿼리&lt;/b&gt;로 빠르게 데이터를 조회할 수 있도록 돕고, 데이터베이스 시스템의 &lt;b&gt;부하를 분산&lt;/b&gt;시키며, &lt;b&gt;최적화된 인덱스&lt;/b&gt;와 쿼리를 통해 성능을 극대화할 수 있습니다. 또한, &lt;b&gt;정규화&lt;/b&gt;와 &lt;b&gt;비정규화&lt;/b&gt;의 균형을 잘 맞춰야 합니다.&lt;/li&gt;
&lt;li data-end=&quot;1419&quot; data-start=&quot;1179&quot;&gt;&lt;b&gt;확장성(Scalability)&lt;/b&gt;&lt;br /&gt;데이터베이스 설계는 시간이 지나면서 증가하는 데이터 양과 사용자 수에 적응할 수 있어야 합니다. &lt;b&gt;수평 확장&lt;/b&gt;(sharding)이나 &lt;b&gt;수직 확장&lt;/b&gt;(vertical scaling)을 염두에 두고 설계를 해야 하며, 시스템의 &lt;b&gt;부하 분산&lt;/b&gt;이나 &lt;b&gt;클러스터링&lt;/b&gt;을 고려해야 합니다. 설계가 확장성에 적합하다면, 시스템이 커져도 성능 저하 없이 원활하게 운영할 수 있습니다.&lt;/li&gt;
&lt;li data-end=&quot;1626&quot; data-start=&quot;1421&quot;&gt;&lt;b&gt;유지보수성(Maintainability)&lt;/b&gt;&lt;br /&gt;데이터베이스 설계는 시간이 지나면서 쉽게 수정되고 관리될 수 있어야 합니다. &lt;b&gt;복잡성&lt;/b&gt;을 줄이고, 각 테이블이나 엔티티 간의 관계를 명확하게 정의하여, 향후 변경 사항을 쉽게 반영할 수 있도록 해야 합니다. 또한, &lt;b&gt;정확한 문서화&lt;/b&gt;와 &lt;b&gt;명확한 명명 규칙&lt;/b&gt;을 통해 유지보수성을 높일 수 있습니다.&lt;/li&gt;
&lt;li data-end=&quot;1883&quot; data-start=&quot;1628&quot;&gt;&lt;b&gt;무결성(Integrity)&lt;/b&gt;&lt;br /&gt;데이터베이스 설계의 품질 평가에서 중요한 요소 중 하나는 데이터 무결성입니다. 데이터 무결성은 데이터의 정확성, 일관성, 신뢰성을 유지하는 것과 관련이 있습니다. 이를 위해서는 &lt;b&gt;제약 조건&lt;/b&gt;(constraints)을 명확히 정의하고, 데이터의 중복을 최소화하며, &lt;b&gt;정규화&lt;/b&gt;가 적절히 이루어졌는지 점검해야 합니다. 또한, &lt;b&gt;트랜잭션 관리&lt;/b&gt;와 &lt;b&gt;ACID 성질&lt;/b&gt;을 고려하여 시스템을 설계해야 합니다.&lt;/li&gt;
&lt;li data-end=&quot;2098&quot; data-start=&quot;1885&quot;&gt;&lt;b&gt;보안(Security)&lt;/b&gt;&lt;br /&gt;데이터베이스 설계는 &lt;b&gt;보안&lt;/b&gt;을 고려해야 합니다. 중요한 데이터를 안전하게 보호하고, &lt;b&gt;액세스 제어&lt;/b&gt;와 &lt;b&gt;사용자 권한 관리&lt;/b&gt;를 잘 설정해야 합니다. 데이터 암호화와 같은 보안 기능도 설계에 포함되어야 합니다. 좋은 설계는 &lt;b&gt;SQL 인젝션&lt;/b&gt;, &lt;b&gt;무단 액세스&lt;/b&gt;, &lt;b&gt;데이터 유출&lt;/b&gt; 등을 방지할 수 있도록 설계되어야 합니다.&lt;/li&gt;
&lt;li data-end=&quot;2286&quot; data-start=&quot;2100&quot;&gt;&lt;b&gt;비즈니스 요구 사항 반영&lt;/b&gt;&lt;br /&gt;설계 품질을 평가할 때, &lt;b&gt;비즈니스 요구 사항&lt;/b&gt;을 얼마나 잘 반영했는지도 중요한 평가 항목입니다. 데이터베이스가 실제 비즈니스 요구 사항을 충족시킬 수 있도록 설계되었는지 확인해야 합니다. 이를 위해 사용자 요구 분석, 시스템 목표, 업무 흐름 등을 고려하여 설계를 점검해야 합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-end=&quot;2291&quot; data-start=&quot;2288&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;2312&quot; data-start=&quot;2293&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;설계 품질 평가 방법&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;2402&quot; data-start=&quot;2314&quot; data-ke-size=&quot;size16&quot;&gt;설계 품질을 평가하는 방법은 크게 두 가지로 나눌 수 있습니다: &lt;b&gt;정적 검토&lt;/b&gt;(Static Review)와 &lt;b&gt;동적 검토&lt;/b&gt;(Dynamic Review).&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;2859&quot; data-start=&quot;2404&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;2629&quot; data-start=&quot;2404&quot;&gt;&lt;b&gt;정적 검토 (Static Review)&lt;/b&gt;&lt;br /&gt;정적 검토는 설계 문서나 ER 다이어그램, 데이터베이스 모델 등을 분석하는 방법입니다. 이 방법은 실제 시스템에서 발생할 수 있는 문제를 사전에 예측할 수 있게 해주며, 설계가 비즈니스 요구 사항과 기술적 요구 사항을 잘 충족하는지 점검할 수 있습니다. 이 과정에서 &lt;b&gt;가독성&lt;/b&gt;, &lt;b&gt;구조의 일관성&lt;/b&gt;, &lt;b&gt;정규화 수준&lt;/b&gt; 등을 평가합니다.&lt;/li&gt;
&lt;li data-end=&quot;2859&quot; data-start=&quot;2631&quot;&gt;&lt;b&gt;동적 검토 (Dynamic Review)&lt;/b&gt;&lt;br /&gt;동적 검토는 실제 운영 환경에서 설계를 테스트하고, 시스템이 어떻게 동작하는지 평가하는 방법입니다. 예를 들어, &lt;b&gt;부하 테스트&lt;/b&gt;나 &lt;b&gt;성능 테스트&lt;/b&gt;를 통해 데이터베이스가 실제 환경에서 얼마나 효율적으로 작동하는지 확인할 수 있습니다. 이 방법은 설계의 실제 성능을 확인하는 데 유용하며, 예기치 않은 오류나 병목 현상을 발견할 수 있습니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-end=&quot;2864&quot; data-start=&quot;2861&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;2885&quot; data-start=&quot;2866&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;결론 및 실용적인 팁&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;3078&quot; data-start=&quot;2887&quot; data-ke-size=&quot;size16&quot;&gt;설계 품질 평가는 데이터베이스 시스템의 성능과 안정성을 보장하는 데 중요한 역할을 합니다. 평가 기준을 명확히 설정하고, 정적 및 동적 검토를 통해 설계 품질을 점검하는 것이 필수적입니다. 설계 품질을 개선하려면 &lt;b&gt;성능 최적화&lt;/b&gt;, &lt;b&gt;확장성&lt;/b&gt;을 고려한 설계, 그리고 &lt;b&gt;유지보수성&lt;/b&gt;을 높이는 방향으로 설계를 지속적으로 개선해야 합니다.&lt;/p&gt;
&lt;p data-end=&quot;3091&quot; data-start=&quot;3080&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;실용적인 팁:&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;3258&quot; data-start=&quot;3092&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;3148&quot; data-start=&quot;3092&quot;&gt;설계 초기 단계에서부터 &lt;b&gt;비즈니스 요구 사항&lt;/b&gt;을 반영하고, 이를 기반으로 설계를 진행하세요.&lt;/li&gt;
&lt;li data-end=&quot;3193&quot; data-start=&quot;3149&quot;&gt;정규화와 비정규화의 균형을 맞추어 &lt;b&gt;데이터베이스 성능&lt;/b&gt;을 최적화하세요.&lt;/li&gt;
&lt;li data-end=&quot;3258&quot; data-start=&quot;3194&quot;&gt;&lt;b&gt;테스트&lt;/b&gt;와 &lt;b&gt;모니터링&lt;/b&gt;을 통해 실제 환경에서 설계가 어떻게 동작하는지 지속적으로 평가하고 개선하세요.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-end=&quot;3263&quot; data-start=&quot;3260&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-is-only-node=&quot;&quot; data-is-last-node=&quot;&quot; data-end=&quot;3331&quot; data-start=&quot;3265&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;공식 문서 링크:&lt;/b&gt;&lt;br /&gt;&lt;a href=&quot;https://dev.mysql.com/doc/&quot; data-is-last-node=&quot;&quot; data-end=&quot;3331&quot; data-start=&quot;3281&quot;&gt;MySQL 공식 설계 및 성능 가이드&lt;/a&gt;&lt;/p&gt;</description>
      <category>자격증/SQLP</category>
      <category>SQLP</category>
      <category>자격증</category>
      <author>Ant_U</author>
      <guid isPermaLink="true">https://dbaant.tistory.com/232</guid>
      <comments>https://dbaant.tistory.com/232#entry232comment</comments>
      <pubDate>Mon, 16 Jun 2025 18:20:57 +0900</pubDate>
    </item>
    <item>
      <title>물리적 설계: 데이터베이스 구현을 위한 최적화 단계</title>
      <link>https://dbaant.tistory.com/231</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-end=&quot;179&quot; data-start=&quot;169&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;서론&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;500&quot; data-start=&quot;181&quot; data-ke-size=&quot;size16&quot;&gt;데이터베이스 설계는 크게 세 단계로 나눌 수 있습니다: &lt;b&gt;개념적 설계&lt;/b&gt;, &lt;b&gt;논리적 설계&lt;/b&gt;, 그리고 마지막으로 &lt;b&gt;물리적 설계&lt;/b&gt;입니다. 물리적 설계는 논리적 설계에서 정의된 데이터 구조와 관계를 실제 데이터베이스 시스템에 맞게 최적화하는 과정입니다. 이 단계에서는 성능, 효율성, 저장 공간 등을 고려하여 데이터베이스의 구조를 구현합니다. 데이터베이스 시스템이 실제로 데이터를 어떻게 저장하고, 접근하고, 관리할지를 결정하는 중요한 단계입니다. 이번 글에서는 물리적 설계의 개념과 중요성, 그리고 이를 실무에서 어떻게 최적화할 수 있는지에 대해 다루어 보겠습니다.&lt;/p&gt;
&lt;hr data-end=&quot;505&quot; data-start=&quot;502&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;528&quot; data-start=&quot;507&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;물리적 설계란 무엇인가?&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;768&quot; data-start=&quot;530&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;물리적 설계&lt;/b&gt;는 데이터베이스의 &lt;b&gt;구체적인 구현 방식&lt;/b&gt;을 결정하는 과정입니다. 논리적 설계가 데이터베이스의 구조를 정의하고, 그 관계를 설정하는 데 중점을 둔다면, 물리적 설계는 데이터를 실제로 어떻게 &lt;b&gt;디스크에 저장&lt;/b&gt;할지를 다룹니다. 물리적 설계에서는 데이터베이스의 성능을 최적화하고, 저장 공간을 효율적으로 사용하며, 데이터를 빠르게 조회할 수 있도록 인덱스를 설정하는 등 여러 가지 최적화 작업이 이루어집니다.&lt;/p&gt;
&lt;p data-end=&quot;905&quot; data-start=&quot;770&quot; data-ke-size=&quot;size16&quot;&gt;이 단계에서는 &lt;b&gt;서버의 하드웨어&lt;/b&gt;, &lt;b&gt;저장 장치&lt;/b&gt;, &lt;b&gt;데이터베이스 시스템의 성능&lt;/b&gt; 등을 고려해 최적화 방법을 선택합니다. 물리적 설계는 시스템의 요구 사항에 따라 달라지므로, 각 환경에 맞는 최적화 방법을 결정하는 것이 중요합니다.&lt;/p&gt;
&lt;hr data-end=&quot;910&quot; data-start=&quot;907&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;933&quot; data-start=&quot;912&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;물리적 설계의 주요 요소&lt;/b&gt;&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;2398&quot; data-start=&quot;935&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;1145&quot; data-start=&quot;935&quot;&gt;&lt;b&gt;저장 공간 최적화&lt;/b&gt;&lt;br /&gt;데이터베이스에서 데이터는 하드디스크나 SSD와 같은 저장 장치에 저장됩니다. 물리적 설계에서는 데이터의 크기, 구조, 액세스 패턴 등을 고려하여 &lt;b&gt;저장 공간을 효율적으로 활용&lt;/b&gt;할 수 있도록 해야 합니다. 예를 들어, 데이터를 어떻게 분할할지, 어떤 데이터 타입을 사용할지, 그리고 어떻게 데이터를 압축할지에 대한 결정이 이루어집니다.&lt;/li&gt;
&lt;li data-end=&quot;1442&quot; data-start=&quot;1147&quot;&gt;&lt;b&gt;인덱스(Index) 설계&lt;/b&gt;&lt;br /&gt;인덱스는 데이터베이스 성능에 큰 영향을 미칩니다. &lt;b&gt;인덱스&lt;/b&gt;는 데이터 검색을 빠르게 하도록 도와주는 자료 구조로, 데이터를 검색할 때 &lt;b&gt;선택된 컬럼에 대한 인덱스를 추가&lt;/b&gt;하여 쿼리 성능을 향상시킬 수 있습니다. 물리적 설계에서는 자주 조회되는 컬럼에 인덱스를 설정하고, 필요한 경우 &lt;b&gt;다중 컬럼 인덱스&lt;/b&gt;나 &lt;b&gt;복합 인덱스&lt;/b&gt;를 사용하여 성능을 최적화합니다. 인덱스는 &lt;b&gt;읽기 성능&lt;/b&gt;을 향상시키지만, &lt;b&gt;쓰기 성능&lt;/b&gt;에 영향을 줄 수 있기 때문에 신중히 결정해야 합니다.&lt;/li&gt;
&lt;li data-end=&quot;1716&quot; data-start=&quot;1444&quot;&gt;&lt;b&gt;파티셔닝(Partitioning)&lt;/b&gt;&lt;br /&gt;데이터가 매우 커질 경우, 데이터를 효율적으로 관리하고 쿼리 성능을 향상시키기 위해 &lt;b&gt;파티셔닝&lt;/b&gt;을 사용합니다. 파티셔닝은 큰 테이블을 물리적으로 작은 조각으로 나누는 방법입니다. 예를 들어, 날짜별로 데이터를 파티셔닝하여, 특정 기간에 대한 데이터만 빠르게 검색할 수 있게 할 수 있습니다. MySQL에서는 파티셔닝을 통해 데이터를 &lt;b&gt;수평적으로 분할&lt;/b&gt;할 수 있으며, 이를 통해 쿼리 성능을 높이고 관리하기 용이하게 만듭니다.&lt;/li&gt;
&lt;li data-end=&quot;1984&quot; data-start=&quot;1718&quot;&gt;&lt;b&gt;정규화 vs 비정규화 (Normalization vs Denormalization)&lt;/b&gt;&lt;br /&gt;데이터베이스의 &lt;b&gt;정규화&lt;/b&gt;는 중복을 줄이고 데이터 무결성을 유지하는 중요한 과정입니다. 하지만 때때로 성능을 고려하여 일부 테이블은 &lt;b&gt;비정규화&lt;/b&gt;할 수도 있습니다. &lt;b&gt;비정규화&lt;/b&gt;는 여러 테이블을 합쳐서 조회 성능을 향상시키는 방법입니다. 비정규화를 선택할 때는 데이터 중복과 무결성 문제가 발생할 수 있기 때문에, 이를 해결할 수 있는 방법을 함께 고려해야 합니다.&lt;/li&gt;
&lt;li data-end=&quot;2218&quot; data-start=&quot;1986&quot;&gt;&lt;b&gt;트랜잭션 및 잠금 관리&lt;/b&gt;&lt;br /&gt;물리적 설계에서는 데이터베이스의 트랜잭션 처리 방식과 **동시성 제어(Concurrency Control)**를 관리해야 합니다. 여러 사용자가 동시에 데이터를 수정하는 경우, **잠금(Locking)**을 사용하여 데이터 충돌을 방지합니다. 트랜잭션의 **격리 수준(Isolation Level)**을 적절히 설정하여 성능과 데이터 무결성을 균형 있게 유지해야 합니다.&lt;/li&gt;
&lt;li data-end=&quot;2398&quot; data-start=&quot;2220&quot;&gt;&lt;b&gt;백업 및 복구 전략&lt;/b&gt;&lt;br /&gt;물리적 설계에서 중요한 부분은 데이터 손실을 방지하기 위한 &lt;b&gt;백업 및 복구 전략&lt;/b&gt;입니다. 주기적인 백업 계획과, 장애 발생 시 &lt;b&gt;빠르게 복구&lt;/b&gt;할 수 있는 시스템을 구축하는 것이 필요합니다. 데이터베이스의 크기나 중요도에 따라 적합한 백업 전략을 설정하는 것이 중요합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-end=&quot;2403&quot; data-start=&quot;2400&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;2424&quot; data-start=&quot;2405&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;물리적 설계의 중요성&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;2549&quot; data-start=&quot;2426&quot; data-ke-size=&quot;size16&quot;&gt;물리적 설계는 데이터베이스 성능을 최적화하고, 시스템 안정성을 높이며, 확장성을 고려하는 중요한 단계입니다. 잘 설계된 물리적 구조는 데이터베이스의 처리 능력과 응답 속도를 개선하고, 사용자 경험을 향상시킬 수 있습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2908&quot; data-start=&quot;2551&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2665&quot; data-start=&quot;2551&quot;&gt;&lt;b&gt;성능 향상&lt;/b&gt;&lt;br /&gt;물리적 설계를 통해 데이터베이스의 읽기 및 쓰기 성능을 최적화할 수 있습니다. 인덱스, 파티셔닝, 비정규화 등을 적절히 활용하여 데이터베이스 성능을 크게 개선할 수 있습니다.&lt;/li&gt;
&lt;li data-end=&quot;2788&quot; data-start=&quot;2667&quot;&gt;&lt;b&gt;확장성&lt;/b&gt;&lt;br /&gt;물리적 설계를 잘하면, 데이터베이스가 증가하더라도 성능을 유지할 수 있습니다. 파티셔닝, 데이터 분산 등을 통해 수평 확장이 가능하며, 시스템이 커져도 원활하게 운영할 수 있도록 도와줍니다.&lt;/li&gt;
&lt;li data-end=&quot;2908&quot; data-start=&quot;2790&quot;&gt;&lt;b&gt;고가용성&lt;/b&gt;&lt;br /&gt;물리적 설계에서는 장애 대비를 위한 백업 전략과 복구 계획을 수립하여 시스템의 가용성을 높일 수 있습니다. 주기적인 백업과 재해 복구 계획은 중요한 데이터를 보호하는 데 필수적입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;2913&quot; data-start=&quot;2910&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;2932&quot; data-start=&quot;2915&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;물리적 설계 도구&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3207&quot; data-start=&quot;2934&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3065&quot; data-start=&quot;2934&quot;&gt;&lt;b&gt;MySQL Workbench&lt;/b&gt;&lt;br /&gt;MySQL Workbench는 물리적 설계와 관련된 여러 기능을 제공하는 도구입니다. 데이터베이스 모델링, 쿼리 최적화, 성능 분석 도구 등을 활용하여 물리적 설계를 진행할 수 있습니다.&lt;/li&gt;
&lt;li data-end=&quot;3207&quot; data-start=&quot;3067&quot;&gt;&lt;b&gt;Oracle Database Design Tools&lt;/b&gt;&lt;br /&gt;Oracle에서는 물리적 설계를 돕기 위해 다양한 &lt;b&gt;디자인 도구&lt;/b&gt;와 &lt;b&gt;성능 분석 툴&lt;/b&gt;을 제공합니다. 데이터 모델링 및 파티셔닝 전략 수립을 위한 도구들이 포함되어 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;3212&quot; data-start=&quot;3209&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;3233&quot; data-start=&quot;3214&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;결론 및 실용적인 팁&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;3404&quot; data-start=&quot;3235&quot; data-ke-size=&quot;size16&quot;&gt;물리적 설계는 데이터베이스 시스템의 성능과 안정성을 결정짓는 중요한 단계입니다. 데이터를 어떻게 저장하고, 어떻게 효율적으로 접근할지를 결정하는 과정에서 성능, 저장 공간, 확장성 등을 고려해야 합니다. 물리적 설계를 통해 데이터베이스의 성능을 최적화하고, 시스템의 확장성과 가용성을 높일 수 있습니다.&lt;/p&gt;
&lt;p data-end=&quot;3417&quot; data-start=&quot;3406&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;실용적인 팁:&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;3591&quot; data-start=&quot;3418&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;3486&quot; data-start=&quot;3418&quot;&gt;데이터베이스 성능을 위해 &lt;b&gt;적절한 인덱스를 설정&lt;/b&gt;하고, 자주 조회되는 데이터에 대해서는 복합 인덱스를 사용하세요.&lt;/li&gt;
&lt;li data-end=&quot;3539&quot; data-start=&quot;3487&quot;&gt;대규모 데이터베이스에는 &lt;b&gt;파티셔닝&lt;/b&gt;을 적용하여 데이터의 검색 및 관리를 최적화하세요.&lt;/li&gt;
&lt;li data-end=&quot;3591&quot; data-start=&quot;3540&quot;&gt;&lt;b&gt;정규화와 비정규화&lt;/b&gt;를 적절히 조화시켜 성능과 데이터 무결성 간의 균형을 맞추세요.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-end=&quot;3596&quot; data-start=&quot;3593&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-is-only-node=&quot;&quot; data-is-last-node=&quot;&quot; data-end=&quot;3663&quot; data-start=&quot;3598&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;공식 문서 링크:&lt;/b&gt;&lt;br /&gt;&lt;a href=&quot;https://dev.mysql.com/doc/&quot; data-is-last-node=&quot;&quot; data-end=&quot;3663&quot; data-start=&quot;3614&quot;&gt;MySQL 공식 물리적 설계 가이드&lt;/a&gt;&lt;/p&gt;</description>
      <category>자격증/SQLP</category>
      <category>SQLP</category>
      <category>자격증</category>
      <author>Ant_U</author>
      <guid isPermaLink="true">https://dbaant.tistory.com/231</guid>
      <comments>https://dbaant.tistory.com/231#entry231comment</comments>
      <pubDate>Mon, 16 Jun 2025 16:38:11 +0900</pubDate>
    </item>
    <item>
      <title>논리적 설계: 데이터베이스 설계에서의 핵심 단계와 중요성</title>
      <link>https://dbaant.tistory.com/230</link>
      <description>&lt;h3 data-end=&quot;308&quot; data-start=&quot;298&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-end=&quot;308&quot; data-start=&quot;298&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;서론&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;551&quot; data-start=&quot;310&quot; data-ke-size=&quot;size16&quot;&gt;데이터베이스 설계에서 &lt;b&gt;논리적 설계&lt;/b&gt;는 개념적 설계와 물리적 설계 사이의 중요한 연결 고리입니다. 논리적 설계 단계는 시스템의 요구 사항을 충족하기 위한 데이터베이스 구조를 &lt;b&gt;구체적이고 효율적으로 정의&lt;/b&gt;하는 과정입니다. 이 과정에서 테이블, 필드, 관계 등을 어떻게 정의할지 결정하게 되며, 후속 물리적 설계가 원활하게 이루어지도록 준비를 합니다. 이번 글에서는 논리적 설계의 정의, 주요 요소, 중요성 등을 살펴보겠습니다.&lt;/p&gt;
&lt;hr data-end=&quot;556&quot; data-start=&quot;553&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;579&quot; data-start=&quot;558&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;논리적 설계란 무엇인가?&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;759&quot; data-start=&quot;581&quot; data-ke-size=&quot;size16&quot;&gt;논리적 설계는 데이터베이스의 &lt;b&gt;구체적인 구조&lt;/b&gt;를 설계하는 과정입니다. 개념적 설계에서 정의된 엔티티와 관계를 &lt;b&gt;구체적인 테이블 구조와 관계형 모델&lt;/b&gt;로 변환합니다. 논리적 설계는 주로 &lt;b&gt;데이터 모델링&lt;/b&gt; 및 &lt;b&gt;정규화&lt;/b&gt;와 관련이 있으며, 실제 데이터를 어떻게 효율적으로 저장하고 관리할지를 고민하는 단계입니다.&lt;/p&gt;
&lt;p data-end=&quot;898&quot; data-start=&quot;761&quot; data-ke-size=&quot;size16&quot;&gt;논리적 설계의 목적은 시스템에 필요한 모든 데이터를 &lt;b&gt;구체적이고 효율적으로 저장할 수 있는 테이블 형태로 변환&lt;/b&gt;하고, 데이터 간의 관계를 &lt;b&gt;정확하게 정의&lt;/b&gt;하는 것입니다. 이 단계에서 데이터베이스의 성능과 확장성을 고려하며 설계하게 됩니다.&lt;/p&gt;
&lt;hr data-end=&quot;903&quot; data-start=&quot;900&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;926&quot; data-start=&quot;905&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;논리적 설계의 주요 요소&lt;/b&gt;&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;1989&quot; data-start=&quot;928&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;1099&quot; data-start=&quot;928&quot;&gt;&lt;b&gt;테이블 설계&lt;/b&gt;&lt;br /&gt;논리적 설계의 핵심은 데이터베이스를 구성할 &lt;b&gt;테이블을 설계&lt;/b&gt;하는 것입니다. 각 테이블은 엔티티를 나타내며, 테이블의 각 행은 엔티티의 개별 인스턴스를 나타냅니다. 예를 들어, '고객' 테이블은 고객의 정보를 저장하고, '주문' 테이블은 주문 정보를 저장하는 방식입니다.&lt;/li&gt;
&lt;li data-end=&quot;1278&quot; data-start=&quot;1101&quot;&gt;&lt;b&gt;필드(컬럼) 정의&lt;/b&gt;&lt;br /&gt;각 테이블은 여러 개의 **필드(컬럼)**을 가지며, 필드는 테이블 내에서 저장되는 데이터의 속성을 정의합니다. 예를 들어, '고객' 테이블은 '이름', '주소', '전화번호' 등의 필드를 가질 수 있습니다. 논리적 설계에서는 각 필드가 저장할 데이터 타입과 길이도 정의됩니다.&lt;/li&gt;
&lt;li data-end=&quot;1505&quot; data-start=&quot;1280&quot;&gt;&lt;b&gt;정규화(Normalization)&lt;/b&gt;&lt;br /&gt;정규화는 데이터베이스 설계에서 중복을 최소화하고, 데이터의 무결성을 보장하는 중요한 과정입니다. 데이터의 중복을 제거하고, 각 데이터가 적합한 테이블에 배치되도록 합니다. 정규화는 여러 단계로 이루어지며, 1NF, 2NF, 3NF 등의 정규형을 거쳐 진행됩니다. 각 정규형은 테이블 구조에서 중복을 없애고, 데이터 간의 의존 관계를 명확히 합니다.&lt;/li&gt;
&lt;li data-end=&quot;1752&quot; data-start=&quot;1507&quot;&gt;&lt;b&gt;관계 설정(Relationships)&lt;/b&gt;&lt;br /&gt;논리적 설계에서 &lt;b&gt;엔티티 간의 관계&lt;/b&gt;를 정의하는 것은 중요한 단계입니다. 관계형 데이터베이스에서는 외래 키(foreign key)를 사용하여 테이블 간의 관계를 정의합니다. 예를 들어, '고객' 테이블과 '주문' 테이블은 '고객 ID'를 외래 키로 사용하여 &lt;b&gt;일대다&lt;/b&gt; 관계를 맺을 수 있습니다. 이러한 관계 설정은 데이터베이스의 무결성을 유지하는 데 중요한 역할을 합니다.&lt;/li&gt;
&lt;li data-end=&quot;1989&quot; data-start=&quot;1754&quot;&gt;&lt;b&gt;제약 조건(Constraints)&lt;/b&gt;&lt;br /&gt;제약 조건은 데이터의 무결성을 보장하고, 잘못된 데이터가 저장되지 않도록 하는 규칙입니다. 예를 들어, &lt;b&gt;유니크(UNIQUE)&lt;/b&gt; 제약 조건은 특정 필드 값이 중복되지 않도록 보장하며, &lt;b&gt;체크(CHECK)&lt;/b&gt; 제약 조건은 필드에 저장될 수 있는 값의 범위를 제한합니다. 이러한 제약 조건은 논리적 설계에서 데이터의 품질을 높이고 오류를 줄이는 데 도움을 줍니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-end=&quot;1994&quot; data-start=&quot;1991&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;2015&quot; data-start=&quot;1996&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;논리적 설계의 중요성&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;2138&quot; data-start=&quot;2017&quot; data-ke-size=&quot;size16&quot;&gt;논리적 설계는 데이터베이스의 성능, 확장성, 유지 관리의 효율성에 큰 영향을 미칩니다. 이 단계에서 이루어지는 주요 작업들은 이후 물리적 설계와 구현에 중요한 영향을 미칩니다. 논리적 설계의 중요성은 다음과 같습니다:&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;2577&quot; data-start=&quot;2140&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;2276&quot; data-start=&quot;2140&quot;&gt;&lt;b&gt;성능 최적화&lt;/b&gt;&lt;br /&gt;논리적 설계를 통해 데이터베이스의 구조를 최적화하면, 데이터를 빠르게 검색하고, 쿼리 성능을 향상시킬 수 있습니다. 테이블 간의 관계를 명확히 정의하고, 데이터 중복을 줄이는 것이 성능 향상에 크게 기여합니다.&lt;/li&gt;
&lt;li data-end=&quot;2426&quot; data-start=&quot;2278&quot;&gt;&lt;b&gt;데이터 무결성 유지&lt;/b&gt;&lt;br /&gt;데이터베이스의 무결성을 유지하려면, 데이터 간의 관계와 제약 조건을 정확하게 정의해야 합니다. 논리적 설계 단계에서 이러한 제약을 설정함으로써 데이터의 일관성을 유지하고, 잘못된 데이터가 저장되지 않도록 방지할 수 있습니다.&lt;/li&gt;
&lt;li data-end=&quot;2577&quot; data-start=&quot;2428&quot;&gt;&lt;b&gt;유연한 확장성&lt;/b&gt;&lt;br /&gt;논리적 설계를 잘 하면, 데이터베이스가 &lt;b&gt;추후에 변경&lt;/b&gt;되거나 &lt;b&gt;확장&lt;/b&gt;될 때 유연하게 대응할 수 있습니다. 비즈니스가 변화함에 따라 요구 사항도 바뀔 수 있는데, 잘 정의된 논리적 설계는 이러한 변화를 반영하는 데 용이합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-end=&quot;2582&quot; data-start=&quot;2579&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;2601&quot; data-start=&quot;2584&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;논리적 설계 도구&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2916&quot; data-start=&quot;2603&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2758&quot; data-start=&quot;2603&quot;&gt;&lt;b&gt;ER 다이어그램 (Entity-Relationship Diagram)&lt;/b&gt;&lt;br /&gt;ER 다이어그램은 논리적 설계를 시각적으로 표현하는 가장 대표적인 도구입니다. 엔티티와 그들 간의 관계를 시각적으로 나타내어, 데이터베이스 설계의 구조를 한눈에 파악할 수 있도록 도와줍니다.&lt;/li&gt;
&lt;li data-end=&quot;2916&quot; data-start=&quot;2760&quot;&gt;&lt;b&gt;정규화 도구&lt;/b&gt;&lt;br /&gt;정규화를 지원하는 다양한 도구들이 있으며, 이를 통해 데이터베이스를 논리적으로 분할하고 관계를 명확히 할 수 있습니다. 예를 들어, MySQL Workbench와 같은 도구를 사용하여 ER 다이어그램을 자동으로 생성하고 정규화를 진행할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;2921&quot; data-start=&quot;2918&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;2942&quot; data-start=&quot;2923&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;결론 및 실용적인 팁&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;3111&quot; data-start=&quot;2944&quot; data-ke-size=&quot;size16&quot;&gt;논리적 설계는 데이터베이스가 효율적으로 작동하고, 확장 가능하며, 무결성이 유지되도록 하는 중요한 과정입니다. 이 단계에서 데이터베이스의 구조와 관계를 명확히 정의하고, 정규화를 통해 중복을 줄여야 합니다. 논리적 설계를 통해 후속 단계인 물리적 설계와 구현이 보다 효율적으로 이루어질 수 있습니다.&lt;/p&gt;
&lt;p data-end=&quot;3124&quot; data-start=&quot;3113&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;실용적인 팁:&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;3248&quot; data-start=&quot;3125&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;3164&quot; data-start=&quot;3125&quot;&gt;정규화를 통해 데이터 중복을 줄이고, 데이터 무결성을 보장하세요.&lt;/li&gt;
&lt;li data-end=&quot;3201&quot; data-start=&quot;3165&quot;&gt;ER 다이어그램을 활용하여 관계를 시각적으로 표현해 보세요.&lt;/li&gt;
&lt;li data-end=&quot;3248&quot; data-start=&quot;3202&quot;&gt;데이터베이스의 성능을 고려하여 인덱스나 쿼리 최적화 방안을 사전에 고민하세요.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-end=&quot;3253&quot; data-start=&quot;3250&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-is-only-node=&quot;&quot; data-is-last-node=&quot;&quot; data-end=&quot;3323&quot; data-start=&quot;3255&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;공식 문서 링크:&lt;/b&gt;&lt;br /&gt;&lt;a href=&quot;https://dev.mysql.com/doc/&quot; data-is-last-node=&quot;&quot; data-end=&quot;3323&quot; data-start=&quot;3271&quot;&gt;MySQL 공식 데이터베이스 설계 가이드&lt;/a&gt;&lt;/p&gt;</description>
      <category>자격증/SQLP</category>
      <category>SQLP</category>
      <category>자격증</category>
      <author>Ant_U</author>
      <guid isPermaLink="true">https://dbaant.tistory.com/230</guid>
      <comments>https://dbaant.tistory.com/230#entry230comment</comments>
      <pubDate>Mon, 16 Jun 2025 15:12:24 +0900</pubDate>
    </item>
    <item>
      <title>개념적 설계란? 데이터베이스 설계에서의 중요성과 단계</title>
      <link>https://dbaant.tistory.com/229</link>
      <description>&lt;h3 data-end=&quot;166&quot; data-start=&quot;156&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-end=&quot;166&quot; data-start=&quot;156&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;서론&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;431&quot; data-start=&quot;168&quot; data-ke-size=&quot;size16&quot;&gt;데이터베이스 설계는 효율적이고 관리하기 쉬운 시스템을 구축하는 데 중요한 역할을 합니다. 데이터베이스 설계의 첫 번째 단계인 &lt;b&gt;개념적 설계&lt;/b&gt;는 시스템에서 필요한 데이터를 정의하고, 데이터들 간의 관계를 추상적으로 설계하는 과정입니다. 이 단계는 시스템의 전체적인 구조를 파악하는 데 중요한 기초가 되며, 후속 단계인 논리적 설계와 물리적 설계의 기초가 됩니다. 이번 글에서는 개념적 설계의 정의와 중요성, 그리고 이를 실무에서 어떻게 적용할 수 있는지 살펴보겠습니다.&lt;/p&gt;
&lt;hr data-end=&quot;436&quot; data-start=&quot;433&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;459&quot; data-start=&quot;438&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;개념적 설계란 무엇인가?&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;687&quot; data-start=&quot;461&quot; data-ke-size=&quot;size16&quot;&gt;개념적 설계는 데이터베이스 설계 과정 중 가장 추상적인 단계로, 사용자가 관리해야 할 주요 엔티티(Entity)와 그들 간의 관계를 정의합니다. 이 단계에서는 실제 데이터베이스의 구체적인 구현 방법이나 제약 조건에 대해 고려하지 않고, 데이터베이스의 &lt;b&gt;고수준&lt;/b&gt; 구조만을 설계합니다. 즉, 이 단계에서는 **&quot;무엇을 저장할 것인지&quot;**와 **&quot;그 데이터들이 서로 어떻게 연결될 것인지&quot;**에 집중합니다.&lt;/p&gt;
&lt;p data-end=&quot;713&quot; data-start=&quot;689&quot; data-ke-size=&quot;size16&quot;&gt;개념적 설계의 주요 목표는 다음과 같습니다:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;841&quot; data-start=&quot;715&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;740&quot; data-start=&quot;715&quot;&gt;시스템에서 필요한 데이터와 그 관계를 정의&lt;/li&gt;
&lt;li data-end=&quot;783&quot; data-start=&quot;741&quot;&gt;데이터의 중복을 최소화하고, 유용한 데이터를 쉽게 추출할 수 있도록 설계&lt;/li&gt;
&lt;li data-end=&quot;841&quot; data-start=&quot;784&quot;&gt;데이터베이스의 추상적인 구조를 제공하여, 후속 단계인 논리적 설계와 물리적 설계에 대한 기초를 마련&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-end=&quot;846&quot; data-start=&quot;843&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;872&quot; data-start=&quot;848&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;개념적 설계의 주요 구성 요소&lt;/b&gt;&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;1666&quot; data-start=&quot;874&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;1103&quot; data-start=&quot;874&quot;&gt;&lt;b&gt;엔티티(Entity)&lt;/b&gt;&lt;br /&gt;개념적 설계에서 가장 중요한 요소 중 하나는 &lt;b&gt;엔티티&lt;/b&gt;입니다. 엔티티는 실제 시스템에서 관리해야 하는 객체나 개념을 의미합니다. 예를 들어, 고객, 주문, 제품, 직원 등은 모두 엔티티가 될 수 있습니다. 각 엔티티는 다양한 **속성(Attributes)**을 가질 수 있습니다. 예를 들어, '고객' 엔티티는 이름, 주소, 이메일 등의 속성을 가질 수 있습니다.&lt;/li&gt;
&lt;li data-end=&quot;1308&quot; data-start=&quot;1105&quot;&gt;&lt;b&gt;관계(Relationship)&lt;/b&gt;&lt;br /&gt;엔티티 간의 &lt;b&gt;관계&lt;/b&gt;를 정의하는 것은 개념적 설계에서 중요한 부분입니다. 엔티티들은 서로 다양한 방식으로 관계를 맺고 있으며, 이 관계를 정의하는 것이 데이터 모델링의 핵심입니다. 예를 들어, '고객'과 '주문'은 &lt;b&gt;일대다&lt;/b&gt; 관계를 가질 수 있습니다. 한 고객은 여러 개의 주문을 할 수 있기 때문입니다.&lt;/li&gt;
&lt;li data-end=&quot;1478&quot; data-start=&quot;1310&quot;&gt;&lt;b&gt;식별자(Identifier)&lt;/b&gt;&lt;br /&gt;각 엔티티는 고유한 식별자를 가져야 합니다. 식별자는 데이터베이스에서 각 엔티티를 구별할 수 있도록 돕습니다. 예를 들어, '고객' 엔티티에서는 고객 ID가 고유 식별자로 사용될 수 있습니다. 이는 나중에 다른 테이블에서 외래 키로 참조되기도 합니다.&lt;/li&gt;
&lt;li data-end=&quot;1666&quot; data-start=&quot;1480&quot;&gt;&lt;b&gt;제약조건(Constraints)&lt;/b&gt;&lt;br /&gt;개념적 설계에서 제약조건은 데이터가 어떻게 연결될지, 어떤 값이 허용되는지 등에 대한 규칙을 정의합니다. 예를 들어, '고객' 엔티티의 이메일 주소는 고유해야 한다는 제약을 두거나, '주문' 엔티티에서 주문 날짜가 반드시 과거가 아니라 현재여야 한다는 제약을 설정할 수 있습니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-end=&quot;1671&quot; data-start=&quot;1668&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1692&quot; data-start=&quot;1673&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;개념적 설계의 중요성&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;1824&quot; data-start=&quot;1694&quot; data-ke-size=&quot;size16&quot;&gt;개념적 설계는 데이터베이스 설계의 첫 단계로, &lt;b&gt;후속 설계 단계에 큰 영향을 미칩니다&lt;/b&gt;. 잘 설계된 개념적 모델은 데이터베이스 시스템의 전체적인 효율성과 성능을 크게 향상시킬 수 있습니다. 다음은 개념적 설계가 중요한 이유입니다:&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;2300&quot; data-start=&quot;1826&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;1988&quot; data-start=&quot;1826&quot;&gt;&lt;b&gt;데이터 요구 사항의 명확화&lt;/b&gt;&lt;br /&gt;개념적 설계를 통해 사용자는 실제 시스템에서 필요한 데이터가 무엇인지를 명확히 할 수 있습니다. 이 과정은 시스템을 어떻게 구성할지에 대한 통찰을 제공하며, 데이터의 불필요한 중복을 제거하고 효율적인 데이터 구조를 설계할 수 있도록 돕습니다.&lt;/li&gt;
&lt;li data-end=&quot;2141&quot; data-start=&quot;1990&quot;&gt;&lt;b&gt;향후 변경에 대한 유연성&lt;/b&gt;&lt;br /&gt;개념적 설계는 실제 구현에 들어가기 전의 추상적인 단계이기 때문에, 이후의 단계에서 구조를 변경할 수 있는 유연성을 제공합니다. 비즈니스 요구 사항이나 시스템이 변경될 때, 개념적 설계를 바탕으로 손쉽게 수정할 수 있습니다.&lt;/li&gt;
&lt;li data-end=&quot;2300&quot; data-start=&quot;2143&quot;&gt;&lt;b&gt;소통의 효율성&lt;/b&gt;&lt;br /&gt;개념적 설계는 데이터베이스 관리자(DBA), 개발자, 시스템 분석가 등 다양한 사람들과의 소통을 돕습니다. 이해 관계자들이 시스템에 대한 공통된 이해를 가질 수 있도록 도와주며, 이로 인해 설계 오류를 줄이고 프로젝트의 일정을 지킬 수 있습니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-end=&quot;2305&quot; data-start=&quot;2302&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;2329&quot; data-start=&quot;2307&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;개념적 설계의 도구와 방법&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;2469&quot; data-start=&quot;2331&quot; data-ke-size=&quot;size16&quot;&gt;개념적 설계를 할 때 사용하는 대표적인 도구는 **ER 다이어그램(Entity-Relationship Diagram)**입니다. ER 다이어그램은 엔티티와 그들 간의 관계를 시각적으로 표현하는 방법으로, 개념적 설계의 핵심 도구로 널리 사용됩니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;2540&quot; data-start=&quot;2471&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2493&quot; data-start=&quot;2471&quot;&gt;&lt;b&gt;엔티티&lt;/b&gt;는 사각형으로 표시되고,&lt;/li&gt;
&lt;li data-end=&quot;2513&quot; data-start=&quot;2494&quot;&gt;&lt;b&gt;속성&lt;/b&gt;은 원이나 타원으로,&lt;/li&gt;
&lt;li data-end=&quot;2540&quot; data-start=&quot;2514&quot;&gt;&lt;b&gt;관계&lt;/b&gt;는 다이아몬드 형태로 표시됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;2614&quot; data-start=&quot;2542&quot; data-ke-size=&quot;size16&quot;&gt;ER 다이어그램은 관계형 데이터베이스 설계에서 매우 중요한 역할을 하며, 개념적 설계 단계를 명확하고 이해하기 쉽게 만들어줍니다.&lt;/p&gt;
&lt;hr data-end=&quot;2619&quot; data-start=&quot;2616&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;2640&quot; data-start=&quot;2621&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;결론 및 실용적인 팁&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;2818&quot; data-start=&quot;2642&quot; data-ke-size=&quot;size16&quot;&gt;개념적 설계는 데이터베이스 시스템의 기초를 다지는 중요한 과정입니다. 이 단계에서 데이터의 흐름과 관계를 명확히 정의하는 것이 시스템의 효율성 및 유지보수성을 높이는 데 필수적입니다. ER 다이어그램과 같은 도구를 활용하여 설계를 시각적으로 표현하면 설계 과정이 더욱 명확해지고, 이해관계자와의 소통이 원활해집니다.&lt;/p&gt;
&lt;p data-end=&quot;2831&quot; data-start=&quot;2820&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;실용적인 팁:&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;2984&quot; data-start=&quot;2832&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;2896&quot; data-start=&quot;2832&quot;&gt;개념적 설계 단계에서는 &lt;b&gt;데이터 요구 사항&lt;/b&gt;을 정확히 이해하고, 불필요한 복잡성을 피하는 것이 중요합니다.&lt;/li&gt;
&lt;li data-end=&quot;2940&quot; data-start=&quot;2897&quot;&gt;ER 다이어그램을 활용하여 &lt;b&gt;시각적으로 관계를 명확히&lt;/b&gt; 표현하십시오.&lt;/li&gt;
&lt;li data-end=&quot;2984&quot; data-start=&quot;2941&quot;&gt;후속 설계 단계에서 변경이 용이하도록 &lt;b&gt;추상화된 설계&lt;/b&gt;를 유지하세요.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-end=&quot;2989&quot; data-start=&quot;2986&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-is-only-node=&quot;&quot; data-is-last-node=&quot;&quot; data-end=&quot;3059&quot; data-start=&quot;2991&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;공식 문서 링크:&lt;/b&gt;&lt;br /&gt;&lt;a href=&quot;https://dev.mysql.com/doc/&quot; data-is-last-node=&quot;&quot; data-end=&quot;3059&quot; data-start=&quot;3007&quot;&gt;MySQL 공식 데이터베이스 설계 가이드&lt;/a&gt;&lt;/p&gt;</description>
      <category>자격증/SQLP</category>
      <category>SQLP</category>
      <category>자격증</category>
      <author>Ant_U</author>
      <guid isPermaLink="true">https://dbaant.tistory.com/229</guid>
      <comments>https://dbaant.tistory.com/229#entry229comment</comments>
      <pubDate>Mon, 16 Jun 2025 14:58:59 +0900</pubDate>
    </item>
    <item>
      <title>데이터 모델링 개요: MySQL에서 효율적인 데이터 모델링의 기초</title>
      <link>https://dbaant.tistory.com/228</link>
      <description>&lt;h3 data-end=&quot;191&quot; data-start=&quot;181&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-end=&quot;191&quot; data-start=&quot;181&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;서론&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;403&quot; data-start=&quot;193&quot; data-ke-size=&quot;size16&quot;&gt;데이터 모델링은 데이터베이스 설계의 중요한 첫 단계로, 실제 데이터베이스 시스템이 어떻게 구조화되고 데이터를 저장할지를 정의합니다. MySQL을 포함한 관계형 데이터베이스에서 효율적인 데이터 모델링은 성능, 유지 관리, 확장성 등에 큰 영향을 미칩니다. 이 글에서는 데이터 모델링의 기본 개념과 MySQL에서 데이터 모델링을 어떻게 접근할 수 있는지에 대해 설명하고자 합니다.&lt;/p&gt;
&lt;hr data-end=&quot;408&quot; data-start=&quot;405&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;428&quot; data-start=&quot;410&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;데이터 모델링이란?&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;628&quot; data-start=&quot;430&quot; data-ke-size=&quot;size16&quot;&gt;데이터 모델링은 시스템에서 필요한 데이터를 정의하고, 그 데이터들이 서로 어떻게 연결될지를 설계하는 과정을 말합니다. 즉, 어떤 정보가 필요한지, 그리고 그 정보들이 어떻게 상호작용할지 구조화하는 작업입니다. 데이터 모델링의 결과물은 데이터베이스의 논리적 구조를 나타내는 &lt;b&gt;개념적 모델&lt;/b&gt;, &lt;b&gt;논리적 모델&lt;/b&gt;, &lt;b&gt;물리적 모델&lt;/b&gt;로 나눌 수 있습니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;1154&quot; data-start=&quot;630&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;790&quot; data-start=&quot;630&quot;&gt;&lt;b&gt;개념적 모델 (Conceptual Model)&lt;/b&gt;&lt;br /&gt;개념적 모델은 데이터가 어떤 객체를 나타내는지, 그리고 그 객체들이 서로 어떻게 관계를 맺는지에 대해 높은 수준에서 설명합니다. 예를 들어, 고객, 주문, 제품 등의 엔티티를 정의하고 이들이 어떻게 연결될지 설계합니다.&lt;/li&gt;
&lt;li data-end=&quot;988&quot; data-start=&quot;792&quot;&gt;&lt;b&gt;논리적 모델 (Logical Model)&lt;/b&gt;&lt;br /&gt;논리적 모델은 개념적 모델을 좀 더 구체화하여 데이터가 어떻게 저장될지에 대해 정의합니다. 여기서 중요한 점은 실제 데이터베이스 시스템에 관계형 테이블을 어떻게 매핑할지 고민하는 단계입니다. 예를 들어, '고객' 테이블, '주문' 테이블 등을 정의하고, 각 테이블 간의 관계를 설계합니다.&lt;/li&gt;
&lt;li data-end=&quot;1154&quot; data-start=&quot;990&quot;&gt;&lt;b&gt;물리적 모델 (Physical Model)&lt;/b&gt;&lt;br /&gt;물리적 모델은 논리적 모델을 실제 MySQL 데이터베이스의 테이블로 변환하는 과정입니다. 이는 데이터를 어떻게 저장할 것인지에 대한 세부적인 정의를 포함하며, 인덱스 설정, 데이터 타입 최적화, 파티셔닝 등을 포함할 수 있습니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-end=&quot;1159&quot; data-start=&quot;1156&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1191&quot; data-start=&quot;1161&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;MySQL에서 데이터 모델링의 기본 요소&lt;/b&gt;&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;1859&quot; data-start=&quot;1193&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;1383&quot; data-start=&quot;1193&quot;&gt;&lt;b&gt;엔티티(Entity)와 속성(Attribute)&lt;/b&gt;&lt;br /&gt;데이터 모델링에서 &lt;b&gt;엔티티&lt;/b&gt;는 실제로 관리해야 할 객체들을 의미합니다. 예를 들어, '고객', '주문'과 같은 테이블을 엔티티로 정의할 수 있습니다. 각 엔티티는 &lt;b&gt;속성&lt;/b&gt;을 가지며, 예를 들어 고객 엔티티는 이름, 이메일, 전화번호 등의 속성을 가질 수 있습니다.&lt;/li&gt;
&lt;li data-end=&quot;1541&quot; data-start=&quot;1385&quot;&gt;&lt;b&gt;관계(Relationship)&lt;/b&gt;&lt;br /&gt;엔티티 간에는 관계가 형성됩니다. 예를 들어, 고객은 여러 주문을 할 수 있기 때문에 고객과 주문 간에 &lt;b&gt;일대다&lt;/b&gt; 관계가 존재합니다. MySQL에서는 이를 외래 키(foreign key) 제약을 사용하여 구현할 수 있습니다.&lt;/li&gt;
&lt;li data-end=&quot;1722&quot; data-start=&quot;1543&quot;&gt;&lt;b&gt;정규화(Normalization)&lt;/b&gt;&lt;br /&gt;정규화는 데이터의 중복을 최소화하고, 데이터베이스 설계를 효율적으로 만드는 과정입니다. 예를 들어, 1NF(제1정규형), 2NF(제2정규형), 3NF(제3정규형) 등을 적용하여 테이블을 나누고, 관계를 설정합니다. 이는 데이터 무결성 유지와 성능 향상에 기여합니다.&lt;/li&gt;
&lt;li data-end=&quot;1859&quot; data-start=&quot;1724&quot;&gt;&lt;b&gt;인덱스(Index)&lt;/b&gt;&lt;br /&gt;MySQL에서 데이터를 빠르게 검색하고 성능을 최적화하기 위해 인덱스를 사용합니다. 자주 조회되는 컬럼에 인덱스를 추가하는 것이 중요하며, 데이터 모델링 시 이러한 인덱스 전략도 함께 고려해야 합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-end=&quot;1864&quot; data-start=&quot;1861&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;1895&quot; data-start=&quot;1866&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;MySQL 버전별 데이터 모델링 차이점&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;1967&quot; data-start=&quot;1897&quot; data-ke-size=&quot;size16&quot;&gt;MySQL은 버전마다 다양한 기능과 성능 향상이 이루어졌습니다. 특히 데이터 모델링에서 중요한 변경 사항들은 다음과 같습니다:&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;2419&quot; data-start=&quot;1969&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;2154&quot; data-start=&quot;1969&quot;&gt;&lt;b&gt;MySQL 5.7 이전&lt;/b&gt;&lt;br /&gt;MySQL 5.7 이전 버전에서는 JSON 데이터 타입이나 공간 데이터(Spatial Data)와 같은 복잡한 데이터 타입을 효율적으로 처리하는 데 제한이 있었습니다. 또한, 외래 키 제약에 대한 기능이 일부 제한적이었고, 성능이 중요한 대규모 시스템에서는 모델링에 어려움이 있었습니다.&lt;/li&gt;
&lt;li data-end=&quot;2419&quot; data-start=&quot;2156&quot;&gt;&lt;b&gt;MySQL 8.0 이후&lt;/b&gt;&lt;br /&gt;MySQL 8.0에서는 JSON 데이터 타입이 도입되어 비정형 데이터를 저장하고 처리할 수 있는 기능이 향상되었습니다. 또한, CTE(Common Table Expressions)와 윈도우 함수(Window Functions) 지원 등 고급 SQL 기능이 강화되어, 데이터 모델링 시 더욱 유연하고 강력한 쿼리 작성이 가능해졌습니다. 또한, 성능 향상 및 최적화 도구가 추가되어 데이터베이스 설계 및 튜닝에 큰 도움이 됩니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-end=&quot;2424&quot; data-start=&quot;2421&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-end=&quot;2445&quot; data-start=&quot;2426&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;결론 및 실용적인 팁&lt;/b&gt;&lt;/h3&gt;
&lt;p data-end=&quot;2627&quot; data-start=&quot;2447&quot; data-ke-size=&quot;size16&quot;&gt;효과적인 데이터 모델링은 MySQL 데이터베이스의 성능과 유지 관리에 큰 영향을 미칩니다. 적절한 엔티티 관계 설계, 정규화, 인덱싱 전략을 통해 데이터베이스의 효율성을 극대화할 수 있습니다. 또한, MySQL 버전업에 따라 새로운 기능들이 추가되므로, 최신 버전에서 제공하는 기능들을 적극적으로 활용하는 것이 중요합니다.&lt;/p&gt;
&lt;p data-end=&quot;2640&quot; data-start=&quot;2629&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;실용적인 팁:&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;2825&quot; data-start=&quot;2641&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;2693&quot; data-start=&quot;2641&quot;&gt;데이터베이스 설계를 시작하기 전에, 데이터의 흐름과 관계를 명확히 이해하고 설계하십시오.&lt;/li&gt;
&lt;li data-end=&quot;2774&quot; data-start=&quot;2694&quot;&gt;정규화를 통해 데이터 중복을 줄이고 무결성을 유지하세요. 하지만 너무 과도한 정규화는 성능을 저하시킬 수 있으니 적절한 균형이 필요합니다.&lt;/li&gt;
&lt;li data-end=&quot;2825&quot; data-start=&quot;2775&quot;&gt;MySQL의 최신 기능을 활용하여 데이터베이스 모델을 최적화하고 성능을 향상시키세요.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-end=&quot;2830&quot; data-start=&quot;2827&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-is-only-node=&quot;&quot; data-is-last-node=&quot;&quot; data-end=&quot;2898&quot; data-start=&quot;2832&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;공식 문서 링크:&lt;/b&gt;&lt;br /&gt;&lt;a href=&quot;https://dev.mysql.com/doc/&quot; data-is-last-node=&quot;&quot; data-end=&quot;2898&quot; data-start=&quot;2848&quot;&gt;MySQL 공식 데이터 모델링 가이드&lt;/a&gt;&lt;/p&gt;</description>
      <category>자격증/SQLP</category>
      <category>SQLP</category>
      <category>자격증</category>
      <author>Ant_U</author>
      <guid isPermaLink="true">https://dbaant.tistory.com/228</guid>
      <comments>https://dbaant.tistory.com/228#entry228comment</comments>
      <pubDate>Mon, 16 Jun 2025 14:54:18 +0900</pubDate>
    </item>
    <item>
      <title>[MySQL] ANALYZE TABLE 문 완벽 가이드: 통계 최적화의 핵심</title>
      <link>https://dbaant.tistory.com/227</link>
      <description>&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;b&gt;서론: 왜 ANALYZE TABLE을 알아야 할까?&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MySQL에서 쿼리 성능을 좌우하는 요소 중 하나는 옵티마이저(optimizer)가 얼마나 정확한 테이블 통계를 가지고 있는가입니다. ANALYZE TABLE 문은 이러한 통계를 수집하거나 갱신해 옵티마이저가 더 나은 실행 계획을 수립할 수 있도록 도와줍니다. 이 글에서는 ANALYZE TABLE의 사용 목적, 작동 방식, 자동 실행 조건, MySQL 버전별 차이 등을 알아보겠습니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. ANALYZE TABLE의 기본 개념과 사용법&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ANALYZE TABLE은 테이블의 인덱스 통계를 수집하거나 업데이트하는 명령어입니다. 일반적인 사용 예는 다음과 같습니다:&lt;/p&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;ANALYZE TABLE employees;
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 명령은 employees 테이블의 인덱스와 관련된 통계를 분석해 저장소 엔진에 전달합니다. 옵티마이저는 이 정보를 기반으로 쿼리 실행 계획을 수립하게 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MySQL에서는 InnoDB, MyISAM 등 스토리지 엔진에 따라 분석 방식이 다릅니다. InnoDB는 확률적 샘플링을 통해 통계를 수집하며, 버전에 따라 분석 정확도와 자동화 동작에 차이가 있습니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. 언제 ANALYZE TABLE을 사용해야 할까?&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음과 같은 상황에서 ANALYZE TABLE의 수동 실행을 고려할 수 있습니다:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;데이터가 대량으로 삽입, 삭제, 갱신된 후&lt;/li&gt;
&lt;li&gt;쿼리 성능이 갑자기 저하되었을 때&lt;/li&gt;
&lt;li&gt;옵티마이저가 잘못된 인덱스를 선택하는 경우&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 InnoDB에서는 통계가 자동으로 갱신되지 않을 수도 있기 때문에 주기적으로 수동 실행하는 것이 도움이 될 수 있습니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3. 자동 분석: MySQL의 자동 통계 갱신 메커니즘&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MySQL InnoDB 스토리지 엔진은 일정 조건을 만족할 때 자동으로 통계를 재계산합니다. 주요 조건은 다음과 같습니다:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;innodb_stats_on_metadata가 ON인 경우&lt;/li&gt;
&lt;li&gt;테이블의 행 수가 일정 비율 이상 변경된 경우&lt;/li&gt;
&lt;/ul&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부터는 innodb_stats_auto_recalc, persistent statistics 등이 도입되어 이전 버전보다 더 정밀한 통계 관리가 가능해졌습니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;4. 버전별 차이와 주의사항&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;MySQL 5.6 이하&lt;/b&gt;: 통계 정보는 휘발성이며 서버 재시작 시 초기화됨&lt;/li&gt;
&lt;li&gt;&lt;b&gt;MySQL 5.7&lt;/b&gt;: innodb_stats_persistent 옵션이 기본적으로 활성화되어 통계 정보가 영구 저장&lt;/li&gt;
&lt;li&gt;&lt;b&gt;MySQL 8.0&lt;/b&gt;: 샘플링 방식 개선, 자동 통계 재계산 알고리즘 향상, 히스토그램 기반 통계 도입 등&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;버전이 올라갈수록 자동화와 정밀도가 개선되었지만, 여전히 예외 상황에서 수동 ANALYZE TABLE 실행은 중요한 유지보수 수단입니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&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;ANALYZE TABLE은 MySQL 성능 튜닝의 기초이자 핵심 도구입니다. 쿼리 최적화를 위해 통계를 신경 쓰는 습관은 필수입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;실무 팁 요약:&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;테이블에 대량 변경이 발생한 후에는 ANALYZE TABLE 실행을 고려하세요.&lt;/li&gt;
&lt;li&gt;옵티마이저가 비효율적인 실행 계획을 수립한다면 통계 정보가 오래되었을 수 있습니다.&lt;/li&gt;
&lt;li&gt;MySQL 버전에 따라 자동 분석 옵션과 동작 방식을 확인하고 설정하세요.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;공식 문서 링크&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://dev.mysql.com/doc/refman/8.0/en/analyze-table.html&quot;&gt;MySQL ANALYZE TABLE 공식 문서&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>SQL/MYSQL</category>
      <category>ANALYZE TABLE</category>
      <category>MySQL</category>
      <author>Ant_U</author>
      <guid isPermaLink="true">https://dbaant.tistory.com/227</guid>
      <comments>https://dbaant.tistory.com/227#entry227comment</comments>
      <pubDate>Mon, 16 Jun 2025 11:47:28 +0900</pubDate>
    </item>
    <item>
      <title>[MySQL] 개발자를 위한 SET RESOURCE GROUP 문 사용법 및 CPU 관리 방식</title>
      <link>https://dbaant.tistory.com/226</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;보통 조합적인 환경 조정: MySQL과 SET RESOURCE GROUP 문&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MySQL가 개발 필드에서 사용되는 자원(예: CPU)을 분리하고 해당 시간에 필요한 프로세스에 해당 자원만 적용할 수 있게 해주는 기능이 &amp;ldquo;게이트 핸드런과 비슷&amp;rdquo;한 &lt;b&gt;RESOURCE GROUP&lt;/b&gt;입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;bull; MySQL 8.0에서 첫 번째로 등장&lt;br /&gt;&amp;bull; 개발자가 CPU 자원 사용을 세무니티 및 각 자원 관리 차원에서 관리할 수 있게 함&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;개발 방식: SET RESOURCE GROUP 문 사용법&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SET RESOURCE GROUP 문은 현재 연결된 자원관리 구단을 갱신하거나 다른 구단으로 변경하는 방식입니다.&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;SET RESOURCE GROUP = group_name;
&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;group_name : 무엇을 하고 있는 프로세스인지에 따라 다르게 지정&lt;/li&gt;
&lt;li&gt;예시:&lt;/li&gt;
&lt;li&gt;SET RESOURCE GROUP = oltp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;bull; 이 명령은 현재 연결 사용자의 시스어가 모든 SELECT, INSERT 등에서 oltp 구단의 CPU 자원 확인 범위만 사용하도록 해줍니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;설정 방식: RESOURCE GROUP 만들기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SET RESOURCE GROUP 문을 사용하기 전에는 매크 데이터 자원 관리차원에서 RESOURCE GROUP을 설정해야 합니다.&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;CREATE RESOURCE GROUP oltp
    TYPE = USER
    VCPU = 0-3
    THREAD_PRIORITY = 10;
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;bull; TYPE = USER 은 관리자 아래의 사용자가 이 구단을 사용할 수 있다는 의미&lt;br /&gt;&amp;bull; VCPU 는 적용되는 버츠에서 사용할 CPU 및 데이터&lt;br /&gt;&amp;bull; THREAD_PRIORITY 는 복잡한 자원 사용시 선호되는 역할 및 서울 조정&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;마무리: 실무에서의 사용 타겟&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;CPU 회피 중간에 다양한 workload 관리 가능&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;일정 자원 범위 안에서만 query 발행되게 가능&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;모든 query가 거친 것이 아닌, 연결시간에 해당 만 적용&lt;/b&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;공식 문서 링크&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://dev.mysql.com/doc/refman/8.0/en/set-resource-group.html&quot;&gt;표준 MySQL 문서 보기 - SET RESOURCE GROUP&lt;/a&gt;&lt;/p&gt;</description>
      <category>SQL/MYSQL</category>
      <category>MySQL</category>
      <category>set resource group</category>
      <author>Ant_U</author>
      <guid isPermaLink="true">https://dbaant.tistory.com/226</guid>
      <comments>https://dbaant.tistory.com/226#entry226comment</comments>
      <pubDate>Mon, 16 Jun 2025 11:43:28 +0900</pubDate>
    </item>
    <item>
      <title>[MySQL] DROP RESOURCE GROUP 문: 불필요한 리소스 그룹 안전하게 삭제하기</title>
      <link>https://dbaant.tistory.com/225</link>
      <description>&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 8.0에서 도입된 리소스 그룹 기능은 CPU 자원을 세분화해 쿼리 실행을 조절하는 데 유용합니다. 그러나 사용하지 않는 리소스 그룹은 혼란을 초래하고 시스템 자원 관리에도 부담이 될 수 있습니다. 이때 필요한 것이 DROP RESOURCE GROUP 문입니다. 이 글에서는 리소스 그룹을 안전하게 제거하는 방법을 소개합니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. DROP RESOURCE GROUP이란?&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DROP RESOURCE GROUP 문은 기존에 생성된 리소스 그룹을 삭제하는 명령어입니다. 이 명령은 해당 그룹이 더 이상 사용되지 않을 때 리소스를 정리하고 관리 효율을 높이기 위해 사용됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;기본 구문:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;DROP RESOURCE GROUP rg_background;
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. 사용 전 확인사항&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;리소스 그룹이 현재 세션 또는 다른 사용자에게 사용 중이라면 삭제할 수 없습니다.&lt;/li&gt;
&lt;li&gt;삭제 전, 해당 그룹을 사용하는 세션이나 스레드가 없도록 해야 합니다.&lt;/li&gt;
&lt;li&gt;시스템 기본 그룹은 삭제할 수 없습니다 (예: USR_default).&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;사용 중 오류 예시:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;ERROR 3572 (HY000): Resource group 'rg_background' is currently in use.
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 경우 먼저 해당 세션을 종료하거나 리소스 그룹에서 해제한 뒤 삭제를 시도해야 합니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3. 권한과 제한 사항&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;RESOURCE_GROUP_ADMIN 권한이 있어야 삭제 명령을 실행할 수 있습니다.&lt;/li&gt;
&lt;li&gt;삭제는 즉시 적용되며 복구할 수 없습니다. 삭제 전 백업이나 구성을 기록해두는 것이 좋습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;4. 실무 예제와 시나리오&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;테스트 용도로 만든 rg_testload 그룹을 삭제:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;DROP RESOURCE GROUP rg_testload;
&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;운영 중 더 이상 사용되지 않는 그룹 제거:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;SET RESOURCE GROUP USR_default;
DROP RESOURCE GROUP rg_oldops;
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&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;DROP RESOURCE GROUP 문은 시스템의 리소스 그룹 구성을 정리하고 효율적으로 유지하는 데 필수적인 도구입니다. 삭제 전 사용 여부를 반드시 확인하고, 시스템 안정성을 고려한 계획된 삭제가 중요합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;실무 팁:&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;삭제 전, performance_schema.threads에서 해당 그룹이 사용 중인지 확인하세요.&lt;/li&gt;
&lt;li&gt;프로비저닝 자동화 시스템에서는 리소스 그룹 제거도 함께 고려해 관리 스크립트에 반영하세요.&lt;/li&gt;
&lt;li&gt;삭제가 필요한 경우에도, 동일한 설정의 재생성을 위한 SQL 템플릿을 저장해두는 것이 좋습니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;공식 문서 링크&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;a href=&quot;https://dev.mysql.com/doc/refman/8.0/en/drop-resource-group.html&quot;&gt;MySQL DROP RESOURCE GROUP 공식 문서&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>SQL/MYSQL</category>
      <category>drop resource group</category>
      <category>MySQL</category>
      <author>Ant_U</author>
      <guid isPermaLink="true">https://dbaant.tistory.com/225</guid>
      <comments>https://dbaant.tistory.com/225#entry225comment</comments>
      <pubDate>Sun, 15 Jun 2025 01:00:26 +0900</pubDate>
    </item>
  </channel>
</rss>