>데이터 베이스 >MySQL 튜토리얼 >더 나은 성능을 위해 SQL 쿼리를 작성할 때 피해야 할 나쁜 습관

더 나은 성능을 위해 SQL 쿼리를 작성할 때 피해야 할 나쁜 습관

Susan Sarandon
Susan Sarandon원래의
2024-12-25 08:02:12522검색

Bad Practices to Avoid When Writing SQL Queries for Better Performance

데이터베이스의 성능과 확장성을 유지하려면 효율적인 SQL 쿼리를 작성하는 것이 필수적입니다. 그러나 쿼리 속도 저하, 로드 증가, 데이터베이스 성능 문제를 초래할 수 있는 일반적인 실수(또는 "나쁜 관행")가 있습니다. SQL 쿼리를 작성할 때 피해야 할 10가지 나쁜 습관은 다음과 같습니다.

1. SELECT * 사용

SELECT *는 편리해 보이지만 상당한 성능 단점이 있을 수 있습니다. 데이터의 하위 집합만 필요한 경우에도 모든 열을 검색하므로 불필요한 데이터 전송 및 처리가 발생합니다.

  • 나쁜 이유: 네트워크 트래픽과 메모리 사용량이 늘어납니다.
  • 대신 취할 조치: 항상 필요한 열을 정확하게 지정하세요.
-- Bad
SELECT * FROM employees;

-- Good
SELECT id, name, department FROM employees;

2. 인덱스를 제대로 사용하지 않는 경우

인덱스는 쿼리 성능 속도를 높이는 데 필수적이지만 인덱스를 사용하지 않거나 과도한 인덱싱은 해로울 수 있습니다.

  • 나쁜 이유: 인덱스가 없으면 전체 테이블 스캔이 발생하여 쿼리 속도가 느려질 수 있습니다. 인덱스가 너무 많으면 쓰기 성능이 저하될 수 있습니다.
  • 대체 방법: WHERE, JOIN, ORDER BY, GROUP BY 절에서 자주 사용되는 열에 인덱스를 생성합니다.
-- Bad (no index on `email`)
SELECT * FROM users WHERE email = 'example@example.com';

-- Good (create an index on `email`)
CREATE INDEX idx_email ON users(email);

3. WHERE 절에 OR 사용

WHERE 절에 OR을 사용하면 인덱스가 효율적으로 사용되지 않아 쿼리 성능이 저하될 수 있습니다.

  • 나쁜 이유: MySQL은 OR을 사용하여 인덱스를 효과적으로 사용하지 못해 전체 테이블 스캔이 발생할 수 있습니다.
  • 대신 취할 조치: 여러 값에 IN을 사용하거나 쿼리를 리팩토링하세요.
-- Bad
SELECT * FROM employees WHERE department = 'HR' OR department = 'Engineering';

-- Good
SELECT * FROM employees WHERE department IN ('HR', 'Engineering');

4. 불필요하게 DISTINCT 사용

DISTINCT는 SQL이 중복 항목을 제거하도록 강제하여 특히 대규모 데이터세트에서 오버헤드를 추가합니다.

  • 나쁜 이유: DISTINCT에는 추가 정렬이나 해싱이 필요하므로 쿼리 속도가 느려질 수 있습니다.
  • 대신 취할 조치: 꼭 필요한 경우에만 DISTINCT를 사용하세요.
-- Bad
SELECT DISTINCT department FROM employees;

-- Good (only if there are duplicates)
SELECT department FROM employees;

5. 결과 세트를 제한하지 않음

행 수를 제한하지 않고 큰 결과 집합을 반환하는 쿼리는 불필요한 처리 및 메모리 사용량을 초래할 수 있습니다.

  • 나쁜 이유: 높은 메모리 사용량, 느린 성능, 과도한 데이터 전송을 유발할 수 있습니다.
  • 대신 수행할 작업: 결과의 하위 집합만 필요한 경우 항상 LIMIT를 사용하세요.
-- Bad
SELECT * FROM employees;

-- Good
SELECT id, name, department FROM employees;

6. IS NULL 없이 WHERE 절에서 NULL 사용

