MySQL은 트리거에서 최소 및 제한을 사용하여 쿼리를 최적화합니다.

c0nf1ck

이 mysql 쿼리가 있습니다.

SELECT MIN(v.ifr) FROM (SELECT v.ifr FROM tbl_valuation v WHERE v.stock_id = 1 ORDER BY v.created_at DESC LIMIT 19) as v;

쿼리 설명 :

+----+-------------+------------+------------+------+---------------+------------+---------+-------+------+----------+---------------------------------------+
| id | select_type | table      | partitions | type | possible_keys | key        | key_len | ref   | rows | filtered | Extra                                 |
+----+-------------+------------+------------+------+---------------+------------+---------+-------+------+----------+---------------------------------------+
|  1 | PRIMARY     | <derived2> | NULL       | ALL  | NULL          | NULL       | NULL    | NULL  |   19 |   100.00 | NULL                                  |
|  2 | DERIVED     | v          | NULL       | ref  | idx_stock     | idx_stock  | 9       | const | 2873 |   100.00 | Using index condition; Using filesort |
+----+-------------+------------+------------+------+---------------+------------+---------+-------+------+----------+---------------------------------------+

문제는이 쿼리와 이와 유사한 다른 쿼리가 트리거에 있으므로 삽입하기 전에이 쿼리가 일부 값을 실행하고 업데이트한다는 것입니다. 트리거는 분당 약 천 번 활성화됩니다.

1m 레코드 후에는 mysql이 약 54587 행을 통과하기 때문에 속도가 느려지고 있습니다.

이 쿼리를 최적화하는 방법이 있습니까?

이것이 내 방아쇠입니다.

CREATE TRIGGER BUY_WARNING_TRIG BEFORE INSERT 
ON tbl_valuation
FOR EACH ROW
BEGIN
    DECLARE warn_counter INT DEFAULT 0;
    DECLARE min_ifr DECIMAL(17,12);
    DECLARE min_lgui DECIMAL(17,12);
    DECLARE stock VARCHAR(100);    

    IF New.ls >= New.macd THEN
        SELECT MIN(v.ifr) 
            FROM (SELECT v.ifr FROM tbl_valuation v WHERE v.stock_id = New.stock_id ORDER BY v.created_at DESC LIMIT 9) as v INTO min_ifr;

        IF New.ifr <= min_ifr THEN
            SELECT MIN(v.lgui) 
                FROM (SELECT v.lgui FROM tbl_valuation v WHERE v.stock_id = New.stock_id ORDER BY v.created_at DESC LIMIT 9) as v INTO min_lgui;

            IF New.lgui <= min_lgui THEN
                SET warn_counter = warn_counter + 1;
            END IF;
        END IF;

        SELECT MIN(v.ifr) FROM (SELECT v.ifr FROM tbl_valuation v WHERE v.stock_id = New.stock_id ORDER BY v.created_at DESC LIMIT 4) as v INTO min_ifr;

        IF New.ifr <= min_ifr THEN
            SELECT MIN(v.lgui) 
                    FROM (SELECT v.lgui FROM tbl_valuation v WHERE v.stock_id = New.stock_id ORDER BY v.created_at DESC LIMIT 4) as v INTO min_lgui;

            IF New.lgui <= min_lgui THEN
                SET warn_counter = warn_counter + 1;
            END IF;
        END IF;

        SELECT MIN(v.ifr) FROM (SELECT v.ifr FROM tbl_valuation v WHERE v.stock_id = New.stock_id ORDER BY v.created_at DESC LIMIT 19) as v INTO min_ifr;

        IF New.ifr <= min_ifr THEN
            SELECT MIN(v.lgui) 
                    FROM (SELECT v.lgui FROM tbl_valuation v WHERE v.stock_id = New.stock_id ORDER BY v.created_at DESC LIMIT 19) as v INTO min_lgui;

            IF New.lgui <= min_lgui THEN
                SET warn_counter = warn_counter + 1;
            END IF;
        END IF;
    END IF;

    IF warn_counter > 0 THEN
        SELECT t.stock FROM tbl_stock t WHERE t.id = New.stock_id INTO stock;
        CASE warn_counter
            WHEN 1 THEN INSERT INTO tbl_warning (created_at, stock, level, rate, `type`) VALUES (NOW(), stock, 'LOW', New.rate, 'BUY');
            WHEN 2 THEN INSERT INTO tbl_warning (created_at, stock, level, rate, `type`) VALUES (NOW(), stock, 'MED', New.rate, 'BUY');
            WHEN 3 THEN INSERT INTO tbl_warning (created_at, stock, level, rate, `type`) VALUES (NOW(), stock, 'HIGH', New.rate, 'BUY');
        END CASE;
    END IF;
