이것은 모두의 연합
으아악PHPz2017-05-18 10:58:52
우선, 이 두 쿼리 사이의 성능 격차가 크지 않아야 합니다.
ad_id 열이 기본 키이기 때문이죠.
유형 열 분석에 따르면:
또는 쿼리, 유형: range
type:range
union all 查询:type:const / const / ALL
首先可以确认的是,const
要优于 range
.const
也是因为 ad_id 为主键.
但是 union all 做了三次操作,两次主键或者唯一索引查询 type:const,但最后组合到一起时 type:ALL
type:ALL 本身性能比 range 还要差
从 Type 看,or 查询性能应该更好.
Extra 分析
or 查询:Using index condition
union all 查询:NULL / NULL / Using temporary
union 모든 쿼리: 유형: const / const / ALL
먼저 확인할 수 있는 것은 range
보다 const
가 낫다는 점입니다.
const
도 ad_id가 기본 키이기 때문입니다.그러나 Union All은 세 가지 작업, 두 개의 기본 키 또는 고유 인덱스 쿼리 type:const를 수행하지만 최종적으로 함께 결합하면 type:ALL
type:ALL 자체는 range보다 성능이 나쁩니다또는 쿼리:유형 관점이나 쿼리 성능이 더 좋아야 합니다.
추가 분석
인덱스 조건 사용
union 모든 쿼리: NULL / NULL / 임시 사용
인덱스 조건 사용은 MySQL 5.6 버전 이후 새로 추가된 기능인 인덱스 조건 푸시입니다.2) 서버 계층은 데이터 행이 where 조건을 만족하면 사용되며, 그렇지 않으면 폐기됩니다.먼저 푸시에 대한 인덱스 조건이 없을 때의 처리 흐름에 대해 이야기해 보겠습니다.
1) 스토리지 엔진이 다음 행을 읽을 때 먼저 인덱스 튜플을 읽은 다음 인덱스 튜플을 사용하여 기본 테이블의 전체 데이터 행을 찾아 읽습니다.
옵티마이저가 ICP를 사용하지 않는 경우 데이터 접근 및 추출 과정은 다음과 같습니다.
3) 1)의 데이터 마지막 행까지 실행합니다.
옵티마이저가 ICP를 사용하는 경우 서버 계층은 인덱스를 사용하여 평가할 수 있는 where 조건을 스토리지 엔진 계층으로 푸시합니다. 데이터 액세스 및 추출 프로세스는 다음과 같습니다.
2) 스토리지 엔진은 인덱스 튜플을 사용하여 푸시다운 인덱스 조건을 평가합니다. where 조건이 충족되지 않으면 스토리지 엔진은 다음 인덱스 튜플을 처리합니다(이전 단계로 돌아갑니다). 인덱스 튜플이 푸시다운 인덱스 조건을 충족하는 경우에만 기본 테이블에서 데이터를 계속 읽습니다. 3) 푸시다운 인덱스 조건이 만족되면 스토리지 엔진은 인덱스 튜플을 통해 기본 테이블의 행을 찾아 전체 데이터 행을 읽어 서버 계층으로 반환합니다. 4) 서버 계층 평가는 스토리지 엔진 계층의 where 조건으로 푸시다운되지 않습니다. 데이터 행이 where 조건을 만족하면 사용되며, 그렇지 않으면 폐기됩니다.
🎜 🎜간단히 말하면 ICP가 없는 경우 스토리지 엔진은 조건을 충족하는 모든 데이터 행을 반환하고 서비스 계층에서 Where 조건 필터링을 수행합니다. 🎜ICP가 있으면 where 조건이 스토리지 엔진 계층으로 푸시되고, 스토리지 엔진은 조건을 충족하는 데이터를 직접 반환합니다. 🎜성능이 자연스럽게 많이 향상됩니다. 🎜 🎜ICP 관련 소개는 여기서 보실 수 있습니다🎜 🎜임시를 사용한다는 것은 암시적 임시 테이블을 의미하며, 이는 MySQL이 중간 데이터를 저장하기 위해 임시 테이블을 생성한다는 의미입니다. Union All은 별도로 처리되어 마지막에 병합되는 관계이기 때문입니다. 🎜 Extra에서도 그게 아니면 쿼리 성능이 더 높아야 합니다. 🎜 🎜🎜전체: OR 쿼리의 성능은 UNION ALL보다 더 좋습니다.🎜🎜모든 쿼리의 성능은 데이터의 양이 증가함에 따라 변하기 때문에 위 분석은 단지 주제가 게시한 explain 분석 결과를 바탕으로 한 것입니다. 이는 모든 상황에서 OR이 UNION ALL보다 낫다는 의미는 아닙니다.
위 내용은 개인적인 의견이니 틀린 부분이 있으면 정정 부탁드립니다.
黄舟2017-05-18 10:58:52
이 두 문장에는 차이가 없습니다.
일반적으로 OR이 서로 다른 두 필드를 연결하고 인덱스를 사용할 수 없는 경우 성능이 저하되어 Union만큼 좋지 않게 수정해 볼 수 있습니다.