가 나는 2 (유사) 쿼리가/가능한 쿼리 문제 : Product 테이블이 비어있을 때 처음 실행에느린 MySQL의 쿼리
-- Query #1 - get all new products not in currently in the Product table
-- Should match any products in the temp table that do not exist in the Product table
INSERT
INTO `tmpProductState` (`ProductId`, `ChangedOn`, `State`)
SELECT t.`ProductId`, t.`ProcessedOn`, \'Activated\'
FROM `tmpImport` t
LEFT JOIN `Product` p USING (`ProductId`)
WHERE p.`ProductId` IS NULL
ON DUPLICATE KEY UPDATE
`State` = VALUES(`State`)
-- Query #2 - get all Products that are removed from the Product table
-- Should match any products in the Product table that do not exist in the temp table
INSERT
INTO `tmpProductState` (`ProductId`, `ChangedOn`, `State`)
SELECT p.`ProductId`, p.`LastSeenDate`, \'Deactivated\'
FROM `Product` p
LEFT JOIN `tmpImport` t USING (`ProductId`)
WHERE t.`ProductId` IS NULL
ON DUPLICATE KEY UPDATE
`State` = VALUES(`State`)
(1 일)를, 두 쿼리 1 초 이내에 실행, 그러나 , 제품 테이블이 14000 개 기록이있는 경우 두 번째 실행, (2 일)에 첫 번째 쿼리는 2 초 미만에서 실행하고, 두 번째 쿼리 244 초 단위로 실행됩니다. 각각의 연속적인 데이터 가져 오기는 두 번째 쿼리가 너무 오래 걸리는 이유를 난 그냥 알아낼 수 없습니다 모든 데이터가 올 것 같다 데이터베이스를 확인에 쿼리 # 2의 동일 (240~250초이다.
--- > 편집 : 느린 쿼리 로그 :이 시점에서 내가 가장 우려 무엇
# Query_time: 245.328784 Lock_time: 0.000000 Rows_sent: 0 Rows_examined: 187711973
SET timestamp=1305151558;
INSERT
INTO `tmpProductState` (`ProductId`, `ChangedOn`, `State`)
SELECT p.`ProductId`, p.`LastSeenDate`, 'Deactivated'
FROM `Product` p
LEFT JOIN `tmpImport` t USING (`ProductId`)
WHERE t.`ProductId` IS NULL
ON DUPLICATE KEY UPDATE
`State` = VALUES(`State`);
: Rows_examined : 187711973 제품 테이블 크기가 ~ 14000 개 기록, 가져 오기 테이블 크기 (? 정확히 어떻게이 많은 행이 있는지 검사한다) ~ 28000 레코드이고 tmpProductState는 최대 60 레코드입니다.
---> 다른 편집 :
참여EXPLAIN SELECT p.`ProductId` , p.`LastSeenDate` , 'Deactivated'
FROM `Product` p
LEFT JOIN `tmpImport` t
USING (`ProductId`)
WHERE t.`ProductId` IS NULL
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE p ALL NULL NULL NULL NULL 14151
1 SIMPLE t index NULL PRIMARY 100 NULL 28166 Using where; Using index; Not exists
테이블 :
CREATE TABLE IF NOT EXISTS `tmpImport` (
`CategoryId` smallint(5) unsigned NOT NULL,
`ProcessedOn` date DEFAULT NULL,
`ProductId` varchar(32) NOT NULL,
`Title` varchar(255) DEFAULT NULL,
`Description` text,
`ActivateDate` date DEFAULT NULL,
PRIMARY KEY (`CategoryId`,`ProductId`)
) ENGINE=MyISAM DEFAULT CHARSET = UTF8
CREATE TABLE IF NOT EXISTS `tmpProductState` (
`ProductId` VARCHAR(32) NOT NULL,
`ChangedOn` DATE NOT NULL,
`State` ENUM(\'Activated\',\'Deactivated\'),
PRIMARY KEY(`ProductId`,`ChangedOn`)
) ENGINE = Memory
CREATE TABLE `Product` (
`ProductId` varchar(32) NOT NULL,
`Title` varchar(255) DEFAULT NULL,
`Description` text,
`ActivateDate` date DEFAULT NULL,
`LastSeenDate` date DEFAULT NULL,
PRIMARY KEY (`ProductId`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8
나는 (데이터를 다른 테이블로 복사하는) 왜 이런 식으로 쿼리를 실행하는지 이해하지 못했습니다.어쩌면 테이블의 구조가 당신이 필요로하는 것을 할 수있는 더 좋은 방법을 찾는데 도움이 될 수도 있음 – redShadow
테이블 구조에 대한 세부 사항 ('SHOW CREATE TABLES')과'EXPLAIN SELECT ... '의 출력을 쿼리의 'SELECT'부분. –
@ JamesC 임시 (세션 특정) 테이블에서 설명 부분을 수행하는 방법을 알고있는 경우이를 수행 할 수 있습니다. –