>source

MySQL DB에 대해 .net 서비스에서 select SQL 쿼리를 실행해야합니다. 쿼리는 완료하는 데 약 1 초가 걸리며 실행마다 다른 날짜로 36 회 연속으로 실행되어야합니다.

각 실행마다 날짜가 변경되는 쿼리의 간단한 예 :

SELECT * FROM person where date < "some date"

쿼리를 실행하기위한 옵션과 최상의 옵션 성능이 무엇인지 알고 싶습니다. DB에 대해 36 회 실행해야합니까? 저장 프로 시저를 사용하고 다른 날짜를 반복합니까? 다른 옵션이 있습니까?

실행 횟수를 줄 이도록 쿼리를 변경할 수있는 옵션이 없으므로 36 회 실행해야하며 각 옵션에 대해 실행 가능한 옵션, 장단점을 찾으려고 노력하고 있습니다.

편집 :

쿼리 예제를보다 명확하게 만들려고합니다.

쿼리는 여러 select 문으로 구성되며 각 select 문은 계산합니다. 금액 합계 또는 발생 횟수 계산 등. 각 쿼리는 쿼리에 전달 된 날짜에 따라 다릅니다. 36 가지 기간 동안 계산 결과가 필요합니다.

아래 예제는 원래 쿼리가 아니라 일반적인 아이디어를 보여주기 위해 테이블 ​​이름 등이 약간 변경된 일부 쿼리입니다.

현재 MYSQL DB에 대해 .Net 서버에서 쿼리를 36 회 실행하고 있습니다. 이것이 최선의 방법은 아니라고 생각합니다. 쿼리를 저장 프로 시저로 이동하고 각 쿼리마다 DB를 호출하는 대신 루프에서 동일한 쿼리를 36 번 실행하는 것을 고려할 수 있습니다. 다른 매개 변수를 사용하여 동일한 쿼리를 실행하는 문제를 여러 번 해결하는 것이 더 좋은 아이디어인지 알고 싶습니다.

예 :

SET @id = 11111;
SET @calculations_date = "2019-05-05";
SET @calculations_date_minus_1_year = DATE_SUB(@calculations_date, INTERVAL 1 YEAR);
SELECT customers.id,
IFNULL( (SELECT COUNT(DISTINCT id) FROM customer_data WHERE id = @id AND customer_data.date >= DATE_SUB(@calculations_date, INTERVAL 2 YEAR) AND customer_data.date <= @calculations_date) , 0) as customers_in_last_24_months,
IFNULL( (SELECT SUM(amount) FROM other_customer_data WHERE id = @id AND date <= @calculations_date_minus_1_year), 0) AS total_other_customer_data_until_12_months_before_date,
IFNULL( (SELECT SUM(amount) FROM other_customer_data2 WHERE id = @id AND date <= @calculations_date_minus_1_year), 0) AS total_other_customer_data2_until_12_months_before_date,
IFNULL( (SELECT SUM(amount) FROM other_customer_data3 WHERE id = @id AND date <= @calculations_date_minus_1_year), 0) AS total_other_customer_data3_until_12_months_before_date,
FROM customers
WHERE customers.id = @id;

감사합니다!


  • 답변 # 1

    자, 선택문 성능을 개선하기위한 첫 번째 슬픔 반응은 테이블에 인덱스를 도입하는 것입니다 (귀하의 경우 날짜 열). 빠르고 쉬운 단점 : 더 많은 디스크 공간 필요 (인덱스 및 테이블 크기에 따라 다름)

    내 생각에 오는 또 다른 옵션은 전체 테이블을 메모리에로드하고 거기에서 필터링을 수행하는 것입니다. RAM이 부족할 수 있기 때문에 확실히 빠르지 만 특히 큰 테이블의 경우에는 종종 실행되지 않습니다.

    쿼리를 다시 작성할 수있는 방법이 있다면 한 번에 36 명을 모두 선택하고 싶을 수도 있지만 "쿼리를 변경할 수있는 옵션이 없습니다"라는 말이 있습니다. 창문?

    구체화 된 견해를 가지고 실험 해 볼 수도 있지만, MySql에 대해서는 너무 이해하지 못합니다.

    시작점으로 사용할 수있는 몇 가지 옵션을 제공 할 수 있기를 바랍니다.)

  • 답변 # 2

    "일부 날짜"이전에 백만 개의 행이 있으면 시간이 오래 걸립니다 실행하면 클라이언트가 데이터 양을 질식시킵니다. 그래서 나는 이것이 현실적인 쿼리가 아니라고 주장합니다.

    반면,

    SELECT * FROM person where date < "some date"
        ORDER BY date  LIMIT 10
    
    

    는 최대 10 행만 반환합니다. INDEX(date) 가 있다면 그러면 쿼리 성능이 매우 빠르고 거의 일정합니다. 나는1 초가 아니라밀리 초를 기대할 것이다.

    이 속도로 360 명의 사용자가 "동시에"쿼리를 할 수 있습니다.

    또는하나연결이 36 SELECTs 를 수행한다는 의미입니까? . 이 경우 정보가 겹치는 것 같습니다.

    오버 헤드는 간단한 쿼리의 중요한 부분입니다. 아마도 우리는 36 개의 쿼리를 하나로 만들 수 있을까요?

    또한 테이블의 모든 열이 필요합니까? 전송의 부피를 줄이기 위해 불필요한 열을 남겨 두십시오.

  • 답변 # 3

    서버 측에서 쿼리를 동적으로 만들고 각 섹션 사이에 UNION ALL을 포함시켜 DB에 여러 번 액세스하지 않도록 결정했습니다.

관련 자료

  • 이전 typescript - Webpack은 번들에 전체 rxjs를 추가합니다
  • 다음 javascript - href 태그를 사용하여 이미지를 직접 다운로드