1 천만 개가 넘는 레코드가 포함 된 큰 테이블이 있으며 계속 커질 것입니다. 지난 24 시간의 레코드에 대한 집계 쿼리 (특정 값의 개수)를 수행하고 있습니다. 이 쿼리에 걸리는 시간은 테이블의 레코드 수에 따라 계속 증가합니다.쿼리 성능을 위해 별도로 레코드의 하위 집합을 보관하십시오. mysql
이 24 시간 레코드를 별도의 테이블에 보관하고 해당 테이블에서 집계를 수행하는 데 걸리는 시간을 제한 할 수 있습니다. mysql은 이러한 종류의 시나리오를 처리하는 기능을 제공합니까?
표 스키마 및 쿼리 참조 :
CREATE TABLE purchases (
Id int(11) NOT NULL AUTO_INCREMENT,
ProductId int(11) NOT NULL,
CustomerId int(11) NOT NULL,
PurchaseDateTime datetime(3) NOT NULL,
PRIMARY KEY (Id),
KEY ix_purchases_PurchaseDateTime (PurchaseDateTime) USING BTREE,
KEY ix_purchases_ProductId (ProductId) USING BTREE,
KEY ix_purchases_CustomerId (CustomerId) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
select COALESCE(sum(ProductId = v_ProductId), 0),
COALESCE(sum(CustomerId = v_CustomerId), 0)
into v_ProductCount, v_CustomerCount
from purchases
where PurchaseDateTime > NOW() - INTERVAL 1 DAY
and ( ProductId = v_ProductId
or CustomerId = v_CustomerId);
답변을 받았지만 질문을 다시 읽은 후 일부 형식의 파티션이 엄격한 테이블 기반 솔루션을 제공 할 수 있습니다. 내 머리 꼭대기에서 성능 상 영향이 있을지 모르겠으므로 어떤 대안에 대해서도 벤치마킹이 필요합니다. 자세한 안내는이 답변을 참조하십시오. https://stackoverflow.com/questions/12200359/how-to-partition-mysql-table-by-day –