반응형
인덱스된 키에 가입하더라도 MySQL(InnoDB) 쿼리가 느립니다. 이유는 무엇입니까?
이 요구가 느린 이유를 알고 계십니까(MySQL 서버에서는 1.7초).
SELECT DISTINCT TABLE_A.keyA
FROM TABLE_A,TABLE_B
WHERE TABLE_A.keyB= TABLE_B.keyB
AND TABLE_A.fieldC in (0,2,5,7,8) LIMIT 20;
이 실행 계획을 통해EXPLAIN
:
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE TABLE_B index PRIMARY PRIMARY 8 NULL 10 Using index; Using temporary
1 SIMPLE TABLE_A ref IDX_TABLE_A_KEY_B IDX_TABLE_A_KEY_B 8 TABLE_B.keyB 25455 Using where
기타 요소:
- 테이블 탭LE_A에는 30만 회선이 있습니다.
- TABLE_A.keyA는 Tab의 기본 키입니다.LE_A
- TABLE_A.keyB는 TAB의 프라이머리 키B에 대한 외부 키입니다.LE_B; 테이블 탭LE_B에는 10개의 회선이 있습니다.
- 탭의 99 %LE_A에는 필드 C=1이 있고 테이블의 1%에 필드 C가 (0,2,5,7,8)가 있습니다(따라서 이 필드는 인덱싱되지 않습니다). 같은 절을 사용하지만 TAB와 조인하지 않는 SELECT는 문제가 없습니다.LE_B는 고속).
- 테이블 위의 단순한 SELECT는 빠르기 때문에 JOIN이 문제인 것 같습니다.
- 다른 테이블 탭과의 결합LE_C도 매우 느립니다.
- MySQL 버전 : 5.1.23a-maria-alpha
당신은 알기라도 하나요?
탭의 99 %LE_A에는 필드 C=1이 있고 테이블의 1%에는 필드 C가 (0,2,5,7,8)가 있습니다(이 때문에 이 필드는 색인화되지 않았습니다).
그것은 칼럼을 색인화하는 훌륭한 이유가 될 것이다.쿼리에 필요한 테이블은 1% 미만이므로 인덱스는 매우 선택적입니다.
아마도IN
조항, 그들은 꽤 느린 경향이 있습니다, 당신은 지수를 가지고 있나요?TABLE_A.fieldC
?
SELECT DISTINCT TABLE_A.keyA
FROM TABLE_A
INNER JOIN TABLE_B ON TABLE_A.keyB = TABLE_B.keyB
WHERE
TABLE_A.fieldC IN (0, 2, 5, 7, 8) LIMIT 20;
한번 써보세요.
해라
SELECT DISTINCT TABLE_A.keyA
FROM TABLE_A
WHERE TABLE_A.keyB IN (SELECT TABLE_B.keyB FROM TABLE_B )
AND TABLE_A.fieldC in (0,2,5,7,8) LIMIT 20;
필드C 열에 인덱스를 추가합니다.그런 다음 쿼리를 실행합니다.
Select DISTINCT keyA from
(select keyA, keyB from TABLE_A where fieldC in (0,2,5,7,8))
as temp STRAIGHT_JOIN TABLE_B on temp.keyB=TABLE_B.keyB limit 20
스트레이트 조인과 이너 조인을 사용해 보세요.
언급URL : https://stackoverflow.com/questions/7090668/slow-mysql-innodb-query-despite-join-on-indexed-key-why
반응형
'programing' 카테고리의 다른 글
Python에서는 메서드를 덮어쓰고 있다는 것을 어떻게 표시합니까? (0) | 2023.01.25 |
---|---|
__slots__의 사용방법 (0) | 2023.01.25 |
오류: (23, 17) 해결 실패: junit: junit: 4.12 (0) | 2023.01.25 |
빈 어레이를 생성하여 NumPy에 추가하는 방법은 무엇입니까? (0) | 2023.01.25 |
부모 클래스의 자식 클래스 이름 가져오기(정적 컨텍스트) (0) | 2023.01.15 |