쿼리 성능 문제-20 조 이상의 레코드가있는 테이블에 인덱스가있는 경우에도 select 문

shashi27

3 개의 테이블에서 레코드를 선택해야하는 3 개의 테이블이 있습니다. 즉 162161 개의 레코드가있는 계정 Account_Types 10761247 개의 레코드가있는 트랜잭션

아래는 테이블 구조입니다.

업무

id bigint (20) unsigned NO PRI auto_increment transfer_number bigint (20) unsigned YES MUL
debit_credit varchar (255) NO MUL
fund_type varchar (255) NO MUL
fund_id bigint (20) unsigned YES MUL
통화 varchar (255) NO
amount decimal (20, 2) NO MUL 0
설명 텍스트 NO
other_type varchar (255) NO
other_id bigint (20) unsigned YES
transaction_type varchar (255) NO
accounts_receivable int (1) unsigned NO 0
transaction_status varchar (255) NO MUL
creation_date datetime NO 0000-00-00 00:00:00 execution_date datetime 아니오 MUL 0000-00-00 00:00:00 api int (1) YES
claim_id char (8) YES

계좌

id bigint (20) unsigned NO PRI auto_increment user_id bigint (20) unsigned YES MUL
account_number varchar (255) NO UNI
type_id bigint (20) unsigned YES MUL
설명 varchar (255) NO
Commission_acc_id bigint (20) unsigned YES MUL
allow_debit varchar (255) ) NO
allow_credit varchar (255) NO
account_status varchar (255) NO MUL
creation_date datetime NO 0000-00-00 00:00:00

ACCOUNT_TYPES

id bigint(20) unsigned NO PRI auto_increment description varchar(255) NO MUL
currency varchar(255) NO MUL
monthly_fee_amount double NO 0
monthly_fee_description varchar(255) NO
yearly_fee_amount double NO 0
yearly_fee_description varchar(255) NO
generate_interests varchar(255) NO
interest_rate double NO 0
interest_payout_period varchar(255) NO
interest_payout_day char(2) NO
interest_payout_month char(2) NO
interest_payout_hour char(2) NO
interest_based_on varchar(255) NO
interest_based_on_period varchar(255) NO
interest_minimum_balance double NO 0
generate_commissions varchar(255) NO
commission_rate double NO 0
Commission_payout_period varchar (255) NO
커미션 _payout_day char (2) NO
커미션 _payout_month char (2) NO
커미션 _payout_hour char (2) NO
커미션 _ 기반 _on varchar (255) NO
커미션 _ 기반 _on_period varchar (255) NO 커미션 _ 최소 _ 잔액
두 배 NO 0

아래는 아래 쿼리를 사용하는 쿼리입니다.

SELECT SUM(t.amount) AS total_credit 
FROM    account_types at, 
        accounts a, 
        transactions t 
WHERE   at.currency          = var_currency 
AND     at.id                = a.type_id 
AND     (a.account_status    = 'active' 
        OR a.account_status  = 'blocked')
AND     a.id                 = t.fund_id 
AND     t.debit_credit       = var_debit_credit 
AND     t.fund_type          = 'account'
AND     t.transaction_status = 'executed';

출력을 얻는 데 20 분 이상 걸립니다.

관리의 전제 조건-트랜잭션 테이블이므로 테이블을 보관할 수 없으므로 합계를 계산하기위한 레코드가 필요하며 하드웨어 변경은 허용되지 않습니다. 테이블에 인덱스도 있습니다. 설명에서 MUL로 표시됩니다.

빌렘 렌 제마

먼저 트랜잭션 테이블에서 필요한 모든 열에 인덱스를 추가해보십시오.

ALTER TABLE transaction
ADD INDEX `DebCredFundTypeTransStatus`
(`fund_id`,`debit_credit`,`fund_type`,`transaction_status`,`amount`)

이렇게하면 데이터를 위해 테이블 ​​자체로 이동할 필요없이이 테이블에 대한 조회 수를이 인덱스로만 줄일 수 있습니다. amount색인의 가장 오른쪽 부분 이 중요합니다 .

