데이터 베이스 MySQL 튜토리얼 IN&EXISTS与NOT IN&NOT EXISTS 的优化原则小结

IN&EXISTS与NOT IN&NOT EXISTS 的优化原则小结

Jun 07, 2016 pm 06:00 PM
exists in

下面只是从理论上提出了一些建议,最好的原则是大家在上面的基础上,能够使用执行计划来分析,得出最佳的语句的写法。

1. EXISTS的执行流程
select * from t1 where exists ( select null from t2 where y = x )
可以理解为:
代码如下:
for x in ( select * from t1 )
loop
if ( exists ( select null from t2 where y = x.x )
then
OUTPUT THE RECORD
end if
end loop

对于in 和 exists的性能区别:
如果子查询得出的结果集记录较少,主查询中的表较大且又有索引时应该用in,反之如果外层的主查询记录较少,子查询中的表大,又有索引时使用exists。
其实我们区分in和exists主要是造成了驱动顺序的改变(这是性能变化的关键),如果是exists,那么以外层表为驱动表,先被访问,如果是IN,那么先执行子查询,所以我们会以驱动表的快速返回为目标,那么就会考虑到索引及结果集的关系了
另外IN时不对NULL进行处理,如:
select 1 from dual where null in (0,1,2,null)
结果为空。

2. NOT IN 与NOT EXISTS:
NOT EXISTS的执行流程
代码如下:
select .....
from rollup R
where not exists ( select 'Found' from title T
where R.source_id = T.Title_ID);

可以理解为:
代码如下:
for x in ( select * from rollup )
loop
if ( not exists ( that query ) ) then
OUTPUT
end if;
end;

注意:NOT EXISTS 与 NOT IN 不能完全互相替换,看具体的需求。如果选择的列可以为空,则不能被替换。
例如下面语句,看他们的区别:
select x,y from t;
x y
------ ------
1 3
3 1
1 2
1 1
3 1
5
select * from t where x not in (select y from t t2 )
no rows
select * from t where not exists (select null from t t2
where t2.y=t.x )
x y
------ ------
5 NULL
所以要具体需求来决定
对于not in 和 not exists的性能区别:
not in 只有当子查询中,select 关键字后的字段有not null约束或者有这种暗示时用not in,另外如果主查询中表大,子查询中的表小但是记录多,则应当使用not in,并使用anti hash join.
如果主查询表中记录少,子查询表中记录多,并有索引,可以使用not exists,另外not in最好也可以用/*+ HASH_AJ */或者外连接+is null
NOT IN 在基于成本的应用中较好
比如:
代码如下:
select .....
from rollup R
where not exists ( select 'Found' from title T
where R.source_id = T.Title_ID);

改成(佳)
select ......
from title T, rollup R
where R.source_id = T.Title_id(+)
and T.Title_id is null;
或者(佳)
sql> select /*+ HASH_AJ */ ...
from rollup R
where ource_id NOT IN ( select ource_id
from title T
where ource_id IS NOT NULL )
注意:上面只是从理论上提出了一些建议,最好的原则是大家在上面的基础上,能够使用执行计划来分析,得出最佳的语句的写法。
'//=============================
exists,not exists总结

1 exists
SELECT * FROM anken_m WHERE EXISTS(
SELECT my_list_temp_m.sales_code
FROM my_list_temp_m
WHERE my_list_temp_m.sales_code=anken_m.sales_code)
说明:
1) 查询在anken_m表和my_list_temp_m表中都存在的sales_code。
2) sales_code是anken_m的主键,my_list_temp_m的外键。
注意:
1) 外层查询表anken_m是查询的对象。
2) 内层查询表my_list_temp_m是条件对象。
3) 内外层的查询表不能相同。
4) 作为关联条件的anken_m表不需要在内层查询FROM后添加。
5) my_list_temp_m.sales_code=anken_m.sales_code条件的左右顺序不影响查询结果。

2 not exists
SELECT * FROM anken_m WHERE NOT EXISTS(
SELECT my_list_temp_m.sales_code
FROM my_list_temp_m
WHERE my_list_temp_m.sales_code=anken_m.sales_code)
说明:
1) 查询在anken_m表中存在,但是在my_list_temp_m表中不存在的sales_code。
2) sales_code是anken_m的主键,my_list_temp_m的外键。
注意:
1) 外层查询表anken_m是查询的对象。
2) 内层查询表my_list_temp_m是条件对象。
3) 内外层的查询表不能相同。
4) 作为关联条件的anken_m表不需要在内层查询FROM后添加。
5) my_list_temp_m.sales_code=anken_m.sales_code条件的左右顺序不影响查询结果。

