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

MySQL:クエリ実行を選択すると、接続数に応じて結果のフェッチ時間が長くなります

    おそらく、各接続はプロファイルの全表スキャンを実行しています 。それを避けてみましょう。同じテーブルにヒットするクエリが数十ある場合、InnoDBが「それ自体につまずく」原因となるロックがあります。これらのプランのいずれかにより、クエリが高速化され、タッチされる行数が減少します(したがって、ロックが減少します)。提案された「複合」インデックスを使用すると、クエリが高速化されます。ただし、 OR 邪魔になります。 uniquestringをインデックスで確認するための2つのトリックがあります。 、ただし、 ORの一部またはすべてを避けてください 。

    (      (prfls.uniquestring like 'phk5600dcc%')
       or  (prfls.uniquestring like 'phk5600dcf%')
    )
    

    または 最適化するのは難しいです。

    これを追加:

    INDEX(isconnected, isprofilepresent, uniquestring)
    

    次に...

    プランA:

    prfls.uniquestring         like 'phk5600dc%' AND  -- note common prefix
    (      (prfls.uniquestring like 'phk5600dcc%')
       or  (prfls.uniquestring like 'phk5600dcf%')
    )
    

    これは、その共通のプレフィックスを作成できることを前提としています。

    プランB(またはを回す UNIONに ):

    ( SELECT ...
        WHERE prfls.uniquestring like 'phk5600dcc%' AND ...
        LIMIT 450 )
    UNION ALL    -- ? You may want DISTINCT, if there could be dups
    ( SELECT ...
        WHERE prfls.uniquestring like 'phk5600dcf%' AND ...  -- the only diff
        LIMIT 450 )
    LIMIT 450   -- yes, again
    

    プランA(実用的な場合)は、と思われるを利用します。 共通の開始値になります。プランBは関係なく機能しますが、元のプランよりもはるかに高速ですが、おそらく少し遅くなります。

    その他の注意事項...

    フラグのインデックス(2つあります)はほとんど使用されません。 EXPLAIN SELECT ... おそらくどちらも使用されなかったことを示します。 EXPLAINを入力してください SELECTの場合 話し合いが必要です。

    UNIQUE KEY KEYです 、したがって、 USERIDに冗長なインデックスは必要ありません 。

    制限450 -どの450が欲しいですか? ORDER BYなし 、クエリはあなたに任意のを与えることができます 450.(もちろん、おそらくそれで問題ありません。)(そして ORDER BY おそらくクエリの速度が低下します。)

    私の提案では問題を「解決」することはできませんが、速度の低下が目立つようになる前に接続数を増やす必要があります。




    1. より高速なSQLビューを作成するために知っておく必要のあるトップ3のヒント

    2. JSON_MODIFY()SQL Server(T-SQL)の例

    3. SQLServerメタデータの破損の問題を修正するための可能な方法

    4. Laravel5データベースの問題