날짜 범위 검색을 통해 여러 테이블을 조인하는 쿼리를 실행하고이를 더 최적화하는 방법을 찾으려 고 노력했습니다. 'mysql - 잘못된 인덱스로 인해 filesort가 발생하지 않습니다 ..?
| keyword_spent | CREATE TABLE `keyword_spent` (
`id` bigint(20) NOT NULL auto_increment,
`summary_date` date NOT NULL,
`adgroup_id` bigint(20) NOT NULL,
`keyword_id` bigint(20) NOT NULL,
`billed_clicks` int(11) default NULL,
`un_billed_clicks` int(11) default NULL,
`spent` decimal(20,5) default NULL,
`last_click_recno` bigint(20) default NULL,
`campaign_id` bigint(20) NOT NULL,
`account_id` bigint(20) NOT NULL,
`total_convs` bigint(20) unsigned default '0',
PRIMARY KEY (`id`),
UNIQUE KEY `keyword_spent_uniq` (`summary_date`,`adgroup_id`,`keyword_id`),
KEY `idx_account_id` (`account_id`),
KEY `idx_kw_id` (`keyword_id`),
KEY `adgroup_id` (`adgroup_id`),
KEY `campaign_id` (`campaign_id`),
KEY `summary_date` (`summary_date`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
내가 돈 그것을
+----+-------------+-------+--------+----------------------------+--------------+---------+---------------------------------+--------+----------------------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+--------+----------------------------+--------------+---------+---------------------------------+--------+----------------------------------------------+
| 1 | SIMPLE | SPENT | range | summary_date | summary_date | 3 | NULL | 752191 | Using where; Using temporary; Using filesort |
| 1 | SIMPLE | KW | eq_ref | PRIMARY,FK1948D0E6ED3A5544 | PRIMARY | 8 | clicksummarydb.SPENT.keyword_id | 1 | |
| 1 | SIMPLE | ADG | eq_ref | PRIMARY,FKBBC2083C29112FD0 | PRIMARY | 8 | advertisedb.KW.adgroup_id | 1 | |
| 1 | SIMPLE | CAMP | eq_ref | PRIMARY,FKF7A90110246F33C4 | PRIMARY | 8 | advertisedb.ADG.campaign_id | 1 | |
| 1 | SIMPLE | ACC | eq_ref | PRIMARY | PRIMARY | 8 | advertisedb.CAMP.account_id | 1 | |
+----+-------------+-------+--------+----------------------------+--------------+---------+---------------------------------+--------+----------------------------------------------+
keyword_spent 테이블이 여기에 150 만 명 이상의 행을 포함하고 쇼가 생성되는 테이블 -
SELECT ACC.name AS account_name, CAMP.account_id AS account_id,CAMP.name AS campaign_name,CAMP.id AS campaign_id,ADG.id AS adgroup_id,ADG.name AS adgroup_name,KW.text AS keyword_name,
SUM(SPENT.billed_clicks) AS billed_clicks,KW.id AS keyword_id,KW.status_id AS status_id FROM account ACC, campaign CAMP,adgroup ADG,adgroup_keyword KW INNER JOIN keyword_spent SPENT
ON KW.id = SPENT.keyword_id WHERE summary_date >= '2012-03-01' AND summary_date <= '2012-03-04' AND KW.adgroup_id = ADG.id AND ADG.campaign_id = CAMP.id AND CAMP.account_id = ACC.id
GROUP BY keyword_id
은이에 EXPLAIN은 다음을 산출한다 해당 날짜 범위에 100,000 개가 넘는 레코드가 없을 때 75 만 개의 행을 스캔하는 이유를 이해합니다.
또한 인덱스를 사용하는 대신 파일 포트를 사용하는 이유는 무엇입니까? ?
먼저 할 일은 A, B, C 항목을 제거하고 내부 조인을 사용하는 것입니다. 각 항목에 대해 where 절이 summary_date에 있습니다. –
@ 토니 : 동의합니다. 나는 comma 스타일 join sytnax를 사용하는 것보다'JOIN ... ON' 구문을 선호한다. BTW ... summary_date에 대한 술어는 JOIN의 ON 절에 쉽게 포함될 수 있고 WHERE 절에있을 필요가 없으며 WHERE 절이 전혀 필요하지 않습니다. – spencer7593
두 제안에 따라 쿼리를 다시 정렬합니다. 그냥 궁금해서 청소기를 찾는 것 외에도 퍼프 부스트를 향상시킬 수 있습니까? –