prosource

보기에 대한 쿼리를 빠르게 수행할 수 있도록 보기를 캐시하는 방법이 있습니까?

probook 2023. 9. 5. 20:37
반응형

보기에 대한 쿼리를 빠르게 수행할 수 있도록 보기를 캐시하는 방법이 있습니까?

저는 Views에 매우 익숙하지 않기 때문에 만약 이것이 어리석은 질문이라면 용서해 주십시오. 하지만 저는 꽤 다루기 힘든 쿼리를 최적화하는 데 도움이 되는 View를 가지고 있으며 View의 작은 열 부분 집합에 대해 선택할 수 있습니다.보기를 선택하는 데 시간이 오래 걸리지 않도록 보기가 실제로 어딘가에 저장되기를 희망했습니다.

내가 잘못 알고 있을지도 모르지만, 나는 (속도로부터) 감각을 얻습니다.create view내 View에 대해 쿼리를 실행하는 동안) 외부 쿼리에 대해 선택할 때마다 외부 쿼리 전에 실제로 View가 쿼리로 실행됩니다.

CREATE VIEW를 실행할 때 보기 쿼리를 쿼리하는 어려운 작업을 수행할 수 있는 메커니즘을 간과하고 있기를 진심으로 바랍니다. 그러면 이 정적 보기에 대한 다음 선택이 매우 신속하게 이루어질 수 있습니다.

그나저나, 이 뷰는 뷰가 생성될 당시 존재했던 데이터의 스냅샷이며, 뷰 생성 후 삽입/업데이트된 새로운 정보를 반영하지 않는다는 것은 전적으로 이해합니다.그게 바로 제가 필요로 하는 것입니다.

TIA

당신이 원하는 것은 당신의 견해를 구체화하는 것입니다.http://www.fromdual.com/mysql-materialized-views 을 보세요.

당신이 말하는 것은 (적어도) DB2의 기능인 구체화된 뷰에 대한 것이지만 제가 아는 한 MySQL은 아닙니다.

테이블을 주기적으로 만들거나 주문형으로 작성하여 에뮬레이트하는 방법이 있지만, 실제 구체화된 보기는 기본 데이터가 언제 변경되었는지 알고 필요한 경우에만 다시 계산합니다.

뷰가 생성된 후(댓글에 표시된 것처럼) 데이터가 변경되지 않으면 데이터의 하위 집합을 보관할 새 테이블을 만들고 이를 쿼리합니다.사람들은 항상 느린 속도에 대해 불평하지만 데이터 스토리지 요구 사항에 대해서는 거의 불평하지 않습니다:-)

다음을 사용하여 이 작업을 수행할 수 있습니다.

여기 실제 사례가 있습니다.

-- create dummy data for testing
CREATE TABLE MyTable (
 id INT NOT NULL,
 groupvar INT NOT NULL,
 myvar INT
);
INSERT INTO MyTable VALUES
(1,1,1),
(2,1,1),
(3,2,1);

-- create the view, making sure rows have a unique identifier (groupvar)
CREATE VIEW MyView AS
SELECT groupvar, SUM(myvar) as myvar_sum
FROM MyTable
GROUP BY groupvar;

-- create cache table, setting primary key to unique identifier (groupvar)
CREATE TABLE MyView_Cache (PRIMARY KEY (groupvar))
SELECT *
FROM MyView;

-- create a table to keep track of when the cache has been updated (optional)
CREATE TABLE MyView_Cache_updated (update_id INT NOT NULL AUTO_INCREMENT, PRIMARY KEY (update_id));

-- create event to update cache table (e.g., daily)
DELIMITER |
CREATE EVENT MyView_Cache_Event
    ON SCHEDULE EVERY 1 DAY STARTS CURRENT_TIMESTAMP + INTERVAL 1 HOUR
    DO
      BEGIN 

      REPLACE INTO MyView_Cache
      SELECT *
      FROM MyView_Cache;
      
      INSERT INTO MyView_Cache_updated
      SELECT NULL, NOW() AS last_updated;

      END |
DELIMITER ;

이제 MyView_Cache를 쿼리하여 응답 시간을 단축하고 MyView_Cache_update를 쿼리하여 캐시가 마지막으로 업데이트된 시간(이 예에서는 매일)을 사용자에게 알릴 수 있습니다.

으로 뷰는기으로이기 에.SELECT쿼리 캐시를 사용하여 성능을 향상시킬 수 있는 문입니다.

그러나 먼저 다음 사항을 확인해야 합니다.

  • 수 .EXPLAIN)
  • 데이터가 자주 변경되지 않습니다. 보기를 구체화할 수 있습니다(스냅샷 만들기).

구체화된 보기를 사용합니다.카운트 합계 등의 데이터를 저장할 수 있지만 테이블을 업데이트한 후에는 보기를 새로 고쳐야 합니다. 자동으로 업데이트되지 않기 때문에 정확한 결과를 얻을 수 있습니다.또한 뷰에서 쿼리한 후 결과가 캐시에 저장되므로 테이블 자체에서 쿼리한 경우 메모리 주기가 4인 2로 줄어듭니다.그래서 두 번째부터는 효율적이 됩니다.보기에서 처음 쿼리할 때 데이터는 기본 메모리에서 가져와 캐시에 저장됩니다.

언급URL : https://stackoverflow.com/questions/16687736/is-there-a-way-to-cache-a-view-so-that-queries-against-it-are-quick

반응형