MySQL은 기본 키에 대한 추가 인덱스를 생성하거나 데이터 자체를 인덱스 로 사용합니까?

마지막 업데이트: 2022년 1월 10일 | 0개 댓글
  • 네이버 블로그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 트위터 공유하기
  • 카카오스토리 공유하기
아래는 위 VISUAL EXPLAIN을 EXPLAIN으로 보았을 때 나타나는 표입니다.

MySQL은 기본 키에 대한 추가 인덱스를 생성하거나 데이터 자체를 "인덱스"로 사용합니까?

그에 대한 명확한 답을 찾으십시오. 기본 키를 만들 때 MySQL은 기본 키에 따라 데이터를 주문합니다. 질문은 실제로 다른 인덱스를 만들거나 기본 키로 정렬해야하기 때문에 실제 데이터를 인덱스로 사용한다는 것입니다.

수정 :

인덱스 A와 인덱스 B가 있고 기본 키가없는 테이블이 있으면 데이터 + 인덱스 A + 인덱스 B가 있습니다. 인덱스 A의 열을 기본 키로 갖도록 테이블을 변경하면 데이터 (인덱스로도 사용됨) + 인덱스 B가 있습니까? 위의 메모리 사용량 측면에서 볼 수 있습니다

    When you define a PRIMARY KEY on your table, InnoDB uses it as the clustered index

    If you do not define a PRIMARY KEY for your table, MySQL locates the first UNIQUE index where all the key columns are NOT NULL and InnoDB uses it as the clustered index.

    If the table has no PRIMARY KEY or suitable UNIQUE index, InnoDB internally generates a hidden clustered index named GEN_CLUST_INDEX on a synthetic column containing row ID values.The rows are ordered by the ID that InnoDB assigns to the rows in such a table. The row ID is a 6-byte field that increases monotonically as new rows are inserted. Thus, the rows ordered by the row ID are physically in insertion order.

예, 클러스터 된 인덱스의 인덱스는 테이블 자체입니다. 그것은 색인화되지 않은 다른 열이 저장되는 유일한 장소입니다. 테이블 상태를 표시하면

if I have a table with has index A and index B and no primary key, MySQL은 기본 키에 대한 추가 인덱스를 생성하거나 데이터 자체를 인덱스 로 사용합니까? I have the data + index A + index B. If I change the table to have columns of index A as the primary key, I will only have data (which is also used as an index) + index B right? The above is in terms of memory usage

InnoDB는 항상 클러스터 된 인덱스를 저장합니다. 테이블의 열에 PRIMARY KEY가 정의되어 있지 않은 경우 InnoDB는 클러스터형 인덱스의 키로 인공 열을 생성하며이 열을 쿼리 할 수 ​​없습니다.

mysql> show table status like 'redacted'\G *************************** 1. row *************************** Name: redacted Engine: InnoDB Version: 10 Row_format: Dynamic Rows: 100217 Avg_row_length: 1168 Data_length: 117063680

그렇지만 스토리지 크기 측면에서 고려해야 할 사항이 더 있습니다.

여러분이하려고하는 것은 논리적으로 훌륭하며 기본 키로 승격하려는 인덱스는 실제로후보 키입니다. 스토리지 크기를 절약 할 수있는 경우 인덱스 수와 기본 키 열의 크기에 따라 다릅니다. 그 이유는InnoDB가 기본 키 열을 모든 보조 인덱스에 추가하기 때문입니다 (이미 명시 적으로 그 일부가 아닌 경우). 외래 키로 참조해야하는 경우 다른 (더 큰) 테이블에도 영향을 줄 수 있습니다.

다음은 차이점을 보여줄 수있는 간단한 테스트입니다.시퀀스 플러그인이기 때문에 MariaDB를 사용하여 더미 데이터를 쉽게 만들 수 있습니다. 그러나 MySQL 서버에서도 동일한 효과가 나타납니다.

먼저 두 개의 INT 열과 각 열에 100K 행을 채우는 인덱스가있는 간단한 테이블을 만듭니다.

간단하게 유지하기 위해 테이블의 파일 크기 만 살펴 보겠습니다 ( drop table if exists test; create table test( a int, b int, index(a), index(b) ); insert into test(a, b) select seq as a, seq as b from seq_1_to_100000 ; 를 사용하고 있습니다) ).

이제 원하는 것을하고 열 16777216 test.ibd 를 만들어 보자 기본 키, CREATE 문 변경 :

현재 파일 크기는 다음과 같습니다 :

그렇습니다. 인덱스를 기본 키로 승격시켜 스토리지 크기를 절약 할 수 있습니다. 이 경우 거의 20 %입니다.

그러나 pyzwyz에서 열 유형을 변경하면 어떻게됩니까? 13631488 test.ibd 에 (4 바이트) (32 바이트)?

이제 create table test( a binary(32), b binary(32), index(a), index(b) ); 열을 만드십시오 기본 키

보다시피, 크기를 늘릴 수도 있습니다. 이 경우 11 %와 같습니다.

항상 기본 키를 정의하는 것이 좋습니다. 확실하지 않은 경우 AUTO_INCREMENT PRIMARY KEY를 만드십시오. 내 예에서는 다음과 같습니다.

크기는 명시적인 기본 키가없는 것과 같습니다. (숨겨진 6 바이트 PK 대신 3 바이트 PK를 사용하기 때문에 크기를 조금 절약 할 것으로 예상되지만) 이제 외래 키 및 조인에 대해 쿼리에서 사용할 수 있습니다.