a.account_statusat.currency액세스해야하는 각 테이블의 유일한 열 (모든 인덱스의 맨 오른쪽 부분에 포함 된 기본 키 제외) 이므로 해당 열에 문제가 없습니다.

다음으로 큰 병목 현상은 OR 절입니다. 결과를 주문하지 않기 때문에 UNION ALL을 쉽게 슬랩하고 원하는 각 값에 대해 두 번 실행할 수 account_status있습니다.

SELECT SUM(t.amount) AS total_credit 
FROM    account_types at, 
        accounts a, 
        transactions t 
WHERE   at.currency          = var_currency 
AND     at.id                = a.type_id 
AND     a.account_status    = 'active'
AND     a.id                 = t.fund_id 
AND     t.debit_credit       = var_debit_credit 
AND     t.fund_type          = 'account'
AND     t.transaction_status = 'executed'

UNION ALL

SELECT SUM(t.amount) AS total_credit 
FROM    account_types at, 
        accounts a, 
        transactions t 
WHERE   at.currency          = var_currency 
AND     at.id                = a.type_id 
AND     a.account_status  = 'blocked'
AND     a.id                 = t.fund_id 
AND     t.debit_credit       = var_debit_credit 
AND     t.fund_type          = 'account'
AND     t.transaction_status = 'executed';

아마도 가장 간단하고 생산적인 변경 일 것입니다. 그것을 시도하고 상황이 충분히 개선되었는지 확인하십시오. 그렇지 않은 경우 적용 할 수있는 다른 최적화가 있습니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

쿼리를 조인 한 간단한 두 테이블의 MySQL 성능 문제

분류에서Dev

varchar 키에 여러 테이블 조인-MYSQL : 성능 문제

분류에서Dev

다른 쿼리의 결과로 테이블 이름이있는 select 문에서 데이터 가져 오기

분류에서Dev

20m 레코드가있는 테이블에서 Date = DD.MM.YYYY 인 경우 삭제

분류에서Dev

aspx에 대한 지시문의 제목 속성이 조건부 상태가되도록 뒤에있는 코드에서 참조 될 수 있습니까?

분류에서Dev

조인이 작동하는 select 문에 PostgreSQL 하위 쿼리 (비논리적) 버그가 있습니까?

분류에서Dev

조인이 작동하는 select 문에 PostgreSQL 하위 쿼리 (비논리적) 버그가 있습니까?

분류에서Dev

하위 쿼리가있는 MYSQL 쿼리의 성능 문제

분류에서Dev

SQL 쿼리에서 여러 조인 된 테이블의 성능을 향상시키는 방법

분류에서Dev

조인을 사용하여 테이블 2 및 3의 테이블 1에 데이터를 추가 할 때 MySQl 쿼리 문제

분류에서Dev

테이블에서 다음 N 개의 레코드를 가져 오는 SQL 쿼리 문자열

분류에서Dev

성능 문제를위한 조인에서 임시 테이블 사용

분류에서Dev

쿼리의 세 번째 테이블에서 값을 가져 오는 MySQL 문제

분류에서Dev

백만 개의 레코드가있는 인덱스에서 dynamodb 쿼리

분류에서Dev

4 테이블에 대한 내부 조인 쿼리 구문

분류에서Dev

서브 쿼리 조건에서 두 테이블 결합 문제

분류에서Dev

SQL 쿼리 성능 문제 전체 테이블 스캔

분류에서Dev

SQL 쿼리 성능 문제 전체 테이블 스캔

분류에서Dev

Mongoose의 배열 필드에 조건이있는 문서 쿼리

분류에서Dev

Android의 SQLite에서 테이블 생성에 문제가 있음

분류에서Dev

테이블 생성시 제약 조건 또는 인덱스 SQL 문제

분류에서Dev

2 SELECT 문을 가입하지만, 테이블 A에서 조건이 테이블 B에 충족되는 경우에만 출력을 표시하는 방법

분류에서Dev

Rails : has_many : through 연관에있는 조인 테이블의 여러 새 레코드에 속성 값 추가

분류에서Dev

