LIMIT에도 불구하고 사용자 정의 함수를 사용하는 MySQL 매우 느린 쿼리

프란 트

다음 테이블이 있습니다

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] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

GROUP BY를 사용하는 MySQL의 매우 느린 하위 쿼리

분류에서Dev

EF를 사용하여 합계를 사용하는 느린 mysql 쿼리

분류에서Dev

PHP를 사용하면 MYSQL 쿼리가 매우 느리지 만 phpMyAdmin 및 명령 줄에서는 빠름

분류에서Dev

InnoDB 테이블을 사용하여 느린 MySQL UPDATE 쿼리 속도를 높이는 방법

분류에서Dev

인덱스에도 불구하고 postgresql geonames db의 느린 쿼리

분류에서Dev

Postgres를 사용하는 varchar 열에서 구별 / 그룹 별 느린 쿼리

분류에서Dev

Postgres를 사용하는 varchar 열에서 구별 / 그룹 별 느린 쿼리

분류에서Dev

자바 9 HttpClient를 예외를 URL 쿼리 매개 변수에서 특정 문자를 사용하는 경우

분류에서Dev

MySQL 쿼리에서 사용자 지정 ORDER BY를 정의하는 방법

분류에서Dev

Eloquent를 사용할 때 매우 느린 쿼리 whereNotIn

분류에서Dev

느린 MySQL 쿼리, 인덱스를 사용하지 않고 거대한 테이블에 조인

분류에서Dev

긴 MySql 쿼리에 대해 그룹 함수를 잘못 사용하는 경우

분류에서Dev

쿼리에 사용자 지정 함수를 사용하는 방법

분류에서Dev

CursorAdpter를 사용하는 매우 느린 ListView

분류에서Dev

Regex를 사용하는 AWS Cloudwatch Log Insights 쿼리는 MySql 느린 쿼리 로그에 대한 열을 추출하지 않습니다.

분류에서Dev

IN 대신 INNER JOIN을 사용하더라도 MySQL 쿼리는 매우 느립니다.

분류에서Dev

MySQL 100 % CPU + 느린 쿼리-인덱스를 제대로 사용하지 않음

분류에서Dev

SELECT 하위 쿼리를 사용한 UPDATE는 MySQL 5.7에서 매우 느리게 실행되지만 5.5에서는 문제가 없습니다.

분류에서Dev

내부 쿼리를 사용하는 mysql의 Sum 함수

분류에서Dev

오류 libmysqlclient를 통해 MySQL의 쿼리에서 사용자 정의 변수를 사용하여

분류에서Dev

쿼리 자체의 정보를 사용하는 MySQL 동적 쿼리

분류에서Dev

Hibernate Criteria 쿼리에서 MySQL 함수를 사용하는 방법

분류에서Dev

vsprintf를 사용하는 쿼리 도우미의 MySQL 동적 문자열 크기 (C ++)

분류에서Dev

Order By를 사용할 때 MySQL 쿼리가 매우 느려짐

분류에서Dev

변수 쿼리 연산자를 사용하는 MySQL 함수

분류에서Dev

MySQL 느린 하위 쿼리, JOIN을 사용해야합니까?

분류에서Dev

EXPLAIN 출력을 사용하여 느린 MySQL 쿼리 최적화

분류에서Dev

xampp에서 매우 느린 PHP를 사용하여 파일 업로드

분류에서Dev

ALTER USER WITH PASSWORD 쿼리를 성공적으로 실행 했음에도 불구하고 사용자 postgres의 암호를 설정할 수 없습니다.

Related 관련 기사

  1. 1

    GROUP BY를 사용하는 MySQL의 매우 느린 하위 쿼리

  2. 2

    EF를 사용하여 합계를 사용하는 느린 mysql 쿼리

  3. 3

    PHP를 사용하면 MYSQL 쿼리가 매우 느리지 만 phpMyAdmin 및 명령 줄에서는 빠름

  4. 4

    InnoDB 테이블을 사용하여 느린 MySQL UPDATE 쿼리 속도를 높이는 방법

  5. 5

    인덱스에도 불구하고 postgresql geonames db의 느린 쿼리

  6. 6

    Postgres를 사용하는 varchar 열에서 구별 / 그룹 별 느린 쿼리

  7. 7

    Postgres를 사용하는 varchar 열에서 구별 / 그룹 별 느린 쿼리

  8. 8

    자바 9 HttpClient를 예외를 URL 쿼리 매개 변수에서 특정 문자를 사용하는 경우

  9. 9

    MySQL 쿼리에서 사용자 지정 ORDER BY를 정의하는 방법

  10. 10

    Eloquent를 사용할 때 매우 느린 쿼리 whereNotIn

  11. 11

    느린 MySQL 쿼리, 인덱스를 사용하지 않고 거대한 테이블에 조인

  12. 12

    긴 MySql 쿼리에 대해 그룹 함수를 잘못 사용하는 경우

  13. 13

    쿼리에 사용자 지정 함수를 사용하는 방법

  14. 14

    CursorAdpter를 사용하는 매우 느린 ListView

  15. 15

    Regex를 사용하는 AWS Cloudwatch Log Insights 쿼리는 MySql 느린 쿼리 로그에 대한 열을 추출하지 않습니다.

  16. 16

    IN 대신 INNER JOIN을 사용하더라도 MySQL 쿼리는 매우 느립니다.

  17. 17

    MySQL 100 % CPU + 느린 쿼리-인덱스를 제대로 사용하지 않음

  18. 18

    SELECT 하위 쿼리를 사용한 UPDATE는 MySQL 5.7에서 매우 느리게 실행되지만 5.5에서는 문제가 없습니다.

  19. 19

    내부 쿼리를 사용하는 mysql의 Sum 함수

  20. 20

    오류 libmysqlclient를 통해 MySQL의 쿼리에서 사용자 정의 변수를 사용하여

  21. 21

    쿼리 자체의 정보를 사용하는 MySQL 동적 쿼리

  22. 22

    Hibernate Criteria 쿼리에서 MySQL 함수를 사용하는 방법

  23. 23

    vsprintf를 사용하는 쿼리 도우미의 MySQL 동적 문자열 크기 (C ++)

  24. 24

    Order By를 사용할 때 MySQL 쿼리가 매우 느려짐

  25. 25

    변수 쿼리 연산자를 사용하는 MySQL 함수

  26. 26

    MySQL 느린 하위 쿼리, JOIN을 사용해야합니까?

  27. 27

    EXPLAIN 출력을 사용하여 느린 MySQL 쿼리 최적화

  28. 28

    xampp에서 매우 느린 PHP를 사용하여 파일 업로드

  29. 29

    ALTER USER WITH PASSWORD 쿼리를 성공적으로 실행 했음에도 불구하고 사용자 postgres의 암호를 설정할 수 없습니다.

뜨겁다태그

보관