create table test( id mediumint auto_increment primary key, a binary(32), b binary(32), index(a), index(b) );

MySQL Workbench의 VISUAL EXPLAIN으로 인덱스 동작 확인하기

안녕하세요. 저는 LINE 포인트 서버쪽 개발을 담당하고 있는 Ohara(@kory1202)입니다.

얼마 전 특정 테이블에서 데이터를 추출하는 코드를 작성했는데요. 함께 일하는 동료가 그 코드를 보더니 '이런 인덱스가 필요하겠다'고 조언해주었습니다. 이 일을 통해 제가 인덱스 관련 지식이 부족하다는 점을 깨닫게 되었는데요. 그래서 이번에 MySQL Workbench의 VISUAL EXPLAIN을 사용하면서 인덱스에 대해 스터디한 내용을 소개해볼까 합니다. VISUAL EXPLAIN은 SQL의 EXPLAIN을 도식화해주기 때문에 어떤 부분이 문제인지, 인덱스를 도입하면 어떤 처리가 개선되는 지 직관적으로 알 수 있습니다. 강력하게 추천합니다.

(이번 포스팅에서는 테스트 환경으로 macOS High Sierra 10.13.4와 MySQL 5.6의 InnoDB를 사용합니다.)

인덱스의 기초

인덱스의 구조

인덱스는 MySQL 5.6, Reference Manual, The MySQL은 기본 키에 대한 추가 인덱스를 생성하거나 데이터 자체를 인덱스 로 사용합니까? Physical Structure of an InnoDB Index에 나와 있듯이, B-tree 구조로 되어 있습니다. 이번 포스팅에서는 B-tree 구조에 대해서 자세히 다루지 않고, 아주 간략한 이미지만 아래에 첨부했습니다.

리프(leaf) 노드는 인덱스로 지정한 컬럼의 오름차순으로 정렬되어 있으며, 실제 행이 어디에 저장되어 있는지에 대한 데이터를 가지고 있습니다. WHERE col1 = 3 과 같은 등호 연산이나 WHERE col1 < 2 와 같은 범위 검색을 빠른 속도로 처리할 수 있습니다.

복합 인덱스는 아래 그림처럼 지정한 컬럼 순(여기에서는 col1 col2 순)으로 정렬됩니다. 이렇게 만든 복합인덱스는 WHERE col1 1 조건에는 사용할 수 없습니다. col2는 col1 내에서는 정렬되어 있지만, 전체적으로 보았을 때는 정렬되지 않은 상태(그림에서 col2는 왼쪽부터 1 2 3 1 2 1 )이기 때문입니다. 따라서, 이 인덱스로는 col2에서 1보다 큰 값이 어디에 있는지 알 수가 없습니다. 마찬가지로, WHERE col1 = 2 의 경우에도 col1 조건은 트리를 순회하면 탐색할 수 있지만, col2는 트리를 사용해서 찾을 수 없습니다. col1이 정해지면 col2는 정렬된 상태이니, WHERE col1 = 1 AND col2 >= 2 에는 사용할 수 있습니다. 이 부분에 대해서는 MySQL with InnoDB 인덱스의 기초 지식과 자주 하는 실수(일본어)도 같이 읽어 보시기 바랍니다.

인덱스 사용법

