대형 테이블에서 느리게 실행되는 MySQL 문
상당한 수의 레코드가 포함된 데이터베이스로 작업할 때 쿼리에서 다음과 같은 작업이 수행되는 것이 일반적입니다. 실행 시간이 길어졌습니다. 한 가지 예는 다음과 같은 쿼리입니다.
select * from `ratings` order by id limit 499500, 500
일반적으로 쿼리는 수백만 개의 레코드가 포함된 데이터베이스의 경우에도 빠르게 실행되어야 합니다. 이 문제를 해결하려면 쿼리 성능에 영향을 미치는 기본 요소를 이해하는 것이 중요합니다.
인덱싱 및 엔진 선택
인덱싱을 사용하면 쿼리 속도를 획기적으로 향상시킬 수 있습니다. 특히 쿼리에 큰 테이블이 포함된 경우에는 더욱 그렇습니다. 제공된 코드 샘플에서 id별 명령문 순서는 결과가 id 열을 기준으로 정렬되어 반환되어야 함을 의미합니다. id 열이 인덱싱되지 않은 경우 데이터베이스는 데이터를 검색하기 위해 전체 테이블을 스캔해야 하며, 이는 큰 테이블의 경우 시간이 많이 걸릴 수 있습니다. id 열에 인덱스를 추가하면 데이터베이스가 전체 테이블 스캔을 수행하지 않고도 관련 행에 직접 액세스할 수 있습니다.
데이터베이스 엔진 선택과 관련하여 제공된 예제에서는 MyISAM을 사용한다는 점에 유의하는 것이 중요합니다. 이는 InnoDB와 같은 사용 가능한 다른 옵션에 비해 제한 사항으로 인해 더 이상 일반적으로 사용되지 않습니다.
쿼리 최적화
어떤 경우에는 쿼리 자체를 변경하면 크게 개선될 수 있습니다. 그 성능. 예를 들어 제공된 샘플과 같이 오프셋이 큰 제한 절을 사용하는 대신 where 절을 사용하는 것이 더 효율적입니다. 다음 쿼리는 이를 보여줍니다.
select * from `ratings` where id>=499500 limit 500
이 쿼리는 id 열의 기본 키 인덱스를 활용하여 데이터베이스가 관련 행에 직접 액세스할 수 있으므로 더 빠릅니다.
교착상태 배제
또한 교착상태 가능성을 제거하는 것이 중요합니다. 교착 상태는 두 개 이상의 프로세스 또는 스레드가 서로 보류된 리소스를 해제할 때까지 기다려 두 프로세스가 모두 진행되지 못하게 할 때 발생합니다. 주어진 시나리오에서 교착 상태가 성능 저하의 원인일 가능성은 낮지만 다른 잠재적인 문제를 배제했는지 고려해 볼 가치가 있습니다.
인덱싱, 쿼리 최적화, 데이터베이스 등의 요소를 해결하여 엔진을 선택하면 대규모 데이터베이스의 복잡한 쿼리도 실행 시간을 대폭 향상시킬 수 있습니다.
위 내용은 큰 테이블을 쿼리할 때 MySQL 문이 느린 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!