sql >> Databáze >  >> RDS >> Mysql

MySQL:Vyberte provedení dotazu a doba načítání výsledků se zvyšuje s počtem připojení

Pravděpodobně každé připojení provádí úplnou kontrolu tabulky profiles . Zkusme se tomu vyhnout. Když se na stejnou tabulku dostanou desítky dotazů, existují zámky, které způsobí, že InnoDB „zakopne sám o sebe“. Každý z těchto plánů urychlí dotaz a sníží počet dotčených řádků (tedy sníží zamykání). Použití navrhovaného „složeného“ indexu urychlí dotaz. Ale OR stojí v cestě. Vidím dva triky, jak mít stále přehled o uniquestring , ale vyhněte se některým nebo všem OR .

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

OR je těžké optimalizovat.

Přidejte toto:

INDEX(isconnected, isprofilepresent, uniquestring)

Pak...

Plán A:

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

To předpokládá, že dokážete vytvořit tuto společnou předponu.

Plán B (otočte OR do 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

Plán A (je-li praktický) využívá toho, co se zdá být běžnou výchozí hodnotou. Plán B funguje bez ohledu na to, ale je pravděpodobně trochu pomalejší, i když stále mnohem rychlejší než originál.

Další poznámky...

Indexy na vlajkách (které máte dva) se téměř nepoužívají. EXPLAIN SELECT ... pravděpodobně ukáže, že ani jedno nebylo použito. Zadejte prosím EXPLAIN pro jakýkoli SELECT to vyžaduje diskusi.

UNIQUE KEY je KEY , takže není potřeba redundantní index na USERID .

limit 450 -- Kterých 450 chcete? Bez ORDER BY , dotaz vám může poskytnout jakékoli 450. (Samozřejmě, možná je to v pořádku.) (A ORDER BY by pravděpodobně zpomalilo dotaz.)

Moje návrhy problém „nevyřeší“, ale měly by zvýšit počet připojení, než bude zpomalení patrné.




  1. MySQL Odstranění duplicitních sloupců na levém spojení, 3 tabulky

  2. Řešení pro fulltextové vyhledávání MySQL pro tabulky innoDB

  3. Počet na základě podmínky v SQL Server

  4. Problém s kódováním PHP/ODBC