1

こんにちは、mysql クエリを最適化する方法を探しています。基本的には、category_id = 25 に属するユーザーの記事を取得しています。source_id は、ユーザーが購読を解除したソース ID を格納するテーブルにはありません。

select
  a.article_id,
  a.article_title,
  a.source_id,
  a.article_publish_date,
  a.article_details,
  n.source_name
from sources n
  INNER JOIN articles a
    ON (a.source_id = n.source_id)
WHERE n.category_id = 25
    AND n.source_id NOT IN(select
                 source_id
               from news_sources_deselected
               WHERE user_id = 5)
ORDER BY a.article_publish_date DESC

Articles テーブルのスキーマ

CREATE TABLE IF NOT EXISTS `articles` (<br>
  `article_id` int(255) NOT NULL auto_increment,<br>
  `article_title` varchar(255) NOT NULL,<br>
  `source_id` int(255) NOT NULL,<br>
  `article_publish_date` bigint(255) NOT NULL,<br>
  `article_details` text NOT NULL,<br>
  PRIMARY KEY  (`article_id`),<br>
  KEY `source_id` (`source_id`),<br>
  KEY `article_publish_date` (`article_publish_date`)<br>
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COMMENT='Contains articles.';

ソーステーブルの構造

CREATE TABLE IF NOT EXISTS `sources` (<br>
  `source_id` int(255) NOT NULL auto_increment,<br>
  `category_id` int(255) NOT NULL,<br>
  `source_name` varchar(255) character set latin1 NOT NULL,<br>
  `user_id` int(255) NOT NULL,<br>
  PRIMARY KEY  (`source_id`),<br>
  KEY `category_id` (`category_id`),<br>
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COMMENT='News Sources.'

article テーブルには約 30 万件のレコードがあり、sources テーブルには約 1000 件のレコードが含まれており、クエリの実行には約 180 秒かかります。

どんな助けでも大歓迎です。

ここに画像の説明を入力

4

5 に答える 5

1

IS NULL 条件で派生クエリを使用してみてください。依存サブクエリがあると説明しています。それを使用することを無視し、問題に対して派生クエリを使用してください。これにより、パフォーマンスが向上します

select
  a.article_id,
  a.article_title,
  a.source_id,
  a.article_publish_date,
  a.article_details,
  n.source_name
from sources n
  INNER JOIN articles a
    ON (a.source_id = n.source_id)
  LEFT JOIN (SELECT *
         FROM news_sources_deselected
         WHERE user_id = 5) AS nsd
    ON nsd.source_id = n.source_id
WHERE n.category_id = 25
    AND nsd.source_id IS NULL
ORDER BY a.article_publish_date DESC
于 2013-04-10T09:16:46.650 に答える
0

テーブルを分割することで問題を修正しましたが、まだ提案を受け付けています。

于 2013-04-17T05:37:43.393 に答える
0

クエリの前に EXPLAIN を使用し、結果を分析します。

ここでは、最適化作業を開始する方法を見つけることができます。

于 2013-04-10T08:51:56.790 に答える
0

確認できる問題がいくつかあります。

  • InnoDB エンジンを使用しているにもかかわらず、リレーションを使用していません。
  • インデックスのないフィールドを選択しています。
  • 一度にすべての行を選択しています。

一度にすべての行が必要ですか? このクエリを複数のシャード (ページング) に分割することを検討してください。

于 2013-04-10T09:03:55.493 に答える