3 综合运用
UPDATE anken_m
SET(plan_type_code, branch_name, business_type_code)
=(SELECT anken.plan_type_code,anken.branch_name,anken.business_type_code
FROM anken
WHERE anken.sales_code=anken_m.sales_code)
WHERE EXISTS (
SELECT anken.sales_code
FROM anken,my_list_temp_m
WHERE my_list_temp_m.sales_code=anken.sales_code
AND anken.sales_code=anken_m.sales_code
)
说明:
1) 用一个表的记录数据更新另一个表的记录数据。
2) 用一个SQL语句进行批量更新。
2) sales_code是anken,anken_m的主键,my_list_temp_m的外键。
注意:
1) set 语句中的要被更新字段必须跟数据源字段一一对应,另外数据源查询中的条件必须限定一条记录。也就是根据sales_code可以唯一确定anken的一条记录,和anken_m的一条记录,这样才能保证要被更新的记录和数据源记录的主键是相同的。
2) 根据WHERE EXISTS语句可以确定数据源记录的范围,也就是可以用anken表中哪些记录更新anken_m表。所以anken_m不需要在WHERE EXISTS语句中的FROM后添加。
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

i18n을 사용하여 Vue에서 다국어 전환을 구현하는 팁 i18n을 사용하여 Vue에서 다국어 전환을 구현하는 팁 Jun 25, 2023 am 09:33 AM

국제화가 지속적으로 발전함에 따라 점점 더 많은 웹사이트와 애플리케이션이 다중 언어 전환 기능을 지원해야 합니다. 널리 사용되는 프런트엔드 프레임워크인 Vue는 다중 언어 전환을 달성하는 데 도움이 되는 i18n이라는 플러그인을 제공합니다. 이 기사에서는 i18n을 사용하여 Vue에서 다중 언어 전환을 구현하는 일반적인 기술을 소개합니다. 1단계: i18n 플러그인 설치 먼저 npm 또는 Yarn을 사용하여 i18n 플러그인을 설치해야 합니다. 명령줄에 다음 명령을 입력합니다: npminst

out 및 in 인터페이스는 무엇을 의미하나요? out 및 in 인터페이스는 무엇을 의미하나요? Sep 28, 2021 pm 04:39 PM

out 인터페이스는 출력 인터페이스를 나타내고 in 인터페이스는 입력 인터페이스를 나타냅니다. 아웃 인터페이스는 일반적으로 스피커, 헤드폰 등과 같은 부하를 연결하는 데 사용되는 오디오 소스 라인 출력 인터페이스를 나타내고, 인 인터페이스는 일반적으로 CD 플레이어, 모바일을 연결하는 데 사용되는 오디오 소스 라인 입력 인터페이스를 나타냅니다. 휴대폰, MP3 플레이어, 컴퓨터 등

C#에서 File.Exists 함수를 사용하여 파일이 존재하는지 확인하는 방법 C#에서 File.Exists 함수를 사용하여 파일이 존재하는지 확인하는 방법 Nov 18, 2023 am 11:25 AM

C#에서 File.Exists 함수를 사용하여 파일이 있는지 확인하는 방법 C# 파일 작업에서 파일이 있는지 확인하는 것은 기본적인 기능 요구 사항입니다. File.Exists 함수는 파일이 존재하는지 확인하는 데 사용되는 C#의 메서드입니다. 이 문서에서는 C#에서 File.Exists 함수를 사용하여 파일이 존재하는지 확인하는 방법을 소개하고 특정 코드 예제를 제공합니다. 네임스페이스 참조 코드 작성을 시작하기 전에 먼저 System.IO 네임스페이스를 참조해야 합니다.

MySQL에서 on, in, as 및 where의 차이점은 무엇입니까? MySQL에서 on, in, as 및 where의 차이점은 무엇입니까? Jun 03, 2023 am 11:37 AM

Mysqlon, in, as의 차이점 where 답변: Where 쿼리 조건은 내부 및 외부 연결에 대해 별칭으로 on을 사용하여 특정 값이 특정 조건에서 2개의 테이블을 생성하는지 쿼리합니다. 학생, 점수학생: 점수: whereSELECT*FROMstudentWHEREs_sex=' Male'예: onSELECT*FROMstudentLEFTJOINscoreonstudent.s_id=score.s_id; on과 where의 조합: SELECT*FROMstudentLEFTJOINs

