programing

내부 조인 및 위치를 사용하여 mysql 최적화

cafebook 2023. 9. 10. 12:38
반응형

내부 조인 및 위치를 사용하여 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초 이내로 하고 싶습니다.다음과 같이 설명합니다.

http://tinyurl.com/gogx42n

테이블 포즈제는 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

반응형