반응형
내부 조인 및 위치를 사용하여 mysql 최적화
질문이 있습니다.
SELECT DISTINCT h.id,
h.host
FROM pozycje p
INNER JOIN hosty h ON p.host_id = h.id
INNER JOIN keywordy k ON k.id=p.key_id
AND k.bing=0
WHERE h.archive_data_checked IS NULL LIMIT 20
일부 행이 존재할 때는 빠르지만 결과가 존재하지 않을 경우 실행에 2,3 sek가 필요합니다.1초 이내로 하고 싶습니다.다음과 같이 설명합니다.
테이블 포즈제는 30,000,000 행, 호스티는 4,000 행, 키워드는 4,000 행입니다.32GB RAM이 있는 서버, Engine InnoDB
결과가 존재하지 않을 때 쿼리를 스킵하기 위해 할 수 있는 인덱스나 개선 사항은 무엇입니까?
편집:
표 키워드를 표시합니다.
CREATE TABLE `keywordy` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`main_kw` varchar(255) CHARACTER SET utf8 NOT NULL,
`keyword` varchar(255) CHARACTER SET utf8 NOT NULL,
`lang` varchar(10) CHARACTER SET utf8 NOT NULL,
`searches` int(11) NOT NULL,
`cpc` float NOT NULL,
`competition` float NOT NULL,
`currency` varchar(10) CHARACTER SET utf8 NOT NULL,
`data` date DEFAULT NULL,
`adwords` int(11) NOT NULL,
`monitoring` tinyint(1) NOT NULL DEFAULT '0',
`bing` tinyint(1) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
UNIQUE KEY `keyword` (`keyword`,`lang`),
KEY `id_bing` (`id`,`bing`)
) ENGINE=InnoDB AUTO_INCREMENT=38362 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
이것을 테스트 할 수 있습니다.
SELECT DISTINCT h.id,
h.host
FROM hosty h
WHERE
EXISTS ( SELECT 1 FROM keywordy WHERE id=p.key_id AND bing=0)
AND
EXISTS ( SELECT 1 FROM pozycje WHERE host_id = h.id)
AND h.archive_data_checked IS NULL LIMIT 20
저는 먼저 다음과 같은 질문을 하겠습니다.만약 당신이 질문을 한다면 어떤 "집합"이 더 작을 것인가요?
select count(*) from KeyWordy where bing = 0
vs
select count(*) from hosty where archive_date_checked IS NULL
그런 다음 작은 집합을 알고 쿼리를 최적화하여 인덱싱에 대한 주요 기준으로 사용합니다.KeyWordy가 더 작은 집합일 가능성이 있다면, 아래의 인덱스를 가질 수 있도록 테이블을 제공하겠습니다.
table index
keywordy (bing, id) specifically NOT (id, bing) as bing FIRST is optimized for where or JOIN clause
pozycje (key_id, host_id )
hosty (archive_data_checked, id, host)
SELECT DISTINCT
h.id,
h.host
FROM
Keywordy k
JOIN pozycje p
ON k.id = p.key_id
JOIN hosty h
on archive_data_checked IS NULL
AND p.host_id = h.id
WHERE
k.bing = 0
LIMIT
20
archive_data_checked IS NULL을 기준으로 HOSTY 테이블이 더 작아질 경우 다음을 제공합니다.
table index
pozycje (host_id, key_id ) reversed of other option
SELECT DISTINCT
h.id,
h.host
FROM
hosty h
JOIN pozycje p
ON h.id = p.host_id
JOIN Keywordy k
on k.bing = 0
AND p.key_id = k.id
WHERE
h.archive_data_checked IS NULL
LIMIT
20
FINAL 옵션 중 하나는 다음과 같은 키워드 "STRAIGHT_JOIN"을 추가하는 것일 수 있습니다.
select STRAIGHT_JOIN DISTINCT ... rest of query
이 방법이 효과가 있다면 어떤 타이밍 개선을 제공합니까?
언급URL : https://stackoverflow.com/questions/34925908/optimize-mysql-with-inner-joins-and-where
반응형
'programing' 카테고리의 다른 글
HTML5 로컬 스토리지:키가 존재하는지 확인하는 중 (0) | 2023.09.10 |
---|---|
nodejststdin에서 키 입력을 읽는 방법 (0) | 2023.09.10 |
너비가 없는 디브 블록의 중심을 맞춥니다. (0) | 2023.09.10 |
Powershell을 사용하여 관리자로 실행 바로 가기를 만드는 방법 (0) | 2023.09.10 |
문자열에서 단일 문자를 인덱스별로 제거하는 방법 (0) | 2023.09.10 |