>데이터 베이스 >MySQL 튜토리얼 >성능을 향상하고 디스크 I/O를 줄이기 위해 느린 MySQL 쿼리를 어떻게 최적화할 수 있습니까?

성능을 향상하고 디스크 I/O를 줄이기 위해 느린 MySQL 쿼리를 어떻게 최적화할 수 있습니까?

Linda Hamilton
Linda Hamilton원래의
2024-12-30 20:24:11964검색

How Can I Optimize a Slow MySQL Query to Improve Performance and Reduce Disk I/O?

실행 시간 및 디스크 쓰기를 줄이기 위해 MySQL 쿼리 최적화

MySQL 쿼리에 성능 문제가 발생하여 완료하고 쓰기까지 몇 분이 소요됩니다. 실행 중 디스크. 이는 웹페이지의 응답성에 큰 영향을 미칠 수 있습니다. 이 문제를 해결하기 위해 데이터 모델링 및 인덱스 최적화와 관련된 솔루션을 살펴보겠습니다.

언급하신 느린 쿼리는 다음과 같습니다.

SELECT * 
FROM poster_prodcat, 
     poster_data, 
     poster_categories 
WHERE poster_data.apnumber = poster_prodcat.apnumber 
  AND poster_categories.apcatnum = poster_prodcat.apcatnum 
  AND poster_prodcat.apcatnum='623'  
ORDER BY aptitle ASC 
LIMIT 0, 32

EXPLAIN 출력에 따르면 쿼리는 전체 쿼리를 수행하고 있습니다. 1,700만 개 이상의 행이 포함된 Poster_prodcat 테이블에 대한 테이블 스캔입니다. 이는 과도한 실행 시간의 원인이 됩니다.

쿼리 성능을 최적화하기 위해 다음 변경 사항을 구현할 수 있습니다.

정규화 및 인덱싱:

  1. 데이터 정규화: 다음을 사용하여 Poster_prodcat 테이블을 정규화된 구조로 변환합니다. 두 개의 테이블: 포스터와 카테고리. 세 번째 테이블인 Poster_category를 생성하여 포스터와 카테고리 간의 관계를 설정합니다.
  2. 인덱스 생성: 포스터, 카테고리, 포스터_카테고리 테이블의 해당 열에 인덱스를 생성합니다. 이렇게 하면 데이터베이스가 전체 테이블 스캔을 수행하지 않고도 데이터를 빠르게 찾을 수 있습니다.

업데이트된 스키마의 예는 다음과 같습니다.

CREATE TABLE poster (
  poster_id INT UNSIGNED NOT NULL AUTO_INCREMENT,
  name VARCHAR(255) NOT NULL UNIQUE,
  PRIMARY KEY (poster_id)
) ENGINE=InnoDB;

CREATE TABLE category (
  cat_id MEDIUMINT UNSIGNED NOT NULL AUTO_INCREMENT,
  name VARCHAR(255) NOT NULL UNIQUE,
  PRIMARY KEY (cat_id)
) ENGINE=InnoDB;

CREATE TABLE poster_category (
  cat_id MEDIUMINT UNSIGNED NOT NULL,
  poster_id INT UNSIGNED NOT NULL,
  PRIMARY KEY (cat_id, poster_id),
  INDEX (poster_id) -- Clustered composite index
) ENGINE=InnoDB;

데이터가 정규화되고 인덱싱되면 , 쿼리가 훨씬 빠르게 수행되어 실행 시간이 크게 단축됩니다.

위 내용은 성능을 향상하고 디스크 I/O를 줄이기 위해 느린 MySQL 쿼리를 어떻게 최적화할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.