code

다음 MariaDB 테이블을 어떻게 인덱싱해야 합니까?

starcafe 2023. 8. 21. 21:27
반응형

다음 MariaDB 테이블을 어떻게 인덱싱해야 합니까?

테넌트 데이터를 저장할 샘플 테이블이 있는데 인덱싱하는 방법을 잘 모르겠습니다.데이터베이스 복합/복합 인덱스에 대한 내용을 읽고 데이터를 쿼리하는 방법에 따라 다음과 같은 내용을 생각해 냈습니다.

검정 테이블의 행 수는 2.396.500이며 다음과 같은 열이 있습니다.

  • tenant_id | 서명되지 않은 BIGINT
  • 코드 | 서명되지 않은 BIGINT
  • status_a | 서명되지 않은 TINYINT (0 또는 1)
  • status_b | 서명되지 않은 TINYINT (0 또는 1)
  • param_a | VARCHAR(100)
  • param_s | VARCHAR(100)
  • param_c | VARCHAR(100)
  • param_b | VARCHAR(100)
  • value_a | 부호 없는 int
  • value_b | 부호 없는 int
  1. 해당 코드로 행을 조회해야 합니다. 테넌트 테이블이기 때문에 다음과 같이 조회하겠습니다.select * from myTable where tenant_id = 1 and code = 1;

  2. 특정 코드를 검색하는 것 외에도 다른 필터에는 항상 두 개의 상태 열 "status_a"와 "status_b" 및 "param_a" 중 하나가 포함될 수 있습니다.따라서 쿼리는 다음과 같습니다.

select * from mytable where tenant_id = 1 and status_a = 1;
select * from mytable where tenant_id = 1 and status_b = 1;
select * from mytable where tenant_id = 1 and status_a = 1 and param_a = 'stuff';
select * from mytable where tenant_id = 1 and status_b = 1 and param_a = 'stuff';
  1. "param_s", "param_c" 및 "param_b" 열은 앱 규칙으로 인해 서로 종속되어 있습니다."param_b"를 쿼리하는 경우 "param_c"가 항상 존재합니다.파라미터 "param_b"를 쿼리하는 경우 "param_s"가 항상 존재합니다.쿼리는 다음과 같아야 합니다.
select * from mytable where tenant_id = 1 and status_a = 1 and param_s = 'stuff_s' and param_c = 'stuff_c' and param_b = 'stuff_b' and param_a = 'stuff_a';

select * from mytable where tenant_id = 1 and status_a = 1 and param_s = 'stuff_s' and param_c = 'stuff_c' and param_b = 'stuff_b';

select * from mytable where tenant_id = 1 and status_a = 1 and param_s = 'stuff_s' and param_c = 'stuff_c' and param_a = 'stuff_a';
  1. 열 value_a와 value_b는 항상 ">=" 또는 "<="를 사용하여 비교됩니다.

각각의 사건을 개별적으로 찾아보면, 저는 다음과 같이 생각합니다.

  1. tenant_id 및 코드의 복합 인덱스
  2. "status_a" 열과 "status_b" 열이 색인화되어야 하는지 잘 모르겠습니다(0과 1만).("tenant_id", "status_a", "param_a") 및 ("tenant_id", "status_b", "param_a")의 인덱스입니다.
  3. 인덱스 on("tenant_id", "status_a", "param_c", "param_b", "param_a") 및 ("tenant_id", "status_b", "param_s", "param_c", "param_a")
  4. 값 열의 개별 인덱스

그러나 이를 설정한 후에는 인덱스가 너무 많은 것처럼 느껴집니다(그런 것이 있습니까?).

쿼리 #1의 경우:

select * from myTable where tenant_id = 1 and code = 1;

인덱스를 생성할 수 있습니다.

create index ix1 on myTable (tenant_id, code);

섹션 #2의 쿼리:

select * from mytable where tenant_id = 1 and status_a = 1;
select * from mytable where tenant_id = 1 and status_b = 1;
select * from mytable where tenant_id = 1 and status_a = 1 and param_a = 'stuff';
select * from mytable where tenant_id = 1 and status_b = 1 and param_a = 'stuff';

인덱스를 생성할 수 있습니다.

create index ix2 on mytable (tenant_id, status_a, param_a);
create index ix3 on mytable (tenant_id, status_b, param_a); 

#3 섹션의 쿼리:

select * from mytable where tenant_id = 1 and status_a = 1 and param_s = 'stuff_s' and param_c = 'stuff_c' and param_b = 'stuff_b' and param_a = 'stuff_a';
select * from mytable where tenant_id = 1 and status_a = 1 and param_s = 'stuff_s' and param_c = 'stuff_c' and param_b = 'stuff_b';
select * from mytable where tenant_id = 1 and status_a = 1 and param_s = 'stuff_s' and param_c = 'stuff_c' and param_a = 'stuff_a';

나는 다소 일반적인 색인을 만들 것입니다.

create index ix4 on myTable (tenant_id, status_a, param_s, param_c);

특정 쿼리에 따라 달라지는 불평등의 경우.

언급URL : https://stackoverflow.com/questions/70931490/how-should-i-index-the-following-mariadb-table

반응형