END$$
태양 플레어

귀하의 질의는 절대적으로 인덱스 요구 tbl_valuation (stock_id, created_at)를 모두 지원합니다 (순서대로) where-condition과를 order by. 이렇게하면 Using filesort.

좀 더 빠르게 만들려면 쿼리에 사용하는 다른 두 개의 열인을 포함하여 tbl_valuation (stock_id, created_at, ifr, lgui)포함 인덱스로 만들어야합니다. 이렇게하면 테이블에서 이러한 값을 조회하는 시간이 절약됩니다 (으로 using index표시됨).

기본적으로 매우 유사한 쿼리를 6 번 실행하고 있기 때문에 트리거 코드 자체를 재구성하거나 다른 방법을 사용하여 최적화 할 수도 있습니다. 하지만 한 가지 빠른 최적화 : lgui및에 대한 쿼리를 결합하여 쿼리 수를 절반으로 줄일 수 있습니다 ifr.

 SELECT min(v.ifr), min(v.lgui) into min_ifr, min_lgui 
 FROM (SELECT v.ifr, v.lgui 
       FROM tbl_valuation v WHERE v.stock_id = new.stock_id 
       ORDER BY v.created_at DESC LIMIT 9) as v

시간이 들지 않으므로 min_lgui다음 단계에서 -value 가 필요하지 않으면 아무런 해를 끼치 지 않지만 필요하면 하나를 저장 select합니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

최대 및 최소를 제한하는 MySQL 쿼리

분류에서Dev

MySQL은 거대한 쿼리를 최적화합니다.

분류에서Dev

MySQL 및 PHP를 사용하여 여러 행에 대한 업데이트 쿼리를 최적화하는 방법

분류에서Dev

PostgreSQL은 CTE를 사용하여 Window 함수를 포함하는 쿼리 성능을 최적화합니다.

분류에서Dev

대규모 데이터 세트 (수백만 행)에 대한 조인 및 하위 쿼리를 사용하여 MySQL 쿼리를 최적화하는 방법

분류에서Dev

MySQL은 where 절에서 하위 쿼리를 최적화합니다.

분류에서Dev

IN 및 MAX (날짜)를 사용하는 MySQL 쿼리 최적화

분류에서Dev

메인 쿼리의 LEFT JOIN과 서브 쿼리의 INNER JOIN을 사용하여 MySQL SELECT 쿼리를 최적화하는 방법은 무엇입니까?

분류에서Dev

하위 쿼리와 조인을 사용하여 쿼리를 최적화하는 방법은 무엇입니까?

분류에서Dev

MySQL 쿼리를 사용하여 테이블에서 최소 시간과 최대 시간을 찾는 방법

분류에서Dev

MySQL은 Explain으로 느린 쿼리를 최적화합니다.

분류에서Dev

하위 쿼리 및 조인 최적화를 사용하여 쿼리

분류에서Dev

Vulkan은 최소한의 리소스를 사용하는 소프트웨어에 적합합니까?

분류에서Dev

WHERE 절에서 and 또는 및 구조를 사용하여 SQL 쿼리 최적화

분류에서Dev

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

분류에서Dev

MySql은 쿼리를 실행하기 전에 분석 / 최적화합니까?

분류에서Dev

테이블 조인을 사용하여이 쿼리를 최적화하는 방법은 무엇입니까?

분류에서Dev

인덱스를 사용하여 mySql 쿼리 성능 최적화

분류에서Dev

Count 및 2 테이블을 사용하는 MYSQL 쿼리 최적화 질문

분류에서Dev

