>  기사  >  데이터 베이스  >  MySQL의 8가지 일반적인 SQL 사용 오류

MySQL의 8가지 일반적인 SQL 사용 오류

王林
王林앞으로
2019-08-27 10:49:442590검색

서문

MySQL은 2016년에도 데이터베이스 인기에서 강한 성장세를 이어갔습니다. 점점 더 많은 고객이 MySQL 데이터베이스에 애플리케이션을 구축하거나 심지어 Oracle에서 MySQL로 마이그레이션하고 있습니다. 그러나 일부 고객은 MySQL 데이터베이스를 사용할 때 느린 응답 시간 및 전체 CPU 사용과 같은 문제에 직면하기도 합니다.

Alibaba Cloud RDS 전문 서비스 팀은 클라우드 고객이 여러 긴급 문제를 해결하도록 도왔습니다. "ApsaraDB 전문가 진단 보고서"에 나타나는 몇 가지 일반적인 SQL 문제를 참고할 수 있도록 다음과 같이 요약합니다.

1. LIMIT 문

페이징 쿼리는 가장 일반적으로 사용되는 시나리오 중 하나이지만 일반적으로 문제가 발생하기 가장 쉽습니다.

예를 들어 다음과 같은 간단한 문장의 경우 일반 DBA의 아이디어는 type, name 및 create_time 필드에 결합된 인덱스를 추가하는 것입니다. 이런 방식으로 조건부 정렬은 인덱스를 효과적으로 활용하고 성능을 빠르게 향상시킬 수 있습니다.

SELECT *  FROM   operation  WHERE  type = 'SQLStats'         AND name = 'SlowLog'  ORDER  BY create_time  LIMIT  1000, 10;

글쎄, 아마도 90% 이상의 DBA가 이 문제를 해결하고 거기서 멈출 것입니다.

하지만 LIMIT 절이 "LIMIT 1000000,10"이 되면 프로그래머는 여전히 불평할 것입니다. 10개의 레코드만 가져오면 왜 여전히 느린가요?

데이터베이스는 1,000,000번째 레코드가 어디서 시작되는지 알 수 없다는 점을 알아야 합니다. 인덱스가 있어도 처음부터 계산해야 합니다. 이런 종류의 성능 문제가 발생하면 대부분의 경우 프로그래머는 게으르다. 프런트엔드 데이터 탐색 및 페이지 넘기기, 빅데이터 일괄 내보내기 등의 시나리오에서는 이전 페이지의 최대값을 쿼리 조건의 매개변수로 사용할 수 있습니다. SQL은 다음과 같이 재설계되었습니다:

SELECT   *  FROM     operation  WHERE    type = 'SQLStats'  AND      name = 'SlowLog'  AND      create_time > '2017-03-16 14:00:00'  ORDER BY create_time limit 10;

2. 암시적 변환

SQL 문의 쿼리 변수와 필드 정의 유형 간의 불일치는 또 다른 일반적인 오류입니다. . 예를 들어, 다음 문은 다음과 같습니다.

MySQL의 8가지 일반적인 SQL 사용 오류

필드 bpn은 varchar(20)으로 정의됩니다. MySQL의 전략은 비교하기 전에 문자열을 숫자로 변환하는 것입니다. . 함수가 테이블 필드에 작용하고 인덱스가 유효하지 않게 됩니다.

위의 상황은 프로그래머의 원래 의도가 아닌 애플리케이션 프레임워크에 의해 자동으로 채워지는 매개변수일 수 있습니다. 요즘에는 매우 복잡한 애플리케이션 프레임워크가 많이 있습니다. 사용하기 쉽지만 구멍이 파질 수 있으니 주의하세요.

3. 연관 업데이트, 삭제

MySQL5.6에는 구체화 기능이 도입되었지만, 현재는 쿼리문 최적화에만 사용됩니다. 업데이트 또는 삭제의 경우 JOIN으로 수동으로 다시 작성해야 합니다.

예를 들어 아래 UPDATE 문에서 MySQL은 실제로 루프/중첩 하위 쿼리(DEPENDENT SUBQUERY)를 실행하는데, 그 실행 시간을 짐작할 수 있습니다.

MySQL의 8가지 일반적인 SQL 사용 오류

실행 계획:

MySQL의 8가지 일반적인 SQL 사용 오류

4. 정렬

MySQL은 혼합 정렬에 인덱스를 사용할 수 없습니다. 그러나 일부 시나리오에서는 성능을 향상시키기 위해 특별한 방법을 사용할 수 있는 기회가 여전히 있습니다.

MySQL의 8가지 일반적인 SQL 사용 오류

실행 계획은 전체 테이블 스캔으로 표시됩니다.

MySQL의 8가지 일반적인 SQL 사용 오류

#🎜🎜 #due to is_reply 상태는 0과 1 두 가지뿐입니다. 다음 방법에 따라 다시 작성한 후에는 실행 시간이 1.58초에서 2밀리초로 단축됩니다.

MySQL의 8가지 일반적인 SQL 사용 오류

5、EXISTS语句

MySQL 对待 EXISTS 子句时,仍然采用嵌套子查询的执行方式。如下面的 SQL 语句:

MySQL의 8가지 일반적인 SQL 사용 오류

执行计划为:

MySQL의 8가지 일반적인 SQL 사용 오류

去掉 exists 更改为 join,能够避免嵌套子查询,将执行时间从1.93秒降低为1毫秒。

MySQL의 8가지 일반적인 SQL 사용 오류

新的执行计划:

MySQL의 8가지 일반적인 SQL 사용 오류

6、条件下推

外部查询条件不能够下推到复杂的视图或子查询的情况有:

聚合子查询;

含有 LIMIT 的子查询;

UNION 或 UNION ALL 子查询;

输出字段中的子查询;

如下面的语句,从执行计划可以看出其条件作用于聚合子查询之后:

MySQL의 8가지 일반적인 SQL 사용 오류

MySQL의 8가지 일반적인 SQL 사용 오류

确定从语义上查询条件可以直接下推后,重写如下:

SELECT target Count(*)  FROM   operation  WHERE  target = 'rm-xxxx'  GROUP  BY target

执行计划变为:

MySQL의 8가지 일반적인 SQL 사용 오류

关于 MySQL 外部条件不能下推的详细解释说明请参考文章:

http://mysql.taobao.org/monthly/2016/07/08

相了解更多相关问题请访问PHP中文网:mysql视频教程

위 내용은 MySQL의 8가지 일반적인 SQL 사용 오류의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 cnblogs.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제