1

実行速度が非常に遅い次のクエリがあります(ほぼ50000レコード)

SELECT
  news.id,
  news.title,
  DATE_FORMAT(news.date_online,'%d %m %Y')AS newsNL_Date
  news_categories.parent_id
FROM 
  news,
  news_categories
WHERE 
  DATE(news.date_online)=2013-02-25 
  AND news.category_id = news_categories.id
  AND news.date_online < NOW()
  AND news.activated ='t' 
ORDER BY 
  news.date_online DESC

MySQLクライアントバージョン5.0.96を使用しています

このクエリを使用してEXPLAINEXTENDED呼び出しを実行すると、次の結果になります。

idselect_typeテーブルタイプpossible_keyskeykey_len ref rows Extra
1シンプルなニュースrefcategory_id、date_online、アクティブ化アクティブ化1const43072使用場所; filesortの使用
1 SIMPLE news_categories eq_ref PRIMARY、id PRIMARY 4 news_category_id 1      

次の列にインデックスがありますnews_id(主キー)date_onlineアクティブ化されたcategory_id

EXPLAIN EXTENDEDの結果を見ると、USING_WHEREが表示されます。FILESORTの使用。どちらも悪いことは知っていますが、これを修正する方法がわかりません。

4

4 に答える 4

1

他の価値のある提案に加えて、DATE(news.date_online)=2013-02-25があります。これにより、MySQLはnews.date_onlineをテーブルのすべての行に対して異なる形式に変換するように強制されるように見えます。これにより、インデックスの有用性が失われます。

おそらくそれをnews.date_onlineBETWEEN'2013-02-2500:00:00'と'2013-02-2523:59:59'に変更します。これにより、date_onlineのインデックスを使用できるようになります。

于 2013-03-13T12:00:26.407 に答える
1

date_online(タイプBツリー)のインデックスを追加してみてください。また、近いところでNOW()を使用するのではなく、変数に設定して、代わりに変数を使用するようにします。

idフィールドはキーであるため、すでにインデックスが作成されていると思います。

于 2013-03-13T11:16:58.733 に答える
1

LEFT JOINを使用して、違いを確認してください

SELECT
  news.id,
  news.title,
  DATE_FORMAT(news.date_online,'%d %m %Y')AS newsNL_Date
  news_categories.parent_id
FROM 
  news
LEFT JOIN news_categories ON news_categories.id = news.category_id
WHERE 
  DATE(news.date_online)= '2013-02-25'
  AND DATE(news.date_online) < DATE(NOW())
  AND news.activated ='t' 
ORDER BY 
  news.date_online DESC
于 2013-03-13T11:37:19.483 に答える
-1

クエリは特定の日のデータを取得しているため、この場合はそのAND news.date_online < NOW()部分を省略できます(クエリオプティマイザがこれを行う可能性があります)。

他の場合、を指定せずにすべてのアクティブなニュースが必要な場合date_onlineは、NOW()も削除する必要があります。問題は、実行ごとに異なる部分(NOW())が含まれているため、クエリをデータベースにキャッシュできないことです。そこに計算された定数を提供することによってこれを行うことができます。比較時に分単位を省略した場合、最大でキャッシュできます。60秒。

次に、使用している列の複数列のインデックスを作成する必要があります。これは、ほとんどすべてのクエリで使用されているcategory_iddate_online思います。activatedこれにより、挿入が少し遅くなりますが、見た目(ニュースアプリケーション)からは、挿入よりもはるかに多くの読み取りが行われます。

于 2013-03-13T11:45:52.530 に答える