sql >> Base de Datos >  >> RDS >> Mysql

MySQL:seleccione la ejecución de consultas y el tiempo de obtención de resultados aumenta con el número de conexiones

Probablemente cada conexión esté haciendo un escaneo completo de la tabla de profiles . Intentemos evitar eso. Cuando hay docenas de consultas que llegan a la misma tabla, hay bloqueos que hacen que InnoDB "tropiece". Cualquiera de estos planes acelerará la consulta y disminuirá la cantidad de filas tocadas (por lo tanto, disminuirá el bloqueo). El uso del índice "compuesto" sugerido acelerará la consulta. Pero el OR se interpone en el camino. Veo dos trucos para seguir teniendo una mirada de índice en uniquestring , pero evite algunos o todos los OR .

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

OR es difícil de optimizar.

Añade esto:

INDEX(isconnected, isprofilepresent, uniquestring)

Entonces...

Plan A:

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

Esto supone que puede construir ese prefijo común.

Plan B (gire OR en 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

El plan A (si es práctico) aprovecha lo que parece ser un valor inicial común. El Plan B funciona de todos modos, pero probablemente sea un poco más lento, aunque sigue siendo mucho más rápido que el original.

Otras notas...

Los índices en banderas (de los cuales tiene dos) casi nunca se usan. EXPLAIN SELECT ... probablemente mostrará que ninguno fue utilizado. Proporcione el EXPLAIN para cualquier SELECT eso necesita discusión.

UNA UNIQUE KEY es una KEY , por lo que no es necesario el índice redundante en USERID .

limit 450 -- ¿Qué 450 quieres? Sin un ORDER BY , la consulta puede proporcionarle cualquiera 450. (Por supuesto, tal vez eso esté bien.) (Y ORDER BY probablemente ralentizaría la consulta).

Mis sugerencias no "solucionarán" el problema, pero deberían aumentar el número de conexiones antes de que la ralentización sea notoria.