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

Mysql uložené funkce a skupinově min

Není zaručeno, že skupinové maximum bude fungovat. Ve skutečnosti to MariaDB rozbila, ale poskytla nastavení, jak to získat zpět. Mám na mysli toto:

SELECT  *
    FROM  
      ( SELECT  ...  ORDER BY ... )
    GROUP BY ...

kde chcete první (nebo poslední) v každé skupině z vnitřního dotazu. Problém je v tom, že SQL může tento záměr volně optimalizovat.

Skupinový maximální kód v dokumentech je strašně neefektivní.

Pro urychlení dotazu pravděpodobně pomůže izolovat Rules nebo Places část klauzule WHERE a udělejte z toho poddotaz, který vrátí pouze PRIMARY KEY odpovídající tabulky. Pak to vložte do JOIN se všemi stoly (včetně JOIN zpět ke stejnému stolu). Pro tento poddotaz již máte "krycí index", takže to může být "Using index" (v žargonu používaném EXPLAIN).

Je innodb_buffer_pool_size nastaveno na přibližně 70 % dostupné paměti RAM?

BIGINT zabere 8 bajtů; pravděpodobně byste mohli žít s MEDIUMINT UNSIGNED (0..16M). Menší --> více cacheable --> méně I/O --> rychlejší.

Dvojice DOUBLE pro zeměpisnou šířku/délku zabírá 16 bajtů. Pár FLOAT by zabral 8 bajtů a měl rozlišení 6 stop / 2 m. Nebo DECIMAL(6,4) pro zeměpisnou šířku a (7,4) pro zeměpisnou délku pro 7 bajtů a rozlišení 52 stop / 16 m. Dost dobré pro „obchody“, zvláště když pro vzdálenost používáte „čtverec“ místo „kruhu“.

Kód pro "najít nejbližší ..." je těžké optimalizovat. Zde je to nejlepší, na co jsem přišel:http://mysql.rjweb.org/doc .php/latlng




  1. MySQL - rozložit/rozdělit vstup do uložené procedury

  2. Výstup výsledků dotazu SQLite jako příkaz INSERT

  3. MySQL odstraňuje duplicitní záznamy

  4. MYSQL Left Join Jak mohu vybrat hodnoty NULL?