장치 드라이버 블루 스크린에서 스레드 멈춤을 해결하는 5가지 방법 장치 드라이버 블루 스크린에서 스레드 멈춤을 해결하는 5가지 방법 Mar 25, 2024 pm 09:40 PM

일부 사용자는 Microsoft의 3월 Win11 업데이트 패치 KB5035853을 설치한 후 시스템 페이지에 "ThreadStuckinDeviceDriver"가 표시되면서 블루 스크린 사망 오류가 발생했다고 보고했습니다. 이 오류는 하드웨어 또는 드라이버 문제로 인해 발생할 수 있는 것으로 이해됩니다. 다음은 컴퓨터 블루 스크린 문제를 신속하게 해결할 수 있는 5가지 수정 사항입니다. 방법 1: 시스템 파일 검사를 실행합니다. 명령 프롬프트에서 [sfc/scannow] 명령을 실행합니다. 이 명령은 시스템 파일 무결성 문제를 감지하고 복구하는 데 사용할 수 있습니다. 이 명령의 목적은 누락되거나 손상된 시스템 파일을 검사하고 복구하여 시스템 안정성과 정상적인 작동을 보장하는 것입니다. 방법 2: 1. "블루 스크린 복구 도구"를 다운로드하여 엽니다.

Vue에서 다중 언어 처리를 수행하는 방법은 무엇입니까? Vue에서 다중 언어 처리를 수행하는 방법은 무엇입니까? Jun 11, 2023 pm 03:22 PM

실제 개발에서는 웹사이트나 애플리케이션에 대한 다국어 지원이 필수 기능이 되었습니다. 널리 사용되는 JavaScript 프레임워크인 Vue는 여러 언어도 지원합니다. 이 기사에서는 Vue의 다중 언어 처리 체계 및 구현 세부 사항을 소개합니다. 솔루션 선택 다음을 포함하되 이에 국한되지 않는 다양한 다중 언어 지원 솔루션이 있습니다: 1.1 vue-i18n 플러그인을 통해 지원되는 프런트 엔드에 다중 언어 기능의 프런트 엔드 통합 구현. 해당 언어팩을 독립된 구성요소로 도입하면 다양한 언어를 표시할 수 있습니다.

실용적인 Linux 팁을 살펴보세요. 실용적인 Linux 팁을 살펴보세요. Mar 12, 2024 pm 01:49 PM

Linux는 보다 효율적으로 사용하는 데 도움이 되는 유용한 명령과 팁이 많이 포함된 강력한 운영 체제입니다. 1. 파일 체크값을 확인하세요. 파일 복사나 전송 과정에서 파일이 손상되거나 수정될 수 있습니다. 이 경우 체크값을 확인용으로 활용하실 수 있습니다. 일반적으로 우리는 작업 시 다른 팀에서 제공하는 일부 인터페이스 프로그램을 사용해야 합니다. 이러한 프로그램의 실행 결과가 예상과 다를 때마다 양측의 md5 검사 값을 비교하여 데이터의 일관성을 확인합니다. 파일의 검사 값을 생성하는 방법에는 md5sum 검사, crc 검사, 합계 검사 등이 일반적으로 사용됩니다. 명령은 다음과 같습니다: md5sumfile_namecksumfile_namesum 알고리즘 매개변수 파일

CakePHP에서 i18n을 어떻게 사용하나요? CakePHP에서 i18n을 어떻게 사용하나요? Jun 04, 2023 pm 12:10 PM

CakePHP는 다국어 국제화(i18n) 통합을 지원하는 오픈 소스 PHP 프레임워크입니다. i18n은 귀하의 애플리케이션을 다국어로 만들어 귀하가 보다 쉽게 ​​국제 청중을 유치하고 현지 사용자에게 더 나은 서비스를 제공할 수 있도록 해줍니다. 이번 글에서는 CakePHPi18n의 사용법을 심층적으로 살펴보겠습니다. 시작하기 먼저, CakePHP의 다국어 기능을 활성화해야 합니다. 이렇게 하려면 구성 파일 config/bootstrap.php를 업데이트하고 애플리케이션에 다음 코드를 추가하세요.

See all articles