Mysql
 sql >> Baza danych >  >> RDS >> Mysql

60 milionów wpisów, wybierz wpisy z określonego miesiąca. Jak zoptymalizować bazę danych?

Aby szybciej uzyskać wpisy w danym miesiącu, w danym roku - będziesz trzeba zindeksować time kolumna :

CREATE INDEX idx_time ON ENTRIES(time) USING BTREE;

Dodatkowo użyj:

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

...ponieważ BETWEEN jest inkluzywne, więc wraz z opublikowanym zapytaniem otrzymasz wszystko z datą „2010-05-01 00:00:00”.

Chciałbym również wybrać dane z określonego miesiąca z danego DataSourceID

Możesz dodać osobny indeks dla kolumny Datasourceid:

CREATE INDEX idx_time ON ENTRIES(datasourceid) USING BTREE;

...lub ustaw indeks pokrywający, aby zawierał obie kolumny:

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

Indeks pokrywający wymaga, aby w zapytaniu zostały użyte kolumny znajdujące się najbardziej po lewej stronie, aby indeks został użyty. W tym przykładzie, mając time pierwszy zadziała w obu sytuacjach, o których wspomniałeś — datasourceid nie musi być używany, aby indeks był użyteczny. Ale musisz przetestować swoje zapytania, wyświetlając dane wyjściowe EXPLAIN, aby naprawdę wiedzieć, co najlepiej sprawdza się w przypadku Twoich danych i zapytań wykonywanych na tych danych.

To powiedziawszy, indeksy spowolnią instrukcje INSERT, UPDATE i DELETE. A indeks nie zapewnia dużej wartości, jeśli dane w kolumnie mają kilka odrębnych wartości - IE:kolumna logiczna to zły wybór do indeksowania, ponieważ kardynalność jest niska.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Łączysz się z bazą danych z rozszerzenia Chrome?

  2. 1114 (HY000):Stół jest pełny

  3. Jak obliczyć procentowy wzrost z tygodnia na tydzień w MySQL?

  4. localhost vs. 127.0.0.1 w mysql_connect()

  5. Odpowiednik varchar(max) w MySQL?