Mysql
 sql >> Baza danych >  >> RDS >> Mysql

MySQL:Wybierz wykonanie zapytania i czas pobierania wyników wzrasta wraz z liczbą połączeń

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.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Użyj JDBC/Mysql Connector w intellij idea

  2. Jak GROUP BY DESC wybiera swoją kolejność?

  3. Czy MySQL powinien mieć swoją strefę czasową ustawioną na UTC?

  4. Kursor procedury składowanej MySQL dla przygotowanych instrukcji

  5. Kod błędu:1062. Zduplikowany wpis „1” dla klucza „PRIMARY”