sql >> データベース >  >> RDS >> Mysql

MySQLでサブクエリをキャッシュ/再利用する

    EXPLAIN EXTENDEDをご覧ください 言う。

    DEPENDENT SUBQUERYと表示されている場合 またはUNCACHEABLE SUBQUERY 、使用するたびに再評価されます。

    これは、サブクエリがセッション変数を使用する場合、または相関サブクエリである場合に発生します。

    そうでない場合は、おそらくキャッシュされます。

    ケースがキャッシュされない場合は、各UNIONで再評価されます。 'edset。

    ただし、サブクエリは複雑すぎるようです。使ってみませんか:

    SELECT id
    FROM   playlist_program_map ppm, programs p
    WHERE  ppm.playlist_id = 181
           AND p.id = ppm.program_id
           AND submitter_id = 32
           AND feed_id = 2478
    

    playlist_program_map (playlist_id)にインデックスがある場合 、このクエリは魅力のように機能するはずです。

    もう2つ教えてください:

    1. playlist_program_mapには行がいくつありますか DISTINCT playlist_idの数 値はありますか?
      • programsには行がいくつありますか DISTINCT submitter_id, feed_idの数 ペアはありますか?

    あなたのコメントから、 10があると結論付けることができます programs playlistごと 平均して、 200 programs (submitter, feed)ごと ペア。これは、playlist_program_mapのインデックスを意味します (submitter, feed)のものよりも選択的です 、およびplaylist_program_map 参加をリードする必要があります。

    10 に参加する必要があることを考えると、あなたの場合の全文索引もあまり選択的ではないようです。 2,000,000のプログラム 。

    次のことを試してみてください:

    SELECT object_id, programs.created AS created
    FROM   playlist_program_map ppm, programs p, comments_programs cp
    WHERE  ppm.playlist_id = 181
           AND p.id = ppm.program_id
           AND p.submitter_id = 32
           AND p.feed_id = 2478
           AND cp.object_id = p.id
           AND cp.text REGEXP 'excellent'
    

    、3つのテーブルすべてに対してこれを繰り返します。



    1. データベースから最も人気のある場所を選択するアルゴリズム

    2. .patch_storage

    3. テーブル名が可変であるMySQLから選択する方法

    4. MySQLNonTransientConnectionExceptionデータベースサーバーへの接続を作成できませんでした。原因:java.lang.NullPointerException