두 가지 다른 쿼리가 있습니다. 그러나 둘 다 같은 테이블에 있고 같은 WHERE
절을 가지고 있습니다. 그래서 그들은 같은 행을 선택하고 있습니다.
쿼리 1 :
SELECT HOUR(timestamp), COUNT(*) as hits
FROM hits_table
WHERE timestamp >= CURDATE()
GROUP BY HOUR(timestamp)
쿼리 2 :
SELECT country, COUNT(*) as hits
FROM hits_table
WHERE timestamp >= CURDATE()
GROUP BY country
이를 더 효율적으로 만들 수있는 방법은 무엇입니까?
이 테이블이 올바르게 인덱싱되면 오늘의 행만보고 있기 때문에 전체 테이블이 얼마나 큰지는 솔직히 중요하지 않습니다.
테이블이 잘못 인덱싱되면 어떤 작업을하든 이러한 쿼리의 성능이 저하됩니다.
귀하의 WHERE timestamp >= CURDATE()
절은 당신이에 인덱스가 필요 의미 timestamp
열을. 귀하의 쿼리 중 하나에서 GROUP BY country
색인을 포함하는 화합물 (timestamp, country)
이 큰 도움이 될 것임을 보여줍니다 .
따라서 단일 복합 인덱스 (timestamp, country)
는 질문의 두 쿼리를 모두 충족합니다.
어떻게 작동하는지 설명하겠습니다. 오늘의 레코드 (또는 실제로 특정 timestamp
값으로 시작하고 끝나는 모든 레코드)를 찾고 국가별로 그룹화하고 개수를 계산하기 위해 MySQL은 다음 단계를 수행하여 쿼리를 충족 할 수 있습니다.
timestamp
. O (log n).country
값 을 가져옵니다 .country
값 으로 스캔합니다 . 의 위에).timestamp
범위 가 끝날 때까지 3 단계를 반복 합니다.이 인덱스 스캔 작업은 에이스 개발자 팀 (MySQL 팀)이 10 년 동안의 노력을 통해 얻을 수있는 속도만큼 빠릅니다. (토요일 오후에는이를 능가하지 못할 수도 있습니다.) MySQL은 인덱스의 작은 하위 집합으로 전체 쿼리를 충족하므로 그 뒤에있는 테이블의 크기는 중요하지 않습니다.
이러한 쿼리 중 하나를 차례로 실행하면 MySQL이 여전히 RAM 캐시에 일부 또는 모든 인덱스 데이터 블록을 가질 수 있으므로 디스크에서 다시 가져올 필요가 없습니다. 그것은 더 많은 도움이 될 것입니다.
예제 쿼리가 어떻게 연결되는지 보십니까 timestamp
? 가장 중요한 WHERE
기준은 타임 스탬프 범위를 선택합니다. 이것이 내가 제안한 복합 인덱스 timestamp
가 첫 번째 열로있는 이유 입니다. country
해당 열에 대한 간단한 인덱스로 이어지는 쿼리가 없으면 아마도 쓸모가 없습니다.
당신은 정말로 복합 커버링 인덱스가 필요한지 물었습니다. 당신은 아마해야 읽기 에 대해 어떻게 그들이 작동하고 자신을 위해 결정을합니다.
인덱스 선택에는 분명히 절충안이 있습니다. 각 인덱스의 처리 속도가 느려 INSERT
과 UPDATE
조금, 그리고 많은 쿼리 속도를 높일 수 있습니다. 특정 응용 프로그램에 대한 장단점을 정렬 할 수있는 사람은 당신뿐입니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다