다음 테이블이 있습니다
id INT UNSIGED PRIMARY KEY
attrib1 INT
attrib2 INT
creationTime TIMESTAMP
그리고 속성에서 매우 정교한 결과를 계산하는 함수가 있습니다. 외부의 값으로 매개 변수화 할 수 있으므로 결과를 다른 속성으로 저장할 수 없습니다. 또한 기능은 결정적이지 않습니다.
MY_FUNC(param1, attrib1, attrib2)
이제 마지막 15 개 행 (타임 스탬프에 따라 정렬 됨)을 가져오고 결과도 가져오고 싶습니다 MY_FUNC
. 나는 시도했다 :
SELECT *, MY_FUNC(2, attrib1, attrib2) FROM myTable ORDER BY creationTime LIMIT 0, 15;
Hovewer,이 쿼리는 매우 오래 실행됩니다 (테이블에> 5000 행이있는 경우> 2s).
나는 해킹을 생각 해냈다.
SELECT *, MY_FUNC(2, attrib1, attrib2) FROM (
SELECT * FROM myTable ORDER BY creationTime LIMIT 0, 15
) AS temp;
작동하고 빠르게 작동합니다 (동일한 테이블에서 0.1 초 미만). 하지만이 솔루션이 마음에 들지 않습니다.
첫 번째 쿼리에서 MySQL은 MY_FUNC
내가 쿼리하는 15 개 레코드뿐만 아니라 모든 레코드에 대해 실행된다고 가정합니다 . 내가 맞아? 함수가 선택한 행에 대해서만 계산되도록 MySQL / 쿼리를 구성하는 방법이 있습니까? 이 결과가 쓸모가 없지만 MySQL이 모두에 대해 계산하는 이유는 무엇입니까?
WHERE
또는 ORDER
절 에서 사용 되었다면 쓸모가 없을 것임을 이해합니다 . 하지만 그렇지 않습니다.
MySQL이 모든 행의 함수를 계산하는 이유는 무엇입니까? 이것이 데이터베이스가 작동하는 방식입니다 (MySQL뿐만 아니라). ORDER BY
절 결과 집합에 적용 후SELECT
, FROM
, WHERE
, GROUP BY
, 및 HAVING
조항이 처리된다. 결과 집합을 만들려면 모든 행에 대해 값을 처리해야합니다. 의 LIMIT
결과에 적용됩니다 ORDER BY
.
원하는 성능을 얻을 수있는 방법을 찾았습니다.
SELECT t.*, MY_FUNC(2, attrib1, attrib2)
FROM (SELECT t.*
FROM myTable t
ORDER BY creationTime
LIMIT 0, 15
) t;
이것은 "해킹"이 아니지만 문제를 해결하기위한 매우 합리적인 접근 방식입니다. MySQL 및 기타 모든 데이터베이스 엔진이이 처리를 수행하는 방식을 변경 한 매개 변수입니다. 그것은 해킹이 될 것입니다.
참고로 색인 myTable(creationTime)
이 없으면이 쿼리의 성능에 도움이됩니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다