Prawdopodobnie każde połączenie wykonuje pełne skanowanie tabeli profiles
. Spróbujmy tego uniknąć. Kiedy dziesiątki zapytań trafiają do tej samej tabeli, pojawiają się blokady, które powodują, że InnoDB „potyka się o siebie”. Każdy z tych planów zarówno przyspieszy zapytanie, jak i zmniejszy liczbę dotkniętych wierszy (a tym samym zmniejszy blokadę). Zastosowanie sugerowanego indeksu „kompozytowego” przyspieszy zapytanie. Ale OR
stanąć na drodze. Widzę dwie sztuczki, aby nadal mieć indeks, spójrz na uniquestring
, ale unikaj niektórych lub wszystkich OR
.
( (prfls.uniquestring like 'phk5600dcc%')
or (prfls.uniquestring like 'phk5600dcf%')
)
OR
trudno zoptymalizować.
Dodaj to:
INDEX(isconnected, isprofilepresent, uniquestring)
Następnie...
Plan A:
prfls.uniquestring like 'phk5600dc%' AND -- note common prefix
( (prfls.uniquestring like 'phk5600dcc%')
or (prfls.uniquestring like 'phk5600dcf%')
)
Zakłada to, że możesz skonstruować ten wspólny przedrostek.
Plan B (obróć OR
w 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
Plan A (jeśli jest praktyczny) wykorzystuje to, co wydaje się być wspólną wartością początkową. Plan B działa niezależnie, ale prawdopodobnie jest nieco wolniejszy, chociaż nadal znacznie szybszy niż oryginał.
Inne uwagi...
Indeksy na flagach (z których masz dwie) prawie nigdy nie są używane. EXPLAIN SELECT ...
prawdopodobnie pokaże, że żaden z nich nie został użyty. Proszę podać EXPLAIN
dla dowolnego SELECT
to wymaga dyskusji.
UNIQUE KEY
to KEY
, więc nie ma potrzeby stosowania nadmiarowego indeksu na USERID
.
limit 450
-- Które 450 chcesz? Bez ORDER BY
, zapytanie może dać Ci dowolne 450. (Oczywiście, może to w porządku.) (I ORDER BY
prawdopodobnie spowolniłoby zapytanie.)
Moje sugestie nie „rozwiążą” problemu, ale powinny zwiększyć liczbę połączeń, zanim spowolnienie stanie się zauważalne.