반응형
다음 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
해당 코드로 행을 조회해야 합니다. 테넌트 테이블이기 때문에 다음과 같이 조회하겠습니다.
select * from myTable where tenant_id = 1 and code = 1
;특정 코드를 검색하는 것 외에도 다른 필터에는 항상 두 개의 상태 열 "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';
- "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';
- 열 value_a와 value_b는 항상 ">=" 또는 "<="를 사용하여 비교됩니다.
각각의 사건을 개별적으로 찾아보면, 저는 다음과 같이 생각합니다.
- tenant_id 및 코드의 복합 인덱스
- "status_a" 열과 "status_b" 열이 색인화되어야 하는지 잘 모르겠습니다(0과 1만).("tenant_id", "status_a", "param_a") 및 ("tenant_id", "status_b", "param_a")의 인덱스입니다.
- 인덱스 on("tenant_id", "status_a", "param_c", "param_b", "param_a") 및 ("tenant_id", "status_b", "param_s", "param_c", "param_a")
- 값 열의 개별 인덱스
그러나 이를 설정한 후에는 인덱스가 너무 많은 것처럼 느껴집니다(그런 것이 있습니까?).
쿼리 #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
반응형
'code' 카테고리의 다른 글
자신의 모든 하위 보기를 제거하는 가장 좋은 방법은 무엇입니까? (0) | 2023.08.21 |
---|---|
아약스에서 c# mvc로 intarray를 어떻게 보낼 수 있습니까? (0) | 2023.08.21 |
양식 없이 파일 업로드 (0) | 2023.08.21 |
각도 4 img src를 찾을 수 없습니다. (0) | 2023.08.16 |
오류 1064(42000):SQL 구문에 오류가 있습니다. MySQL 서버 버전에 해당하는 설명서에서 올바른 구문을 사용할 수 있는지 확인하십시오. (0) | 2023.08.16 |