여러 조인 및 테이블 조회를 활용하는 MySQL 쿼리가 시간을 과도하게 소모하고 특히 웹에 영향을 미치는 상황 페이지 로드 속도에 대한 조사 및 해결이 이루어졌습니다.
문제의 쿼리에는 세 개의 테이블(poster_data, Poster_categories 및 Poster_prodcat. 쿼리는 특정 apcatnum 값이 '623'과 같다는 조건을 기반으로 이러한 테이블의 특정 정보를 표시하려고 했습니다.
데이터베이스 스키마 및 쿼리 계획(EXPLAIN 문으로 제공됨)을 분석한 결과 1,700만 개 이상의 행이 포함된 Poster_prodcat 테이블이 속도 저하의 주요 원인이었습니다. 특히 최적화되지 않은 조인 조건으로 인해 이 테이블에서 약 400,000개 행의 하위 집합에 액세스할 때 쿼리가 디스크에 기록되었습니다.
이 문제를 해결하기 위해 데이터베이스 구조와 인덱스의 재구성이 제안되었습니다. 원래의 복잡한 조인 구조는 단순화되고 보다 효율적인 조인 전략으로 대체되었습니다. 또한 쿼리 성능을 향상시키기 위해 관련 열에 클러스터형 복합 인덱스가 도입되었습니다.
다음 코드 조각은 최적화된 데이터베이스 구조와 쿼리를 보여줍니다.
-- Create the tables DROP TABLE IF EXISTS poster; CREATE TABLE poster ( poster_id INT UNSIGNED NOT NULL AUTO_INCREMENT, name VARCHAR(255) NOT NULL UNIQUE ) ENGINE = INNODB; DROP TABLE IF EXISTS category; CREATE TABLE category ( cat_id MEDIUMINT UNSIGNED NOT NULL AUTO_INCREMENT, name VARCHAR(255) NOT NULL UNIQUE ) ENGINE = INNODB; DROP TABLE IF EXISTS poster_category; CREATE TABLE poster_category ( cat_id MEDIUMINT UNSIGNED NOT NULL, poster_id INT UNSIGNED NOT NULL, PRIMARY KEY (cat_id, poster_id) -- Clustered composite index ) ENGINE = INNODB; -- Populate the tables with data -- Fetch data from the existing database to populate the new structure SELECT p.*, c.* FROM poster_category pc INNER JOIN category c ON pc.cat_id = c.cat_id INNER JOIN poster p ON pc.poster_id = p.poster_id WHERE pc.cat_id = 623 ORDER BY p.name LIMIT 32;
이러한 최적화의 통합으로 인해 대폭 감소 쿼리 실행 시간. 디스크 쓰기 작업을 최소화하고 쿼리 효율성을 높이기 위해 구조 조정 및 인덱싱 기술이 결합되어 웹페이지 로딩 속도가 크게 향상되었습니다.
위 내용은 느린 쿼리 속도를 높이기 위해 MySQL 조인을 최적화하고 디스크 I/O를 줄이는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!