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

これは、キーワードに一致するリンクを返します。linkskeywords、およびの3 つのテーブルがありkeywords_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 に答える