1

十分に最適化されていないと思うSQLクエリがあります。時間を計ったところ、完了するまでに1.5秒かかることがありますが、少し高いようですよね。

とにかくこれはクエリです:

SELECT id, link, feed, category, description, title, GROUP_CONCAT( tag ) as t, published
            FROM items
            LEFT JOIN tags ON items.id = tags.item_id
            WHERE id NOT IN (
                SELECT item_id
                FROM tags, sinunim
                WHERE tag = name
                AND op = '1'
                AND user = '$user_cookie'
            ) AND id NOT IN (
                SELECT id
                FROM sinunim
                WHERE id <> 0
                AND user = '$user_cookie'
            ) AND id NOT IN (
                SELECT i.id
                FROM  sinunim s, items i
                WHERE s.type =  'category'
                AND s.name = i.category
                AND s.op = '1'
                AND s.user = '$user_cookie'
            ) AND id NOT IN (
                SELECT i.id
                FROM  `sinunim` s, items i
                WHERE s.name = i.feed
                AND s.op = '1'
                AND s.user = '$user_cookie'
            )
            GROUP BY items.title
            ORDER BY items.published DESC
            LIMIT 0 , 50
4

3 に答える 3

2

NOT IN4つのサブクエリを1つのサブクエリとして書き直すことができます。グループ化するitems.titleため、すべてのサブクエリを削除して、代わりに結合を使用することもできます。

そうすれば、参加するものはすべて1回だけ参加し、1つの大きな論理式にグループ化することで、さまざまな比較を再作成できます(x = y AND y = z) OR (k = l AND m = n)

于 2012-08-16T12:41:20.017 に答える
1

クエリを最も効果的に最適化するには、期間が最も長いクエリを特定することから始める必要があります。これは、SQLプロファイラーを使用して行うことができます。次に、クエリを分析して、クエリがどこで時間を費やしているか、およびクエリを改善できるかどうかを判断します。SQLクエリアナライザを使用して、クエリの動作を分析できます。

全体的な最適化プロセスは、2つの主要なステップで構成されています。

1)実行時間の長いクエリを分離します。

2)長時間実行されるクエリの原因を特定します。

ステップ1

  • SQL Profilerを使用して、実行時間の長いクエリを分離できます。

ステップ2

  • SETステートメントの使用。
  • SQLクエリアナライザオプションの使用。

SQLクエリアナライザを使用するには

SQLクエリアナライザは、クエリ実行プランをテキストモードまたはグラフィカルモードで表示します。

1)SQL Query Analyzerを起動し、サーバーに接続して、作業しているデータベースを選択します。

2)クエリをSQLクエリアナライザウィンドウに貼り付けます。

3)SQL Profilerを使用してクエリをトレースしている場合は、クエリテキストをトレースウィンドウからコピーして、SQLクエリアナライザ内で使用できます。

4) [クエリ]メニューで、[推定実行プランの表示]をクリックします。クエリの推定実行プランが表示されます。クエリウィンドウに複数のクエリが含まれている場合は、クエリごとに実行プランが表示されます。

5) [クエリ]メニューの[実行プランの表示]をクリックし、クエリウィンドウでクエリを実行します。実行プランとクエリ結果がウィンドウの別々のペインに表示されるので、一緒に表示できます。

これがお役に立てば幸いです。

よろしく、

ニコラス

于 2012-08-16T14:06:46.357 に答える
0

where条件で4つのNotInクエリを最小化しようとしました。これがうまくいくかわかりますか?

SELECT id, link, feed, category, description, title, GROUP_CONCAT( tag ) as t, published
            FROM items
            LEFT JOIN tags ON items.id = tags.item_id
            WHERE id NOT IN (
                SELECT case 
                        when ( tag = name AND op = '1' ) then item_id
                        when id <> 0 then id
                       END   
                FROM tags, sinunim
                WHERE user = '$user_cookie'
            )
            AND id NOT IN (
                SELECT i.id
                FROM  sinunim s, items i
                WHERE ( (s.type =  'category'
                AND s.name = i.category) OR s.name = i.feed)  
                AND s.op = '1' 
                AND s.user = '$user_cookie'
            ) 
            GROUP BY items.title
            ORDER BY items.published DESC
            LIMIT 0 , 50
于 2012-08-16T12:58:32.443 に答える