source

MySQL은 단일 쿼리에 여러 인덱스를 사용할 수 있습니까?

gigabyte 2022. 11. 28. 21:13
반응형

MySQL은 단일 쿼리에 여러 인덱스를 사용할 수 있습니까?

예를 들어 여러 개의 열이 있는 테이블을 상상해 보십시오.id, a, b, c, d, e저는 주로id그러나 클라이언트 앱에는 열의 하위 집합에 대해 다양한 조건을 사용하는 여러 쿼리가 있습니다.

MySQL이 여러 열에 여러 WHERE 조건이 있는 단일 테이블에서 쿼리를 실행할 때 서로 다른 열에 작성된 인덱스를 실제로 사용할 수 있습니까?또는 가능한 모든 쿼리에 대해 다중 열 인덱스를 만드는 방법밖에 없습니다.

예, MySQL은 단일 쿼리에 여러 인덱스를 사용할 수 있습니다.옵티마이저는 쿼리에 도움이 되는 인덱스를 결정합니다.사용할 수 있습니다.EXPLAINMySQL이 문을 실행하는 방법에 대한 정보를 가져옵니다.다음과 같은 힌트를 사용하여 인덱스를 추가하거나 무시할 수 있습니다.

SELECT * FROM t1 USE INDEX (i1) IGNORE INDEX FOR ORDER BY (i2) ORDER BY a;

MySQL이 인덱스를 사용하는 방법에 대해 자세히 읽어보실 것을 제안합니다.

몇 가지 발췌만 하면 됩니다.

여러 인덱스 중에서 선택할 수 있는 경우 MySQL은 일반적으로 행 수가 가장 적은 인덱스를 사용합니다.

col1 및 col2에 여러 열 인덱스가 있는 경우 적절한 행을 직접 가져올 수 있습니다.col1과 col2에 별도의 단일 열 인덱스가 존재하는 경우 옵티마이저는 인덱스 병합 최적화(섹션 8.2.1.4 "Index Merge Optimization" 참조)를 사용하거나 행이 적은 인덱스를 결정하고 해당 인덱스를 사용하여 행을 가져오는 가장 제한적인 인덱스를 찾으려고 시도합니다.

일반적으로 MySQL은 지정된 쿼리에서 테이블 참조당 하나의 인덱스를 사용할 수 있습니다.그러나 MySQL의 보다 최신 버전에서는 v-in-in-in-in-in-in-in-in-in-in-in-inindex merge를 실행하여 MySQL이 테이블당 여러 인덱스를 사용할 수 있도록 할 수 있습니다.

http://openquery.com/blog/mysql-50-index-merge-using-multiple-indexes

Mysql은 인덱스 병합을 사용하여 두 인덱스의 결과를 병합할 수 있습니다.하지만 이것은 mysql의 바람직한 방법이 아닙니다.쿼리 실행이 최적화되면 두 개의 인덱스를 사용합니다.쿼리 개발자가 복합 인덱스를 작성하기 위한 힌트이기도 합니다.

인덱스 머지는 결코 복합 인덱스와 동등하지 않습니다.여기 슈워츠 남작의 책에서 발췌한 것이 있습니다.

인덱스 병합 전략은 때때로 매우 잘 작동하지만 실제로는 인덱스가 제대로 지정되지 않은 테이블을 나타내는 경우가 더 많습니다.

• 서버가 인덱스(일반적으로 AND 조건의 경우)를 교차하는 경우, 일반적으로 여러 인덱스를 결합해야 하는 것이 아니라 모든 관련 열을 포함하는 단일 인덱스가 필요합니다.
• 서버가 인덱스를 결합할 때(통상 OR 조건의 경우), 알고리즘의 버퍼링, 정렬 및 Marge 조작에 대량의 CPU 및 메모리 리소스가 사용되는 경우가 있습니다.일부 인덱스가 매우 선택적이지 않은 경우 특히 그렇습니다. 따라서 검색에서는 병합 작업에 많은 행을 반환합니다.

  • ★★SELECT- 생각해 보세요 ---------------------------------------------------------UNIONtable 등 는 개별적으로 되어 있습니다서브쿼리, derived table은 --subquery, derived table 입니다.즉, 각각 다른 인덱스를 사용할 수 있습니다.
  • , 하나.SELECT 는, 「인덱스 머지」라고 불리는 복수의 인덱스를 사용할 수 있습니다.이것은 거의 사용되지 않습니다.
  • ?EXPLAIN.Index merge (intersect)교차된 인덱스에서 사용되는 열을 포함하는 복합 인덱스를 사용하면 거의 항상 개선할 수 있습니다.
  • Index merge (union)경우에 따라서는 (비활성화)에 사용됩니다.OR이러한 사항은 쿼리를 다시 작성하여 개선할 수 있습니다.UNION 개 중 한 개SELECTs.

언급URL : https://stackoverflow.com/questions/12222630/can-mysql-use-multiple-indexes-for-a-single-query

반응형