EXISTS 하위 쿼리를 포함하는 모든 MySQL SELECT 쿼리와 ON이있는 LEFT JOIN에서 ON이 외부 SELECT를 참조하는 문제

분류에서Dev

Postgresql 12 : 중복 연산자와 매우 동일한 테이블에 대한 조인의 성능 문제

분류에서Dev

500 개 미만의 레코드가있는 테이블 만 스캔하도록 SQL 쿼리 제한

분류에서Dev

하나의 쿼리에서 문제가있는 하위 쿼리

분류에서Dev

어떤 상황에서 부모 테이블에 자식 테이블의 활성 외래 키가 참조하는 레코드가 누락 될 수 있습니까?

분류에서Dev

이 쿼리가 Select 문에 조인하려고 시도하는 동안 mysql이 잘못되었습니다.

Related 관련 기사

  1. 1

    쿼리를 조인 한 간단한 두 테이블의 MySQL 성능 문제

  2. 2

    varchar 키에 여러 테이블 조인-MYSQL : 성능 문제

  3. 3

    다른 쿼리의 결과로 테이블 이름이있는 select 문에서 데이터 가져 오기

  4. 4

    20m 레코드가있는 테이블에서 Date = DD.MM.YYYY 인 경우 삭제

  5. 5

    aspx에 대한 지시문의 제목 속성이 조건부 상태가되도록 뒤에있는 코드에서 참조 될 수 있습니까?

  6. 6

    조인이 작동하는 select 문에 PostgreSQL 하위 쿼리 (비논리적) 버그가 있습니까?

  7. 7

    조인이 작동하는 select 문에 PostgreSQL 하위 쿼리 (비논리적) 버그가 있습니까?

  8. 8

    하위 쿼리가있는 MYSQL 쿼리의 성능 문제

  9. 9

    SQL 쿼리에서 여러 조인 된 테이블의 성능을 향상시키는 방법

  10. 10

    조인을 사용하여 테이블 2 및 3의 테이블 1에 데이터를 추가 할 때 MySQl 쿼리 문제

  11. 11

    테이블에서 다음 N 개의 레코드를 가져 오는 SQL 쿼리 문자열

  12. 12

    성능 문제를위한 조인에서 임시 테이블 사용

  13. 13

    쿼리의 세 번째 테이블에서 값을 가져 오는 MySQL 문제

  14. 14

    백만 개의 레코드가있는 인덱스에서 dynamodb 쿼리

  15. 15

    4 테이블에 대한 내부 조인 쿼리 구문

  16. 16

    서브 쿼리 조건에서 두 테이블 결합 문제

  17. 17

    SQL 쿼리 성능 문제 전체 테이블 스캔

  18. 18

    SQL 쿼리 성능 문제 전체 테이블 스캔

  19. 19

    Mongoose의 배열 필드에 조건이있는 문서 쿼리

  20. 20

    Android의 SQLite에서 테이블 생성에 문제가 있음

  21. 21

    테이블 생성시 제약 조건 또는 인덱스 SQL 문제

  22. 22

    2 SELECT 문을 가입하지만, 테이블 A에서 조건이 테이블 B에 충족되는 경우에만 출력을 표시하는 방법

  23. 23

    Rails : has_many : through 연관에있는 조인 테이블의 여러 새 레코드에 속성 값 추가

  24. 24

    EXISTS 하위 쿼리를 포함하는 모든 MySQL SELECT 쿼리와 ON이있는 LEFT JOIN에서 ON이 외부 SELECT를 참조하는 문제

  25. 25

    Postgresql 12 : 중복 연산자와 매우 동일한 테이블에 대한 조인의 성능 문제

  26. 26

    500 개 미만의 레코드가있는 테이블 만 스캔하도록 SQL 쿼리 제한

  27. 27

    하나의 쿼리에서 문제가있는 하위 쿼리

  28. 28

    어떤 상황에서 부모 테이블에 자식 테이블의 활성 외래 키가 참조하는 레코드가 누락 될 수 있습니까?

  29. 29

    이 쿼리가 Select 문에 조인하려고 시도하는 동안 mysql이 잘못되었습니다.

뜨겁다태그

보관