MySQL 쿼리 / 절 실행 순서
MySQL에서 구가 실행되는 사전 정의된 순서는 무엇입니까?그 중 일부는 런타임에 결정되었습니까? 이 주문은 맞습니까?
FROM clause
WHERE clause
GROUP BY clause
HAVING clause
SELECT clause
ORDER BY clause
MySQL の my my my롭롭롭 my my my 。하고 있습니다.으로 당신이입니다만, 제 에는 그렇게 생각됩니다.HAVING
★★★★★★★★★★★★★★★★★」GROUP BY
에 올 수 SELECT
:
FROM
삭제WHERE
삭제SELECT
삭제GROUP BY
삭제HAVING
삭제ORDER BY
삭제
이는 쿼리가 구문 분석되는 방식을 이해하는 데 중요합니다.할 수 .SELECT
WHERE
"" " " " " " " " " " the " " clauseWHERE
를 SELECT
이런 , 러, 음, 음, 음, 음, 음, 음, 음, 음, 음, 음, 음, 음, 음, 음, 음, 음, 음, 음, 음, 음, 음, 음, 음, the, the, the, the,ORDER BY
절을 클릭합니다.
실제 실행은 옵티마이저에 의해 결정됩니다.예:
. . .
GROUP BY a, b, c
ORDER BY NULL
그리고.
. . .
GROUP BY a, b, c
ORDER BY a, b, c
다 '먹다'의 .ORDER BY
되지 않기 .을 사용법GROUP BY
번째 경우,그는 (어느 때, 어느 때, 어느 때, 어느 때, 어느 때, 어느 때, 어느 때, 어느 때, 라고 하는 입니다.GROUP BY
두 , 그 는 ' 일'만.GROUP BY
을 참조)
이것이 mysql이 선택 쿼리를 실행하는 방법에 대한 대략적인 정보를 얻을 수 있는 방법입니다.
DROP TABLE if exists new_table;
CREATE TABLE `new_table` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`testdecimal` decimal(6,2) DEFAULT NULL,
PRIMARY KEY (`id`));
INSERT INTO `new_table` (`testdecimal`) VALUES ('1234.45');
INSERT INTO `new_table` (`testdecimal`) VALUES ('1234.45');
set @mysqlorder := '';
select @mysqlorder := CONCAT(@mysqlorder," SELECT ") from new_table,(select @mysqlorder := CONCAT(@mysqlorder," FROM ")) tt
JOIN (select @mysqlorder := CONCAT(@mysqlorder," JOIN1 ")) t on ((select @mysqlorder := CONCAT(@mysqlorder," ON1 ")) or rand() < 1)
JOIN (select @mysqlorder := CONCAT(@mysqlorder," JOIN2 ")) t2 on ((select @mysqlorder := CONCAT(@mysqlorder," ON2 ")) or rand() < 1)
where ((select @mysqlorder := CONCAT(@mysqlorder," WHERE ")) or IF(new_table.testdecimal = 1234.45,true,false))
group by (select @mysqlorder := CONCAT(@mysqlorder," GROUPBY ")),id
having (select @mysqlorder := CONCAT(@mysqlorder," HAVING "))
order by (select @mysqlorder := CONCAT(@mysqlorder," ORDERBY "));
select @mysqlorder;
위의 mysql 쿼리의 출력을 다음에 나타냅니다.SELECT 쿼리의 mysql 실행을 알 수 있으면 좋겠습니다.
Join1 JOIN2에서 ON2 On1 Orderby groupby where on2 on1 orderby groupby groupby를 선택합니다.
Logical Query Processing Phase용 Standard SQL의 일반화된 패턴은 다음과 같습니다(적어도 SQL-92부터 - 페이지 177부터 시작).
- from 절
- 결합 테이블
- where 절
- 한 조로 묶다
- 조항이 있다
- 쿼리 사양(즉,선택)
새로운 Standard SQL Standardization 문서를 다음 사이트에서 검색 및 다운로드할 수 있습니다.
MSQL의 경우(내 경험상 표준과 매우 가까운 경향이 있기 때문에) 논리 쿼리 처리 단계는 일반적으로 다음과 같습니다.
- 시작 <left_table>
- ON <join_condition>
- <join_type> JOIN <right_table>
- Where <어디서_condition
- GROUP BY <GROUP_by_list>
- {CUBE | ROLUP} 포함
- <조건>을 가지고 있다
- 선택한다.
- 분명한
- ORDER BY <order_by_list>
- <TOP_specification> <select_list>
- 출처: Ben-Gan, Itzik 등의 제1장, Microsoft SQL Server 2005 내부: T-SQL 쿼리, (Microsoft Press)
- 기타: Ben-Gan, Itzik 등, 트레이닝 키트(시험 70-461) Microsoft SQL Server 2012(MCSA), (Microsoft Press) 문의
MySQL은 필요에 따라 SQL 모드를 설정하여 표준과 비슷하게 동작하도록 구성할 수 있습니다(단, 아마도 프린지 케이스에만 권장됩니다).
MySQL의 경우 MySQL 문서와 MariaDB 문서를 모두 검색했는데, SELECT의 MySQL 문서에 Gordon Linoff가 언급한 몇 가지 문장 외에는 찾을 수 없었습니다.다음과 같은 것이 있습니다.
- ORDER BY가 괄호 안에 있고 외부 쿼리에 적용되는 경우 결과는 정의되지 않으며 향후 MySQL 버전에서 변경될 수 있습니다.
- LIMIT가 괄호 안에 있고 외부 쿼리에 적용되는 경우 결과는 정의되지 않으며 MySQL의 향후 버전에서 변경될 수 있습니다.
- HAVING 절은 항목이 클라이언트에 전송되기 직전에 최적화되지 않은 상태로 거의 마지막에 적용됩니다(LIMIT는 HAVING 후에 적용됩니다).
- MySQL JOIN 문서:외부 조인의 변형을 포함한 자연 조인과 USING과의 조인은 SQL:2003 표준에 따라 처리됩니다.
SQL-92를 "from clause"에서 "query specification"으로 간단히 훑어보면 Logic은 쿼리 작성 방법에 따라 조건부일 수 있다는 것을 알 수 있습니다.또 MySQL 또는 MariaDB 문서(없다고 말하지 않고 MySQL Qu의 다른 문서에서도 찾을 수 없었습니다.ery Processing Phase가 그 순서로 충돌하고 있습니다.MySQL이 특정 쿼리의 논리 쿼리 처리 단계(또는 적어도 쿼리 플랜의 join 최적화에 사용되는 단계)를 결정하기 위해 제공하는 최선의 방법은 (MySQL 문서 "Tracing the Op"에서) 다음 작업을 수행하여 쿼리 실행에 대한 추적을 수행하는 것입니다.타이머/표준 사용":
# Turn tracing on (it's off by default):
SET optimizer_trace="enabled=on";
SELECT ...; # your query here
SELECT * FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;
# possibly more queries...
# When done with tracing, disable it:
SET optimizer_trace="enabled=off";
MySQL 문서의 추적 예제를 보면 결과를 해석할 수 있습니다.
기본적으로는 "join_optimization"(from/join 문이 특정 쿼리에 대해 평가되고 특정 쿼리가 "Select #"로 지정된 쿼리)를 찾은 다음 "condition_processing: condition"을 찾은 다음 "clause_processing: clause"를 찾습니다.General Trace Structure의 MySQL 매뉴얼에 기재되어 있는 바와 같이 다음과 같습니다.
트레이스는 실제 실행 경로를 거의 따릅니다.각 JOIN에는 Join 준비 오브젝트, Join-optimization 오브젝트, Join-Execution 오브젝트가 있습니다.옵티마이저에서 일어나는 모든 것을 보여주는 것은 아니지만, 앞으로 더 많은 정보를 보여줄 예정입니다.
흥미롭게도 MySQL에서 다음과 같은 쿼리를 실행하면 쿼리 최적화를 위한 프로세스 순서는 FROM, WHERE, HAVING, ORDER BY, GROUP BY 순으로 나타납니다.
SELECT
a.id
, max(a.timestamp)
FROM database.table AS a
LEFT JOIN database.table2 AS b on a.id = b.id
WHERE a.id > 1
GROUP BY a.id HAVING max(a.timestamp) > 0
ORDER BY a.id
"condition_processing"과 "clause_processing"은 "Select #" 그룹 내에 있기 때문에 SQL-99와 연계된 SELECT보다 먼저 처리된다고 가정합니다만, 이는 가정입니다.
연산자 및 변수와 관련하여, Zawodny, Jeremy D, 기타 High Performance MySQL, 2nd Edition, (O'Reilly)는 다음과 같이 말합니다.
:= 할당 연산자는 다른 연산자보다 우선 순위가 낮으므로 명시적으로 괄호를 넣도록 주의해야 합니다.
쿼리가 생각대로 실행되지 않을 경우 문제 슈팅에 문제가 될 수 있는 변수(또는 변수)를 사용할 때 할당 연산자의 우선순위만큼 논리 쿼리 처리 단계의 순서가 아닐 수 있기 때문입니다.
실행 순서는 다음과 같습니다.
(7) SELECT
(8) DISTINCT <select_list>
(1) FROM <left_table>
(3) <join_type> JOIN <right_table>
(2) ON <join_condition>
(4) WHERE <where_condition>
(5) GROUP BY <group_by_list>
(6) HAVING <having_condition>
(9) ORDER BY <order_by_condition>
(10) LIMIT <limit_number>[, <offset_number>]
언급URL : https://stackoverflow.com/questions/24127932/mysql-query-clause-execution-order
'source' 카테고리의 다른 글
MySQL의 두 시간 필드와의 차이(분) (0) | 2022.10.20 |
---|---|
최신 브라우저에서 페이지 확대/축소 수준을 감지하려면 어떻게 해야 합니까? (0) | 2022.10.20 |
연결 배열 키 목록을 가져오는 중 (0) | 2022.10.20 |
대규모 어레이를 선언할 때 스택 오버플로 예외가 발생하는 중 (0) | 2022.10.20 |
요소를 다른 요소로 이동하려면 어떻게 해야 합니까? (0) | 2022.10.20 |