SELECT links.*
FROM links
INNER JOIN (
SELECT keywords_links.link_id
FROM keywords_links
INNER JOIN keywords ON keywords_links.keyword_id = keywords.id
WHERE keywords.keyword
IN ("facebook", "google", "apple")
GROUP BY keywords_links.link_id
) t
ON links.id = t.link_id
키워드와 일치하는 링크를 반환합니다. 나는 3 개의 테이블을 가지고있다 : links
, keywords
, 그리고 keywords_links
. keywords_links
은 링크와 키워드를 연결합니다.MySQL 쿼리가 느립니다.
어떻게이 쿼리를보다 효율적으로 만들 수 있습니까? 나는 MySQL에 익숙하지 않았기 때문에 기본 MySQL 명령을 사용하여이 쿼리를 작성해야했습니다. (에만 관련 정보가 표시)
테이블 :
링크 :
CREATE TABLE IF NOT EXISTS `links` (
`id` int(11) NOT NULL auto_increment,
PRIMARY KEY (`id`),
UNIQUE KEY `url` (`url`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=337789 ;
keywords_links :
CREATE TABLE IF NOT EXISTS `keywords_links` (
`keyword_id` int(11) NOT NULL,
`link_id` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
키워드 :
CREATE TABLE IF NOT EXISTS `keywords` (
`id` int(11) NOT NULL auto_increment,
`keyword` varchar(100) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `sort` (`id`,`keyword`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=60363 ;
왜 여기에 'GROUP BY'가 필요한가요? – zerkms
1.'EXPLAIN'을 보여줍니다. 2. 모든 테이블에 대해'CREATE TABLE'을 보여줍니다. – zerkms
'ON'과'WHERE' 절에 사용 된 모든 열에 인덱스가 있는지 확인하십시오. – Barmar