Matlab은 fminsearch를 사용하여 숫자 간격을 최적화합니다.

분류에서Dev

C # 및 Entity Framework-무한 패밀리 트리를 사용하여 자체 참조 엔터티에 대한 DB 쿼리 최적화

분류에서Dev

다음 mysql 쿼리를 최적화하는 방법은 무엇입니까?

분류에서Dev

내부 쿼리를 한 번만 재사용하여 쿼리 최적화

분류에서Dev

프로그램을 최소화 할 때 컴퓨터가 더 적은 리소스를 사용합니까?

분류에서Dev

하위 쿼리를 사용한 SQL 쿼리 최적화

분류에서Dev

mysql 쿼리를 최적화해야합니다.

분류에서Dev

mysql 쿼리를 최적화해야합니다.

분류에서Dev

mysql 선택 쿼리 최적화 및 mysql에서 제한이 작동하는 방식

분류에서Dev

모든 쿼리를 통합하여 파생 테이블을 최적화하는 방법은 무엇입니까?

Related 관련 기사

  1. 1

    최대 및 최소를 제한하는 MySQL 쿼리

  2. 2

    MySQL은 거대한 쿼리를 최적화합니다.

  3. 3

    MySQL 및 PHP를 사용하여 여러 행에 대한 업데이트 쿼리를 최적화하는 방법

  4. 4

    PostgreSQL은 CTE를 사용하여 Window 함수를 포함하는 쿼리 성능을 최적화합니다.

  5. 5

    대규모 데이터 세트 (수백만 행)에 대한 조인 및 하위 쿼리를 사용하여 MySQL 쿼리를 최적화하는 방법

  6. 6

    MySQL은 where 절에서 하위 쿼리를 최적화합니다.

  7. 7

    IN 및 MAX (날짜)를 사용하는 MySQL 쿼리 최적화

  8. 8

    메인 쿼리의 LEFT JOIN과 서브 쿼리의 INNER JOIN을 사용하여 MySQL SELECT 쿼리를 최적화하는 방법은 무엇입니까?

  9. 9

    하위 쿼리와 조인을 사용하여 쿼리를 최적화하는 방법은 무엇입니까?

  10. 10

    MySQL 쿼리를 사용하여 테이블에서 최소 시간과 최대 시간을 찾는 방법

  11. 11

    MySQL은 Explain으로 느린 쿼리를 최적화합니다.

  12. 12

    하위 쿼리 및 조인 최적화를 사용하여 쿼리

  13. 13

    Vulkan은 최소한의 리소스를 사용하는 소프트웨어에 적합합니까?

  14. 14

    WHERE 절에서 and 또는 및 구조를 사용하여 SQL 쿼리 최적화

  15. 15

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

  16. 16

    MySql은 쿼리를 실행하기 전에 분석 / 최적화합니까?

  17. 17

    테이블 조인을 사용하여이 쿼리를 최적화하는 방법은 무엇입니까?

  18. 18

    인덱스를 사용하여 mySql 쿼리 성능 최적화

  19. 19

    Count 및 2 테이블을 사용하는 MYSQL 쿼리 최적화 질문

  20. 20

    Matlab은 fminsearch를 사용하여 숫자 간격을 최적화합니다.

  21. 21

    C # 및 Entity Framework-무한 패밀리 트리를 사용하여 자체 참조 엔터티에 대한 DB 쿼리 최적화

  22. 22

    다음 mysql 쿼리를 최적화하는 방법은 무엇입니까?

  23. 23

    내부 쿼리를 한 번만 재사용하여 쿼리 최적화

  24. 24

    프로그램을 최소화 할 때 컴퓨터가 더 적은 리소스를 사용합니까?

  25. 25

    하위 쿼리를 사용한 SQL 쿼리 최적화

  26. 26

    mysql 쿼리를 최적화해야합니다.

  27. 27

    mysql 쿼리를 최적화해야합니다.

  28. 28

    mysql 선택 쿼리 최적화 및 mysql에서 제한이 작동하는 방식

  29. 29

    모든 쿼리를 통합하여 파생 테이블을 최적화하는 방법은 무엇입니까?

뜨겁다태그

보관