MySQL 5.6 Reference Manual / 8.3.1 How MySQL Uses Indexes를 꼼꼼히 읽어 보면 주로 사용되는 경우와 추가로 사용 가능한 경우를 알 수 있습니다.

  • WHERE와 ORDER BY, GROUP BY를 신속하게 수행하기 위해 사용됨
  • 원칙적으로 테이블 하나당 1개의 인덱스가 사용됨
  • 테이블의 행 개수는 많고, 검색 결과의 행 개수는 적을 때 사용됨
  • 쿼리가 테이블에 적재된 대부분의 행에 접근할 경우에는, 디스크 탐색이 최소화되는 Full Table Scan이 인덱스 사용하는 것보다 속도가 더 빠름
    • 따라서, 행 개수가 적은 테이블에서는 Full Table Scan을 사용하는게 좋음 에 따르면 테이블 사이즈, 행 개수, I/O 블록 사이즈 등에 따라 인덱스 사용 여부가 결정됨
    • 아래 쿼리는 인덱스에서 모든 값을 취득할 수 있기 때문에 데이터 행 확인이 불필요함
    • 아래 쿼리는 데이터 행 확인이 필요함

    MySQL Workbench와 VISUAL EXPLAIN MySQL은 기본 키에 대한 추가 인덱스를 생성하거나 데이터 자체를 인덱스 로 사용합니까? 소개

    MySQL Workbench는 MySQL의 GUI 클라이언트입니다. GUI에서 인덱스를 추가 및 삭제하거나 ERD(Entity Relationship Diagram)를 그리는 것도 가능하기 때문에, 시행착오를 겪으며 인덱스를 설정할 때 꽤 도움이 됩니다. 그리고 무엇보다 VISUAL EXPLAIN이 가능하다는 사실! 여기에서 'Download Now' 버튼을 클릭하면 다운로드할 수 있습니다.

    VISUAL EXPLAIN 실행 방법

    VISUAL EXPLAIN을 실행하려면 쿼리 입력란에 SQL문을 작성하고 왼쪽 상단에 위치한 돋보기 마크나 메뉴의 Query > Explain Current Statement , 또는 단축 키 Cmd + Option + x (macOS의 경우)를 누르면 됩니다.

    EXPLAIN 결과가 보고 싶을 때는 위 그림에서 중앙 왼쪽 셀렉트 박스를 변경하면 됩니다. 화면 중앙 오른쪽에 보이는 View Source 버튼을 누르면, VISUAL EXPLAIN의 원래 정보를 JSON 형식으로 확인할 수 있습니다. 사용해보면 참 편리한 기능입니다.

    VISUAL EXPLAIN의 색상과 테이블 도형의 텍스트에 대한 간단한 설명

    컬러풀한 사각형 오브젝트는 테이블에 어떻게 액세스하는지를 나타냅니다. 파란색에 가까울수록 비용이 낮고, 빨간색에 가까울 수록 비용이 높은 액세스입니다. 아래쪽 빨간색 두 가지, index와 ALL은 인덱스를 활용한 튜닝 대상으로 자주 거론됩니다.

    색상 오브젝트 내 텍스트 EXPLAIN type
    Single row: constant const
    Unique Key Lookup eq_ref
    Non-Unique Key Lookup ref
    Fulltext Index Search fulltext
    Index Range Scan range
    Full Index Scan index
    Full Table Scan ALL

    (위 표에서 Lookup은 where col = 1과 같은 동등 비교입니다.)

    VISUAL EXPLAIN으로 인덱스 동작 확인하기

    이제 본론으로 들어가겠습니다. 파란색에서 빨간색으로 갈수록 비용이 커진다는 점만 알고 있으면, 보는 법을 자세하게 기억해 두지 않아도 사용할 수 있습니다.

    이번 테스트에 사용할 두 테이블은 어느 사용자가 컨버전했는지 저장해 두는 cv 테이블과 이와 매칭되는 광고의 ad 테이블입니다. 테스트를 위해 만든 데이터의 대략적인 특성은 다음과 같습니다.

    • 인덱스가 간단하니, 이 시점에선 PRIMARY KEY만 사용
    • 각 테이블에 적재시킨 데이터의 양은 cv가 약 100만 건, ad는 약 4000건
    • cv의 status와 ad의 type은 각각 균등하게 10종류씩 설정
    • 시간을 저장하는 컬럼은 UNIX TIME, 최근 한 달간의 데이터를 베이스로 저장

    ERD는 일부러 MySQL Workbench에서 출력했습니다. Workbench는 외부 키를 지정해 두면 자동으로 relation이 도식화되는데요(참고). 이번에는 설명을 간략화하기 위해 PRIMARY KEY만 지정했기 때문에 아래 그림과 같이 표시되었습니다.

    설정된 인덱스 없음

    먼저, 설정된 인덱스가 없는 상태를 보시겠습니다.

    이 쿼리에 대해 VISUAL EXPLAIN을 실행하면 아래 이미지가 나옵니다.

    아래는 위 VISUAL EXPLAIN을 EXPLAIN으로 보았을 때 나타나는 표입니다.

    화살표 방향대로 읽으면, cv 테이블 전체를 스캔해서 얻은 100만 개의 행을 ORDER BY로 정렬해서 결과를 얻었다는 것을 알 수 있습니다. 새빨간색이네요. 100만 개나 되는 행을 스캔해서 WHERE 조건에 부합하는 행을 찾고, 전체를 정렬해서 100건을 반환하기 때문에 처리 부하가 큽니다. 인덱스가 필요합니다.

    WHERE 조건에 인덱스 설정

    위 SQL이 보다 빠르게 처리될 수 있도록 인덱스를 추가하겠습니다.

    먼저 WHERE 조건인 status에 인덱스를 지정합니다. 인덱스 덕분에 status = 2인 레코드만 가져오는 것이 쉬워집니다.

    아래는 위 VISUAL EXPLAIN을 EXPLAIN으로 보았을 때 나타나는 표입니다.

    cv 테이블이 초록색으로 변했습니다. 약 21만 건을 가져와서 정렬하기 때문에 앞서 나왔던 100만 건의 경우보다 처리 속도가 상당히 빨라질 듯 합니다. 여기서 21만 건이라는 수치는 MySQL의 예측치이고, 실제로 status = 2인 레코드는 10만 건 정도입니다. 적재된 데이터의 status 컬럼값이 편중되어 있어서 대부분이 status = 2인 상황이라면, 인덱스를 사용하지 않아야 속도가 더 빠르다고 판단되어 Full Table Scan이 수행될 것 같습니다(인덱스 사용법 섹션 참고). 그런 경우라면 ORDER BY에 인덱스를 설정하도록 합시다.

    보충 설명: WHERE 조건에 인덱스 설정

    적재된 데이터의 status 컬럼값이 편중되어 있어서 대부분이 status = 2인 상황이라면, 인덱스를 사용하지 않아야 속도가 더 빠르다고 판단되어 Full Table Scan이 수행될 것 같습니다.

    위 내용을 확인하기 위해 테스트를 했습니다. 테스트는 ANALYZE TABLE cv; 를 실행한 후에 SELECT * FROM cv WHERE status = 2; 를 실행하는 방식으로 진행했습니다. 그런데 cv 테이블의 레코드 수가 100만 건일 때는 대부분이 아니라 모든 레코드를 status = 2로 맞춰놓아도 Full Table Scan이 수행되지 않고 status에 지정된 인덱스가 사용되었습니다. 반면에 레코드 수를 약 1만 건으로 줄이니 동일한 쿼리에서 Full Table Scan이 수행되었습니다. 인덱스 사용법 섹션에서 언급했던 것처럼 행 개수에 따라서도 달라지는 것 같습니다.

    어쨌든, 여기에서 나오는 status = 2처럼 컬럼 값이 한쪽으로 매우 편중되어 있어서 대부분의 행이 조건에 해당될 때는 인덱스를 달지 않는 것이 좋겠습니다.

    ORDER BY 조건에 인덱스 설정

    (앞에서 설정한 인덱스는 DROP)

    아래는 위 VISUAL EXPLAIN을 EXPLAIN으로 보았을 때 나타나는 표입니다.

    이번에는 ORDER가 연두색이 되었습니다. 테이블은 Full Index Scan입니다. 처리 과정을 설명드리겠습니다.

    created_at 인덱스에서 순서대로 레코드를 추출하여 status = 2인지 여부를 확인합니다. 그리고 status = 2인 레코드가 LIMIT 수만큼 발견되었을 때 탐색이 종료될 수 있습니다(created_at에 대해 정렬이 완료되었기 때문). 그래서 예상 취득 레코드 개수도 100개입니다. status = 2인 레코드가 빨리 발견되면 좋겠지만, 마지막까지 발견되지 않으면 인덱스를 전부 읽어야 합니다. status = 2가 드물게 존재하는 경우엔 이런 상황이 벌어지게 되니, status에 인덱스를 설정해서 WHERE로 취득되는 레코드 수를 줄이는 것이 좋을 듯 합니다(개수가 적으면 정렬에 소요되는 비용도 적음). 이 부분은 대충 하는 MySQL 퍼포먼스 튜닝(일본어)에 알기 쉽게 정리되어 있습니다. 참고하시면 좋을 것 같습니다.

    WHERE 조건과 ORDER BY 조건 중 어느 쪽에 인덱스를 지정하는 것이 좋을지는 status가 편중되어 있는 정도를 보고 판단하는 것이 좋겠습니다. 아니면 idx_status 와 idx_created_at 양쪽 모두에 달아 보고 어느 쪽에서 사용되는지를 확인하는 것도 괜찮습니다. 이번 경우에는 양쪽에 지정하니 idx_created_at 가 선택되었습니다. 단, ORDER BY 조건에 인덱스를 지정할 경우, LIMIT 수가 커지면 WHERE 조건에 맞는 레코드를 찾기 위해 많은 행을 읽어야 하는 상황이 벌어집니다. 반면에, WHERE 조건에 지정한 인덱스를 사용하는 경우에는 LIMIT 수가 탐색에 드는 비용에 영향을 미치지 않기 때문에 LIMIT 수가 클 때는 idx_status 가 더 좋습니다. 이번 데이터를 쭉 확인해 보니, 대략 LIMIT 2100 보다 커지면 idx_status 가 사용되었습니다.

    GROUP BY 조건에 인덱스 설정

    (앞에서 설정한 인덱스는 DROP)

    ad_id별로 cv의 수를 확인하는 쿼리입니다. 인덱스가 없는 경우에는 아래 그림처럼 빨간색이 됩니다.

    아래는 위 VISUAL EXPLAIN을 EXPLAIN으로 보았을 때 나타나는 표입니다.

    GROUP BY 조건인 ad_id에 인덱스를 지정하면 아래 그림처럼 GROUP BY가 연두색이 됩니다.

    아래는 위 VISUAL EXPLAIN을 EXPLAIN으로 보았을 때 나타나는 표입니다.

    위 그림과 아래 그림을 비교하면 GROUP 밑에 있었던 tmp table, filesort 가 사라졌습니다.

    GROUP BY 때 왜 인덱스를 사용하는지 설명드리겠습니다. 인덱스를 지정하지 않으면 테이블 전체를 스캔한 후, 각 그룹의 모든 행이 연속적인 상태인 임시 테이블( tmp table )을 생성하여(이때 정렬( filesort )이 필요함), 이 테이블에서 그룹을 찾아내는 처리가 진행됩니다(MySQL 5.6 Reference Manual / GROUP BY Optimization). 위 그림을 보시면 인덱스가 임시 테이블의 역할을 해주어서 이와 같은 처리가 불필요해졌다는 점을 알 수 있습니다.

    다만, GROUP BY 처리는 빨라지는 반면에 테이블 접근은 Full Index Scan이어서 처리 부하가 커지니, WHERE 조건에 인덱스를 지정하는 방법을 검토하는 게 좋겠습니다.

    복합 인덱스 설정

    (앞에서 설정한 인덱스는 DROP)

    인덱스를 설정하여 다시 아래의 SQL을 VISUAL EXPLAIN합니다.

    아래는 위 VISUAL EXPLAIN을 EXPLAIN으로 보았을 때 나타나는 표입니다.

    테이블 접근과 ORDER 모두 초록색으로 되어 있는 바람직한 상태입니다(표 형식의 EXPLAIN과 비교해 봤을 때, VISUAL EXPLAIN은 어떤 부분을 개선했는지 한눈에 볼 수 있다는 점이 좋습니다).

    연습: 더 복잡한 예

    (앞에서 설정한 인덱스는 DROP)

    컨버전 수를 일주일 전부터 카운트하여, 카운트 수가 많은 순서대로 ad 테이블의 레코드를 정렬하는 쿼리를 살펴 보겠습니다. 추출하려는 데이터의 상세 조건은 cv의 status는 1, ad의 type은 2입니다.

    위 쿼리를 VISUAL EXPLAIN하니 아래와 같은 이미지가 나왔습니다.

    아래는 위 VISUAL EXPLAIN을 EXPLAIN으로 보았을 때 나타나는 표입니다.

    조금 복잡해졌는데요. VISUAL EXPLAIN 결과는 왼쪽 아래에서 오른쪽 위 방향으로 처리가 진행되도록 그림이 그려져 있습니다. 따라서, 왼쪽 아래부터 보시면 됩니다. 이 그림을 보고 알 수 있는 점은 다음과 같습니다.

    • JOIN이 nested loop로 처리됨
    • nested loop에 대해서는 아래 참고
        (일본어)

      (아래 내용은 인덱스를 어떻게 지정할 지 고민하면서 시행착오를 겪었던 것을 적은 것인데요. 제 경험을 적은 것일 뿐이고 꼭 이렇게 해야 한다는 의미는 아닙니다. 하나의 예로 봐 주시면 좋겠습니다.)

      위 그림을 보면, 우선 cv 테이블의 Full Table Scan을 중단시키고 싶습니다. 그리고 ad 테이블도 결과가 초록색이고 PRIMARY KEY를 사용하고 있긴 하지만, MySQL은 기본 키에 대한 추가 인덱스를 생성하거나 데이터 자체를 인덱스 로 사용합니까? type이나 end_at으로 ad 테이블 자체에 조건을 걸때는 인덱스로 사용할 수 없어서 속도가 느려질 수밖에 없습니다. 따라서, ad쪽에도 인덱스를 생성하여 결과를 살펴보겠습니다.

      아래와 같은 인덱스를 설정하고 과연 어떤 것이 사용되는지 확인해 보았습니다.

      • cv 테이블
      • idx_status_created_at: (status, created_at)
        • cv 테이블의 작업 범위 결정 조건으로 사용
        • cv에 관한 조건 순으로 지정
        • ad 테이블의 작업 범위 결정 조건으로 사용

        이 상태로 VISUAL EXPLAIN을 실행하면 아래와 같이 나옵니다.

        아래는 위 VISUAL EXPLAIN을 EXPLAIN으로 보았을 때 나타나는 표입니다.

        ad와 cv의 위치가 바뀌는 등 여러 군데가 변경되면서 개선되었습니다. 이 그림을 보고 알 수 있는 점은 다음과 같습니다.

        • ad 테이블이 driving table이 되고 type이나 end_at의 조건을 지정하기 위해 idx_type_end_at 인덱스가 사용됨
        • cv 테이블의 idx_ad_id_status_created_at을 사용하여 ad 테이블에 대응되는 행을 읽음
        • cv에 관한 status나 created_at의 조건이 이 인덱스로 지정되었는지는 알 수 없음
        • 임시 테이블 buffer_result가 삭제되고 GROUP BY의 tmp table도 삭제됨(GROUP BY는 색상도 오렌지로 바뀜)

        임시 테이블인 buffer_result가 삭제된 이유는 GROUP BY 조건이 driving table(이중 루프의 바깥쪽)의 ad.id라서, 미리 정렬한 다음 루프를 실행하면 GROUP BY 조건에 인덱스 절에서 설명한 임시 테이블이 불필요해지기 때문인 것으로 생각됩니다(참고: 실제 사례로 배우는 JOIN(NLJ)이 지연되는 이유와 대처법 / 속도 향상이 어려운 JOIN SQL(일본어)).
        Inner table에서 GROUP BY를 하려면 임시 테이블이 필수로 있어야 합니다. 실제로 인덱스를 설정하기 전 상태(cv가 driving table인 상태)에서 GROUP BY를 inner table의 ad.id가 아닌 cv.ad_id로 하면 임시 테이블이 생성되지 않습니다.

        복합 인덱스를 사용했을 때, 복합 인덱스의 일부만 사용된다면 단일 인덱스를 지정하는 것이 더 좋습니다(예를 들어, cv 테이블에 설정한 인덱스가 ad 테이블과 MySQL은 기본 키에 대한 추가 인덱스를 생성하거나 데이터 자체를 인덱스 로 사용합니까? 대응하는 용도로만 사용되는 경우, 즉 ad_id만 사용되는 경우라면 ad_id에 인덱스를 달면 됨). 따라서, JSON 형식으로 바꿔 used_key_parts 를 확인합니다. VISUAL EXPLAIN 실행 방법 섹션의 개요도에 나와 있는 대로 View Source 를 클릭해서 확인할 수 있습니다.

        아래는 View Source로 확인한 JSON입니다. ad 테이블의 인덱스는 전부 다 사용되고 있으며, cv 테이블의 인덱스의 경우 created_at은 사용되지 않고 ad_id와 status가 사용된다는 점을 알 수 있습니다.
        즉, cv의 인덱스는 ad_id와 status만 있으면 되기 때문에, 나중에 created_at을 포함하지 않는 인덱스를 만들었습니다.

        cv 테이블의 인덱스에서 created_at이 사용되지 않는 이유는, 이번 블로그 포스팅용으로 만든 데이터의 대부분이 created_at 조건을 충족하고 있어서 MySQL이 인덱스 순회보다는 직접 데이터를 보고 판정하는 것이 좋겠다고 판단했기 때문인 것 같습니다.

        그 외에도 여러 인덱스를 설정해 봤는데요. 위의 복합 인덱스 조합(ad 테이블에 type과 end_at, cv 테이블에 ad_id와 status)이 가장 속도가 빨랐습니다.
        인덱스를 지정한 후 SQL의 duration은 약 0.007sec가 되었으며, 인덱스 설정 전과 비교하면 약 40분의 1로 단축되었습니다.

        참고로 같은 결과를 얻기 위해 서브 쿼리를 사용한 SQL도 테스트해 봤는데요. VISUAL EXPLAIN으로 보면 그림이 복잡하고 실행 시간도 오래 걸렸습니다.

        MySQL Workbench의 VISUAL EXPLAIN을 사용해서 인덱스의 동작을 확인해 보았습니다.

        VISUAL EXPLAIN은 직관적으로 이해하기 쉬워서 인덱스를 어떻게 지정해야 할지 고민될 때 사용하면 편리한 것 같습니다. 또한, 인덱스 뿐 아니라 복잡한 쿼리를 어떻게 작성해야 할지 고민될 때도, 쿼리를 작성한 뒤 VISUAL EXPLAIN 결과를 확인하여 임시 테이블이 지나치게 많이 생성되지는 않는지 등을 체크하는 용도로 활용할 수 있을 것 같습니다.

        저는 이번에 VISUAL EXPLAIN을 알아보면서, SQL을 사용할 때 MySQL 내부에서 어떤 처리가 진행되는지 공부하는 데에도 도움이 되어서 좋았습니다. 꼭 써 보시기 바랍니다!

        DJIA 지수를 상회하는 10 Top 사유

        다우 존스 산업 평균 지수 (Dow Jones Industrial Average)를 바이너리 옵션으로 거래하는 것이 왜 직접 거래하는 것보다 낫지 만 베테랑 시장의 상인의 통찰력.

        DJIA 지수를 상회하는 10 Top 사유

        전자 무역 지수 기금

        1) 바이너리 옵션은 투자자에게 정규 DJIA. 그들이 제공하는 한 가지 점은 자본 이득을 창출하기 위해 다우 존스에 의존하지 않아도됩니다.

        정기적 인 거래에서 주식은 실질적인 투자 수익을 올릴 수 있어야하기 때문에 투자자는 시장의 자비에 머물러 있습니다. 사람들이 어떤 이유로 든 주식과 자산에서 돈을 꺼내기 시작하면, 머물러있는 사람들이 갑자기 돈을 잃을 것입니다.

        물론, 매일 매일 많은 주식이오고가는 것을 볼 수 있지만, 바이너리 옵션을 사용하면 추세가 아래쪽 일지라도 투자 할 수 있습니다. 트렌드가 올바르게 나타난다.

        다음은 왜 다우 존스 인덱스를 바이너리 옵션으로 거래해야하는지에 대한 10 가지 이유입니다 :

        2) 거래 바이너리 옵션의 진입에 대한 쉽고 낮은 진입 장벽은 많은 돈을 들이지 않고도 DJIA에 입장 할 수 있기 때문에 시간과 돈을 투자 할 수있는 좋은 방법입니다.

        아시다시피, 시장에서 거래를하려면 많은 돈이 들기 때문에 대부분의 사람들에게는없는 돈입니다. 이것이 대부분의 사람들이 거래 할 수 없거나 거래 할 수없는 이유 중 하나입니다. 일부 주식은 수십억 달러의 비용이 들기 때문에 대부분의 사람들은 투자자가되기 위해 돈을 벌 수는 없습니다.

        실제로, 대부분의 사람들의 꿈 중 하나는 마침내 어느 날을 투자 할 수있는 충분한 돈을 갖는 것입니다. 그러나 바이너리 옵션을 사용하면 시작할 때 부자가 될 필요가 없습니다. 누구나 할 수 있습니다. 기껏해야 시작하는 데 단지 몇 달러의 비용이 듭니다. 당신은 심지어 약간 주위에 그것을 퍼 뜨리고 단 몇 분 안에 당신의 투자에 들어갈 수 있습니다.

        3) 포트폴리오를 다양 화하는 것은 모든 사람이 투자 할 때하려고하는 것입니다. 이런 식으로 위험을 최소화하기 때문입니다. 당신이 무언가를 잃는다면, 당신은 그것을 잃지 않을 것입니다. 하지만 다우 존스 시장은 극도로 어렵습니다.

        그리고 왜? 그렇게하기에는 많은 돈이 들기 때문입니다. 대부분의 사람들은 극소수의 회사에만 2 개의 자산을 가지고 있습니다. 그들은 그 이상을 감당할 여유가 없습니다.

        그러나 바이너리 옵션을 사용하면 원하는만큼 자신을 넓힐 수 있습니다. 옵션으로 투자 할 때마다 단지 몇 달러의 비용이 들기 때문에 20 달러라면 6 대 기업에 투자 할 수 있으며 정기적 인 투자보다 훨씬 많은 투자 수익을 올릴 수 있습니다.

        이는 바이너리 옵션이 전반적으로 투자자에게 더 좋고 나머지 전문가들과 마찬가지로 시도해야하는 이유 중 하나입니다.

        4) 시장을 불문하고 추세를 예측하는 것은 어렵습니다. 그러나 한 가지 확실한 사실은 오랜 기간 동안 한 회사에서 하나의 단일 추세를 예측해야하는 것보다 전반적인 추세를 예측하는 것이 훨씬 쉽습니다.

        무역 가중 지수

        그렇기 때문에 바이너리 옵션에 투자하는 것이 더 좋으며 왜 지난 수십 년 동안 많은 전문가들이 그렇게 해왔습니다. 그 이유는 장기간에 비해 때로는 수분 만에 쉽게 트렌드를 볼 수 있기 때문입니다.

        몇 년 동안의 투자는 영원한 것이 될 수 있으며 모든 일이 발생할 수 있습니다. 그리고 무언가가 일어날 때, 당신의 돈이 더 자주 보지 않는 것을 볼 것 같습니다. 투자는 위험한 사업이며 다우 존스 지수의 위험을 최소화하기 위해 바이너리 옵션이 만들어졌습니다.

        그것은 전문 투자자가 전문 투자자를 위해 만들어 졌기 때문에 매우 인기가 있습니다.

        5) DJIA에 대한 투자는 때로는 매우 위험합니다. 바이너리 옵션에 투자하는 것보다 훨씬 위험합니다. 왜 그런데? 글쎄요, 이유 중 하나는 다우 존스 지수에 투자하면 뭔가 잘못되면 수백 또는 수천 달러를 잃을 수 있다는 것입니다.

        그리고 투자 할 때, 일이 잘못되거나 잘못 될 수 있습니다. 문제는 : 뭔가 잘못되거나 수백 달러 밖에 안되면 수백이나 수천을 잃을까요? 그리고 다음 질문이 바이너리 옵션에 투자하는 것이 얼마나되는지에 관한 것이라면, IQ Option단순히 시장에서 거래하는 것보다 훨씬 많은 ROI를 얻을 수 있습니다. 사실, 다우 존스의 자산 거래 수익률 (%)을 바이너리 옵션에서 보지 못하게 될 것입니다. 이는 무역 회사를 비롯한 모든 사람들의 위험을 최소화하기 위해 만들어진 시스템이기 때문입니다.

        6) 전문 투자자가 만든 시스템을 사용하는 것은 어떨까요? 사실 바이너리 옵션은 전문가를 묶는 위험 및 거래 규정을 최소화하기위한 수단으로 만들어졌습니다. 전문 투자자를 위해 전문 투자자가 만들었습니다.

        수십 년 동안 전문 투자자 만이 다우 존스 지수 대신 바이너리 옵션으로 거래 할 수있었습니다. 수십 년 동안, 그들은 그것을 스스로 지켰다. 그리고 최근에야 일반 대중에게 공개되었습니다.

        하지만 이것은 또한 이점을 가지고 있습니다. 왜냐하면 여러분은 그것이 대중에게 "공개"되기 전에 수십 년 동안 시스템으로 테스트되고 시도되어 졌음을 알기 때문입니다. 이러한 테스트를 거친 시스템이 최고의 재정적 기대와 기준에 부합한다면, 다음과 같은 수준의 전문성을 다룰 수 있다는 것을 알고 있습니다. IQ Option 그것은 당신이 투자하는데 사용할 수있는 거의 모든 다른 시스템에서 타의 추종을 불허합니다.

        7) 최고의 바이너리 거래 플랫폼에서 거래 당 투자 수익이 DJIA보다 훨씬 높아집니다. 바이너리 옵션은 투자 당 최대 80 + %의 막대한 수익을 제공합니다. 다우 존스 (Dow Jones)의 자산 수익에 대한 ROI를 결코 볼 수는 없습니다.

        투자는 재미 있지만 돈벌이에 관한 것이므로 거래 당 많은 돈을 벌고 싶습니다. 그렇지 않다면 왜 첫 번째 장소에 투자해야합니까? 그러나 다우 존스 지수에서는 이러한 종류의 수익을 얻을 수 없습니다.

        그러나 바이너리 옵션 거래시 DJIA에서 거래되는 자산에 돈을 벌 수 있습니다. IQ Option. 이는 자산 자체가 아니라 자산에 대한 옵션을 거래하기 때문입니다.

        당신은 훨씬 덜 위험 해집니다. 그것이 바로 모든 종류의 상인이 듣기를 원하는 것입니다. 그래서 지난 몇 년 동안 바이너리 옵션으로 거래하는 것이 인기가되었습니다.

        8) DJIA 거래보다 쉽습니다. 사실, 너무 쉽기 때문에 설치하는 데 MySQL은 기본 키에 대한 추가 인덱스를 생성하거나 데이터 자체를 인덱스 로 사용합니까? 약 1 분 밖에 걸리지 않습니다. IQ Option. 새로운 IQ Option 거래자는 단순히 첫 페이지로 이동하여 계정을 만들고 즉시 바이너리 옵션으로 거래를 시작할 수 있습니다. 그리고 테스트를 위해 여기 저기서도 달러를 거래하고 싶지 않다면, 단순히 무료 테스트 근거를 활용하지 않는 것이 어떻습니까?

        누구나 "돈을 벌어라"와 교역하면 돈을 벌기 전에 어떻게 돈을 벌 수 있는지 알아볼 수 있습니다. 그것은 당신에게 아무런 댓가를 치르지 않을 것이며 다우 존스 지수에 대한 거래에 대해서는 말할 수 없습니다.

        결국 시스템을 이해할 때까지 재판을 실행할 수있을 때 실제 돈으로 시도해 보지 못한 것을 거래하기 시작하는 이유는 무엇입니까? 결국 돈을 잃을 수는 없습니다. 너는 그걸 만들거야.

        9) 이진 옵션은 일이 잘못 될 때 투자를 중단하는 가장 좋은 방법입니다. 나는 설명 할 것이다 : 당신이 다우 존스를 거래 할 때 무언가가 잘못 될 때, 당신은 많은 돈을 잃을 수있다. 우리는 수천, 심지어는 수만 달러에 이르는 이야기를하고 있습니다.

        당연히 사람들은 그것에 대해 생각하기를 좋아하지 않지만 그것은 사실입니다. 투자는 위험한 사업입니다. 그러나 바이너리 옵션을 사용하면 DJIA 자산을 몇 달러 만 교환 할 수 있습니다.

        그리고 사실은 한 번에 한 바구니에 모든 달걀을 넣지 않고 있다는 것입니다. 한 번에 몇 달러를 거래하고 있습니다. 뭔가 잘못되면 잃을 수있는 것을 정확히 알고 있고, 미리 알 수 있습니다.

        바이너리 옵션에 투자 할 때마다 집, 자동차 또는 셔츠를 위험에 빠뜨리지 않습니다. 투자가 나 빠지면 당일 치기도하고 너무 걱정하지 않아도된다는 뜻입니다.

        10) DJIA에 대한 투자는 쉽지 않습니다. 실제로, 그것은 복잡합니다. 많은 규정과 투자에 대한 많은 문제가 있습니다. 따라서 투자를 주로하는 전문가 또는 위험 요소를 실제로 모르는 사람들입니다.

        이것이 바이너리 옵션이 만들어진 이유입니다. 모든 것을 해결하고 프로세스를 간소화하고 위험을 훨씬 낮추려고 시도하는 것입니다. 하루에 백 달러를 잃어 버릴지라도, 여기저기서 몇 달러를 잃어 버릴 위험은 거의 없습니다.

        그것은 다우 존스 지수에서 대부분의 주식 가격을 매수하지 않을 것입니다. 그러나 바이너리 옵션을 사용하면 원하는 방식으로 하루 종일 여러 회사에 많은 투자를 할 수 있습니다. 프로세스가 매우 간단해서 누구나 할 수 있기 때문에 복잡하지 않습니다. 많은 사람들이 바이너리 옵션에 투자하기로 결정한 또 다른 이유입니다. IQ Option.

        면책 조항: 선물, 주식 및 옵션 거래는 손실 위험이 크며 모든 투자자에게 적합하지 않습니다. 선물, 주식 및 옵션의 평가는 변동될 수 있으며 결과적으로 고객은 원래의 투자보다 많은 손실을 입을 수 있습니다. 계절적 및 지정 학적 사건의 영향은 이미 시장 가격에 반영되어 있습니다. 선물 거래의 활용도가 높다는 것은 작은 시장 움직임이 거래 계좌에 큰 영향을 미치며 큰 손실을 초래하거나 큰 이익을 가져올 수 있음을 의미합니다.

        시장이 당신에 대해 움직인다면, 귀하는 귀하가 귀하의 계좌에 입금 한 금액보다 많은 손실을 입을 수 있습니다. 귀하가 사용하는 모든 위험과 재정적 자원과 선택한 거래 시스템에 대한 책임은 귀하에게 있습니다. 귀하가 진입하는 거래의 본질과 귀하의 손실 노출 정도를 완전히 이해하지 않는 한 거래에 참여해서는 안됩니다. 이러한 위험을 완전히 이해하지 못하면 재정 고문으로부터 독립적 인 자문을 구해야합니다.

        인덱스 바이너리

        돌다리 (620)
        고양이 모험가 심심이 추천흡수기

        출석일수 : 6049일 | LV.120

        Exp. 88%

        추천 0 | 조회 626 | 비추력 29710

        일시 2022.09.07 (15:13:25)

        이미 품절된 상품이 존재 합니다

        • [코토부키야] 크로스 프레임 걸 가오가이가 재판
        • [반다이] 건담베이스 상하이점 신작 건프라 전시 이미지
        • [건X 베이스] 추석 연후 기간 영업시간 안내
        • HG 1/72 경계전기 웨폰세트 하비재팬 부록 MySQL은 기본 키에 대한 추가 인덱스를 생성하거나 데이터 자체를 인덱스 로 사용합니까? 버전 조립 설명서 + 작례
        • [굿 스마일] MODEROID 갓 Σ & 얼티밋 그라비온 샘플 사진
        • [맥스팩토리] GODZ ORDER 유리 갓버스터 박스 샘플 이미지
        • [웨이브] VF-171EX 나이트메어 플러스 EX [알토기]
        • [아카데미 과학] 독일 구축전차 야크트판터 G1
        • SMP AD 킹 엑스카이저 박스아트
        • HG MySQL은 기본 키에 대한 추가 인덱스를 생성하거나 데이터 자체를 인덱스 로 사용합니까? 1/144 짐 슬렛거 탑승기 추가 이미지
        • [코토부키야] 헥사기어 루크 레프티 & 3mm 부스트 이펙트 조합 작례 소개
        • [반다이] 30MM 9월 신작 공식 이미지 추가
        • HGAC 1/144 셴롱 건담 공식 이미지 / 박스 아트
        • [건X 베이스] 2022년 추석 이벤트
        • [반다이] 건담 수성의 마녀 오프닝 테마 축복+건프라 한정판
        • [코토부키야] 경시청 07식-Ⅲ형 특수차량 순찰대 패트 낫친 샘플 사진

        게시판 인기 순위

        신설 게시판

        인기 검색어

        루리웹닷컴 | 서울시 송파구 올림픽로35가길 10 B-602 | 등록번호 서울 아02156 | 발행인 박병욱 | 편집인 이장원 | 등록일 2012.06.13 | 청소년보호책임자 진인환


0 개 댓글

답장을 남겨주세요