0
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 个表:linkskeywordskeywords_links。将keywords_links关键字与链接联系起来。

我怎样才能使这个查询更有效率?我对 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 ;

关键字链接:

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 ;
4

2 回答 2

0
SELECT DISTINCT
   l.*
FROM
 links l
 INNER JOIN keyworks_links kl ON kl.link_id = l.id
 INNER JOIN keywords ON kl.keyword_id = k.id
WHERE
     k.keyword IN ("facebook", "google", "apple")
;

编辑添加了DISTINCT以删除重复项

于 2013-07-04T01:44:49.763 回答
0

查询本身没问题。性能问题可能是它必须对keywords_links关键字进行全表扫描以匹配关键字,并对关键字进行全表扫描以找到匹配项。

尝试将表结构更改为:

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`),
  INDEX (keyword)
) ;

这将加快关键字匹配(您也可以使用create index)。

接下来,您可以更快地找到链接:

CREATE TABLE IF NOT EXISTS `keywords_links` (
  `keyword_id` int(11) NOT NULL,
  `link_id` int(11) NOT NULL,
   unique (keyword_id, link_id)
);

通过索引查找关键字的匹配项,然后通过索引查找链接的组合应该可以加快查询速度。

于 2013-07-04T02:16:05.063 回答