Provavelmente cada conexão está fazendo uma varredura completa da tabela de
profiles . Vamos tentar evitar isso. Quando há dezenas de consultas atingindo a mesma tabela, há bloqueios que fazem com que o InnoDB "tropece em si mesmo". Qualquer um desses planos acelerará a consulta e diminuirá o número de linhas tocadas (portanto, diminuirá o bloqueio). O uso do índice "composto" sugerido irá acelerar a consulta. Mas o OR fica no caminho. Eu vejo dois truques para ainda ter uma visão de índice em uniquestring , mas evite alguns ou todos os OR . ( (prfls.uniquestring like 'phk5600dcc%')
or (prfls.uniquestring like 'phk5600dcf%')
)
OR é difícil de otimizar. Adicione isso:
INDEX(isconnected, isprofilepresent, uniquestring)
Então...
Plano A:
prfls.uniquestring like 'phk5600dc%' AND -- note common prefix
( (prfls.uniquestring like 'phk5600dcc%')
or (prfls.uniquestring like 'phk5600dcf%')
)
Isso pressupõe que você possa construir esse prefixo comum.
Plano B (vire
OR em 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
O Plano A (se prático) aproveita o que parece para ser um valor inicial comum. O Plano B funciona independentemente, mas provavelmente é um pouco mais lento, embora ainda muito mais rápido que o original.
Outras notas...
Índices em sinalizadores (dos quais você tem dois) quase nunca são usados.
EXPLAIN SELECT ... provavelmente mostrará que nenhum dos dois foi usado. Forneça o EXPLAIN para qualquer SELECT que precisa de discussão. Uma
UNIQUE KEY é uma KEY , portanto, não há necessidade do índice redundante em USERID . limit 450 -- Qual 450 você quer? Sem um ORDER BY , a consulta pode fornecer qualquer 450. (Claro, talvez isso seja bom.) (E ORDER BY provavelmente retardaria a consulta.) Minhas sugestões não "resolverão" o problema, mas devem aumentar o número de conexões antes que a desaceleração se torne perceptível.