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

Proč je tento dotaz INNER JOIN/ORDER BY mysql tak pomalý?

(Předpokládám, že jste chtěli zadat ids.customer_id = customer.customer_id a nikoli customer_ids.customer_id)

Bez ORDER BY mysql popadl prvních 10 id typu 10 (indexováno), vyhledal je u zákazníka a bylo hotovo. (Všimněte si, že LEFT JOIN zde je skutečně INNER JOIN, protože podmínky spojení budou platit pouze pro řádky, které mají shodu v obou tabulkách)

S ORDER BY mysql pravděpodobně načítá vše type=10 zákazníků a poté je seřadí podle křestního jména a najde prvních 10.

Můžete to urychlit buď denormalizací tabulky zákazníků (zkopírujte typ do záznamu zákazníka) nebo vytvořením mapovací tabulky, která bude obsahovat customer_id, name, type n-tice. V obou případech přidejte index na (type, name) . Pokud používáte mapovací tabulku, použijte ji k provedení 3cestného spojení se zákazníky a id.

Pokud je typ=10 přiměřeně běžný, můžete také vynutit, aby dotaz prošel tabulkou zákazníků podle jména a zkontrolovat typ u každého pomocí STRAIGHT JOIN. Nebude to tak rychlé jako složený index, ale bude to rychlejší než stahování všech shod.

A jak je navrženo výše, spusťte EXPLAIN na svůj dotaz, abyste viděli plán dotazů, který mysql používá.



  1. Vyberte náhodné řádky v mysql a limit v každé skupině

  2. PDO s MySQL nefunguje při aktivaci e-mailem

  3. mysqli_num_rows nefunguje správně

  4. Vynutit INSERT pouze prostřednictvím uložené procedury