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

Jak optimalizovat tento dotaz MySQL? Miliony řádků

Vytvořil bych následující indexy (indexy b-stromu):

analytics(user_id, source, id) 
transactions(analytics, status)

To se liší od Gordonova návrhu.

Pořadí sloupců v indexu je důležité.

Filtrujete podle konkrétního analytics.user_id , takže toto pole musí být první v indexu. Poté seskupíte podle analytics.source . Chcete-li se vyhnout řazení podle source toto by mělo být další pole indexu. Také odkazujete na analytics.id , takže je lepší mít toto pole jako součást indexu, dejte ho jako poslední. Dokáže MySQL číst pouze index a nedotýkat se tabulky? Nevím, ale je to docela snadné otestovat.

Index na transactions musí začít analytics , protože by byl použit v JOIN . Potřebujeme také status .

SELECT 
    analytics.source AS referrer, 
    COUNT(analytics.id) AS frequency, 
    SUM(IF(transactions.status = 'COMPLETED', 1, 0)) AS sales
FROM analytics
LEFT JOIN transactions ON analytics.id = transactions.analytics
WHERE analytics.user_id = 52094 
GROUP BY analytics.source 
ORDER BY frequency DESC 
LIMIT 10 


  1. Oprava „SQL Server zablokoval přístup k STATEMENT ‚OpenRowset/OpenDatasource‘ komponenty ‚Ad Hoc Distributed Queries‘

  2. Náhodně odebraná postgres výchozí oprávnění superuživatele - mohu je získat zpět?

  3. MariaDB DATABASE() Vysvětleno

  4. Míchání ANSI 1992 JOINs a COMMAs v dotazu