おそらく、各接続はプロファイル
の全表スキャンを実行しています 。それを避けてみましょう。同じテーブルにヒットするクエリが数十ある場合、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
おそらくクエリの速度が低下します。)
私の提案では問題を「解決」することはできませんが、速度の低下が目立つようになる前に接続数を増やす必要があります。