1

少し改善しようとしている長いmysqlクエリがあります。基本的に、さまざまなニュース ソースからスクレイピングされた見出しを取得し、データベース内のテレビ番組と照合します。ヘッドライン テーブル「ゲーム オブ スローンズ リニューアル」は、番組テーブルの「ゲーム オブ スローンズ」と一致する必要があります。

現在、35 秒で実行されます (あまり良くない; 遅い):

 SELECT
    news_feed.title,
    shows.name,
    shows.id,
    news_feed.news_id,
    news_feed.created_on
  FROM news_feed
  JOIN shows ON news_feed.title
     RLIKE CONCAT(
         '(^|[[:blank:][:punct:]])', shows.name, '($|[[:blank:][:punct:]])'
     )

見たところ、見るべきnews_feed.titleの数を伝えることで改善できました。「」のようなものを追加ORDER by news_id DESC LIMIT 50して、の前に実行するにはどうすればよいRLIKE CONCATですか?

これを実行するだけで、許容できる時間実行できると思いますか? (1日に5回実行されるため、サーバー全体がクラッシュしない限り、それほど大きな問題ではありません)

4

1 に答える 1

4

比較する行数を制限するサブクエリを作成します。

SELECT
    sq.title,
    shows.name,
    shows.id,
    sq.news_id,
    sq.created_on
FROM (

    SELECT
        news_feed.title,
        news_feed.news_id,
        news_feed.created_on
    FROM
       news_feed
    ORDER BY  news_id DESC LIMIT 50

) AS sq
JOIN shows ON sq.title
     RLIKE CONCAT('(^|[[:blank:][:punct:]])', shows.name, '($|[[:blank:][:punct:]])')
于 2013-09-02T12:12:39.147 に答える