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

60 milionů záznamů, vyberte záznamy z určitého měsíce. Jak optimalizovat databázi?

Chcete-li získat záznamy v konkrétním měsíci, pro konkrétní rok, rychleji – budete potřebujete indexovat time sloupec :

CREATE INDEX idx_time ON ENTRIES(time) USING BTREE;

Dále použijte:

SELECT e.* 
  FROM ENTRIES e
 WHERE e.time BETWEEN '2010-04-01' AND DATE_SUB('2010-05-01' INTERVAL 1 SECOND)

...protože BETWEEN je zahrnut, takže s dotazem, který jste zveřejnili, byste dostali cokoliv s datem "2010-05-01 00:00:00".

Rád bych také vybral data z určitého měsíce z daného DataSourceID

Můžete buď přidat samostatný index pro sloupec datasourceid:

CREATE INDEX idx_time ON ENTRIES(datasourceid) USING BTREE;

...nebo nastavte krycí index tak, aby zahrnoval oba sloupce:

CREATE INDEX idx_time ON ENTRIES(time, datasourceid) USING BTREE;

Krycí index vyžaduje, aby byly v dotazu použity sloupce zcela vlevo, aby byl index použit. V tomto příkladu s time první bude fungovat pro obě situace, které jste zmínili - datasourceid nemusí být použito, aby byl index užitečný. Musíte však své dotazy otestovat zobrazením výstupu EXPLAIN, abyste skutečně věděli, co pro vaše data a dotazy prováděné na tato data funguje nejlépe.

To znamená, že indexy zpomalí příkazy INSERT, UPDATE a DELETE. A index neposkytuje velkou hodnotu, pokud data ve sloupci mají málo odlišných hodnot - IE:booleovský sloupec je špatnou volbou pro indexování, protože mohutnost je nízká.



  1. Jak vyberete každý n-tý řádek z mysql

  2. Jak upgradovat PostgreSQL 11 na PostgreSQL 12 s nulovým výpadkem

  3. Jaká je ekvivalentní syntaxe PostgreSQL se syntaxí Oracle CONNECT BY ... START WITH?

  4. Připojení Oracle k SQL Serveru z Windows