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

MySQL nepoužívá indexy s klauzulí WHERE IN?

Viz Jak MySQL používá indexy .

Ověřte také, zda MySQL stále provádí skenování celé tabulky poté, co do user_metrics přidáte dalších asi 2000 řádků stůl. V malých tabulkách je přístup podle indexu ve skutečnosti dražší (z hlediska I/O) než skenování tabulky a optimalizátor MySQL to může vzít v úvahu.

Oproti mému předchozímu příspěvku , ukázalo se, že MySQL také používá nákladově orientovaný optimalizátor , což je velmi dobrá zpráva – tedy za předpokladu, že spustíte ANALYZE alespoň jednou, když se domníváte, že objem dat ve vaší databázi je reprezentativní budoucího každodenního používání.

Při práci s optimalizátory založenými na nákladech (Oracle, Postgres atd.) se musíte ujistit, že pravidelně spouštíte ANALYZE na vašich různých stolech, když se jejich velikost zvětší o více než 10–15 %. (Postgres to ve výchozím nastavení udělá automaticky za vás, zatímco ostatní RDBMS přenechají tuto odpovědnost na DBA, tedy na vás.) Prostřednictvím statistické analýzy ANALYZE pomůže optimalizátoru získat lepší představu o tom, kolik I/O (a dalších souvisejících zdrojů, jako je CPU, potřebných např. pro třídění) bude zahrnuto při výběru mezi různými kandidátskými plány provádění. Selhání spuštění ANALYZE může mít za následek velmi špatná, někdy katastrofální plánovací rozhodnutí (např. milisekundové dotazy trvají někdy hodiny kvůli špatným vnořeným smyčkám na JOIN s.)

Pokud je výkon po spuštění ANALYZE stále neuspokojivý , pak budete obvykle schopni problém obejít pomocí rad, např. FORCE INDEX , zatímco v jiných případech jste mohli narazit na chybu MySQL (např. tato starší , což by vás mohlo kousnout, když jste použili Rails' nested_set ).

Nyní, protože jste v aplikaci Rails , bude to těžkopádné (a maří účel ActiveRecord ) zadávat své vlastní dotazy s radami namísto dalšího používání ActiveRecord -vygenerované.

Zmínil jsem to v naší aplikaci Rails vše SELECT dotazy klesly pod 100 ms po přechodu na Postgres, zatímco některé složité spojení generované ActiveRecord by občas trvalo až 15 s nebo více s MySQL 5.1 kvůli vnořeným smyčkám s vnitřním prohledáváním tabulek, i když byly dostupné indexy. Žádný optimalizátor není dokonalý a měli byste si být vědomi možností. Další potenciální problémy s výkonem, o kterých je třeba vědět, kromě optimalizace plánu dotazů, jsou zamykání. To je však mimo rozsah vašeho problému.



  1. PDO více dotazů

  2. Spojení tabulek s problémem SUM v MYSQL

  3. Oracle:exportujte tabulku s objekty BLOB do souboru .sql, který lze znovu importovat

  4. Vložit do databáze SQLite android