=를 사용하여 NULL 값을 비교하면 등호 연산자를 사용하여 NULL을 비교할 수 없기 때문에 잘못된 동작이 발생합니다.

  • 나쁜 이유: NULL을 확인할 때 쿼리가 결과를 반환하지 못합니다.
  • 대신 취할 조치: IS NULL 또는 IS NOT NULL을 사용하세요.
-- Bad (no index on `email`)
SELECT * FROM users WHERE email = 'example@example.com';

-- Good (create an index on `email`)
CREATE INDEX idx_email ON users(email);

7. WHERE 절에 함수 사용하기

WHERE 절에 함수를 사용하면 데이터베이스가 모든 행에 함수를 적용해야 하므로 인덱스 사용이 방지되고 쿼리 성능이 저하될 수 있습니다.

  • 나쁜 이유: WHERE 절의 함수는 인덱스 사용을 비활성화하여 전체 테이블 스캔을 발생시킵니다.
  • 대신 취할 조치: WHERE 절의 인덱스 열에 함수를 사용하지 마세요.
-- Bad
SELECT * FROM employees WHERE department = 'HR' OR department = 'Engineering';

-- Good
SELECT * FROM employees WHERE department IN ('HR', 'Engineering');

8. JOIN을 효율적으로 사용하지 않음

올바른 순서나 적절한 인덱스를 고려하지 않고 여러 JOIN 작업으로 쿼리를 수행하면 성능이 크게 저하될 수 있습니다.

  • 나쁜 이유: JOIN 순서가 잘못되거나 인덱스가 누락되면 실행 계획이 비효율적이고 쿼리 시간이 길어집니다.
  • 대신 취할 조치: 항상 적절한 조인 순서를 사용하고 JOIN과 관련된 열에 인덱스가 있는지 확인하세요.
-- Bad
SELECT DISTINCT department FROM employees;

-- Good (only if there are duplicates)
SELECT department FROM employees;

9. 큰 결과를 반환하는 하위 쿼리에서 SELECT 사용

SELECT, WHERE 또는 HAVING 절 내에서 대규모 결과 집합을 반환하는 하위 쿼리를 사용하면 데이터베이스가 모든 행에 대해 하위 쿼리를 실행해야 하므로 성능이 저하될 수 있습니다.

  • 나쁜 이유: 하위 쿼리가 큰 결과 집합을 반환하거나 하위 쿼리가 여러 번 실행되는 경우 하위 쿼리가 비효율적일 수 있습니다.
  • 대신 수행할 작업: 해당되는 경우 JOIN 또는 EXISTS를 사용하도록 쿼리를 리팩터링합니다.
-- Bad
SELECT * FROM employees;

-- Good
SELECT * FROM employees LIMIT 100;

10. 쿼리 최적화 및 모니터링을 무시

쿼리를 최적화하거나 성능을 모니터링하지 못하면 시간이 지남에 따라 쿼리 속도가 느려지고 성능이 저하될 수 있습니다.

  • 나쁜 이유: 최적화되지 않은 쿼리는 높은 CPU, 메모리 사용량 및 긴 응답 시간으로 이어질 수 있습니다.
  • 대신 수행할 작업: EXPLAIN을 사용하여 쿼리 실행 계획을 분석하고 그에 따라 쿼리를 조정합니다. 또한 데이터베이스 성능을 정기적으로 모니터링하십시오.
-- Bad
SELECT * FROM employees;

-- Good
SELECT id, name, department FROM employees;

결론

이러한 나쁜 관행을 피함으로써 SQL 쿼리의 성능과 효율성을 크게 향상시킬 수 있습니다. 최적화된 SQL을 작성하면 애플리케이션 속도가 향상될 뿐만 아니라 데이터 양이 증가함에 따라 데이터베이스도 확장되는 데 도움이 됩니다. 항상 명확하고 효율적이며 유지 관리가 가능한 쿼리를 작성하는 데 집중하고 인덱싱, 제한 및 적절한 쿼리 구조를 사용하여 성능을 향상하세요.

위 내용은 더 나은 성능을 위해 SQL 쿼리를 작성할 때 피해야 할 나쁜 습관의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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